diff --git a/.all-contributorsrc b/.all-contributorsrc deleted file mode 100644 index f129ad3..0000000 --- a/.all-contributorsrc +++ /dev/null @@ -1,39 +0,0 @@ -{ - "projectName": "boundless-contract", - "projectOwner": "0xdevcollins", - "repoType": "github", - "repoHost": "https://github.com", - "files": [ - "CONTRIBUTORS.md" - ], - "imageSize": 100, - "commit": true, - "commitConvention": "none", - "contributors": [ - { - "login": "0xdevcollins", - "name": "Collins Ikechukwu", - "avatar_url": "https://github.com/0xdevcollins.png", - "profile": "https://github.com/0xdevcollins", - "contributions": [ - "code", - "doc", - "maintenance", - "projectManagement" - ] - } - ], - "contributorsPerLine": 7, - "skipCi": true, - "contributorsSortAlphabetically": false, - "badgeTemplate": "[![All Contributors](https://img.shields.io/github/all-contributors/<%= projectOwner %>/<%= projectName %>?color=ee8449&style=flat-square)](#contributors)", - "contributorTemplate": "\">\" width=\"<%= options.imageSize %>px;\" alt=\"\"/>
<%= contributor.name %>
", - "types": { - "custom": { - "symbol": "๐Ÿ”ญ", - "description": "A custom contribution type.", - "link": "[<%= symbol %>](<%= url %> \"<%= description %>\")" - } - }, - "linkToUsage": true -} diff --git a/.env.deploy.example b/.env.deploy.example index f3b5148..aa9adc6 100644 --- a/.env.deploy.example +++ b/.env.deploy.example @@ -1,21 +1,16 @@ -# Deployment configuration for the Boundless contracts. -# Copy to .env.deploy before running scripts/deploy/deploy.sh. +# Deployment configuration for scripts/deploy/deploy.sh (testnet, futurenet). +# Copy to .env.deploy before running it. # # .env.deploy is gitignored (see .gitignore). NEVER commit a populated file. -# Stellar CLI identity that owns the admin authority on both contracts. +# Stellar CLI identity that deploys both contracts and holds admin on them. # Create with: stellar keys generate --network testnet --fund ADMIN_IDENTITY=boundless-admin -# G-address that receives the platform fee on every deposit. -# In production this should be a multi-sig account with the platform's -# operational threshold; testnet can be a single-key account. +# G-address that receives the platform fee on every deposit. It needs an +# authorized trustline for every token you register. FEE_ACCOUNT= -# Platform fee in basis points (100 = 1%, 250 = 2.5%, etc.). Range 0..1000. -# Contract caps at 1000 (10%) per audit L4 (2026-06 Stellar-skill audit). +# Platform fee in basis points (100 = 1%, 250 = 2.5%). Range 0..1000; the +# contract caps fees at 1000 (10%). FEE_BPS=250 - -# Contract 1.0.0 also required BOOTSTRAP_CREDITS here. The 1.1.0 -# credit-removal upgrade (2026-06) moved credits to an off-chain ledger in -# boundless-nestjs; the profile constructor now takes only --admin. diff --git a/.github/actions/setup-rust-stellar/action.yml b/.github/actions/setup-rust-stellar/action.yml index ed6ef66..f301069 100644 --- a/.github/actions/setup-rust-stellar/action.yml +++ b/.github/actions/setup-rust-stellar/action.yml @@ -18,10 +18,10 @@ runs: - name: Install Stellar CLI run: | - STELLAR_VERSION="27.0.0" + STELLAR_VERSION="28.1.0" STELLAR_TAR="stellar-cli-${STELLAR_VERSION}-x86_64-unknown-linux-gnu.tar.gz" - # Official SHA-256 from https://github.com/stellar/stellar-cli/releases/tag/v27.0.0 - STELLAR_SHA256="357bf712f6353c28cd33c794402a3c87231757a5b305e6ef1604365af4fdd556" + # Official SHA-256 from https://github.com/stellar/stellar-cli/releases/tag/v28.1.0 + STELLAR_SHA256="c1680deee94301d33ada7a17f98411e642a4248c727afbd2e43050d345746462" wget -q "https://github.com/stellar/stellar-cli/releases/download/v${STELLAR_VERSION}/${STELLAR_TAR}" diff --git a/.github/workflows/verify-build.yml b/.github/workflows/verify-build.yml index 48fcb7b..b6ddc35 100644 --- a/.github/workflows/verify-build.yml +++ b/.github/workflows/verify-build.yml @@ -12,9 +12,11 @@ on: - 'Cargo.lock' - 'rust-toolchain.toml' - 'deploy_mainnet.sh' + - 'deploy_and_upgrade.sh' - 'scripts/**' - '.github/actions/setup-rust-stellar/**' - '.github/workflows/verify-build.yml' + - '.github/workflows/rustfmt.yml' # Use pull_request (not pull_request_target): the check must run the workflow # from the PR head so branch-filter changes take effect on the PR itself, and # the build/test job needs no secrets, so the pull_request_target foot-gun @@ -31,6 +33,7 @@ on: - 'Cargo.lock' - 'rust-toolchain.toml' - 'deploy_mainnet.sh' + - 'deploy_and_upgrade.sh' - 'scripts/**' - '.github/actions/setup-rust-stellar/**' - '.github/workflows/verify-build.yml' @@ -56,16 +59,32 @@ jobs: - name: Check release script syntax run: | bash -n deploy_mainnet.sh + bash -n deploy_and_upgrade.sh bash -n scripts/capture-mainnet-compat-snapshot.sh - bash -n scripts/test-sdk27-compat.sh + bash -n scripts/test-storage-compat.sh + bash -n scripts/build-release.sh bash -n scripts/test-mainnet-upgrade-guards.sh bash -n scripts/testdata/mock-stellar + bash -n scripts/lib/deploy-env.sh + bash -n scripts/deploy/deploy.sh + bash -n scripts/deploy/register_token.sh + bash -n scripts/deploy/verify.sh + bash -n scripts/admin/verify-multisig.sh + bash -n scripts/admin/verify-fee-trustline.sh + bash -n scripts/check-versions.sh + bash -n scripts/test-admin-scripts.sh + + - name: Check contract versions agree + run: ./scripts/check-versions.sh + + - name: Verify admin pre-flight checks + run: ./scripts/test-admin-scripts.sh - name: Verify mainnet upgrade guards run: ./scripts/test-mainnet-upgrade-guards.sh - name: Build contracts reproducibly - run: stellar contract build --locked + run: ./scripts/build-release.sh - name: Check WASM sizes (64 KB ceiling) run: | @@ -79,10 +98,11 @@ jobs: fi done - - name: Verify SDK 23 to SDK 27 storage compatibility - env: - VERIFY_SDK27_BUILD: "1" - run: ./scripts/test-sdk27-compat.sh + - name: Replay the mainnet upgrade against this build + run: ./scripts/test-storage-compat.sh + + - name: Lint + run: cargo clippy --locked --all-targets -- -D warnings - name: Run tests run: cargo test --release diff --git a/.gitignore b/.gitignore index c0fd38e..cbe4681 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,12 @@ target .env.deploy deployments/ +# Multisig envelopes in flight. Their sequence numbers are spent once submitted. +signing/ + # Soroban test snapshots: derived artifacts, regenerated by `cargo test`. -# Not committed โ€” snapshot diffs dwarf source diffs and blind the PR scanners. +# Not committed: snapshot diffs dwarf source diffs and blind the PR scanners. test_snapshots/ + +# Script dependencies +node_modules/ diff --git a/BACKLOG.md b/BACKLOG.md index a077ef9..f2a38d1 100644 --- a/BACKLOG.md +++ b/BACKLOG.md @@ -6,48 +6,18 @@ Legend: `[ ]` open, `[~]` in flight, `[x]` done. --- -## P0 (blocking mainnet) +## P0 -- [x] **SDK 23 to SDK 27 storage compatibility.** Exact mainnet and synthetic SDK 23 state upgrades through H6 to pinned SDK 27 artifacts. Tests cover every persisted layout; CI pins fixtures and snapshots; mainnet tooling verifies versions, admins, bindings, pause state, queued hashes, and live executable hashes. -- [ ] Third-party security audit (events + profile). Cost ~$30-80k for a Soroban-experienced firm. Schedule blocker for the mainnet date. -- [x] Non-USDC token end-to-end smoke. 2026-06-05: registered the testnet native XLM SAC (`CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC`) on the new events contract; ran `scripts/smoke/contract-non-usdc-token.ts`. Bounty published in XLM, alice applied + submitted + won + got paid; payout tx `a6c8daadโ€ฆ`. Smoke updated to tolerate native-asset tx fees (~143k stroops / 0.014 XLM for 3 alice-signed txs); for non-native tokens the assertion still demands exact-budget delta. -- [ ] Mainnet admin multi-sig provisioned per `docs/admin-custody-policy.md` (3 signers, 2-of-3). 2026-06-05: launch baseline updated to software multi-sig (Freighter on 3 isolated machines) with a hardware-upgrade trigger codified in `admin-custody-policy.md` ยง10 (TVL $250k OR daily volume $50k/day for 7 days OR first signer-machine incident โ†’ mandatory Yubikey upgrade). Pre-flight gate codified for both paths โ€” see `docs/multisig-preflight.md` (Section 1.A hardware, Section 1.B Freighter; everything else identical) and `scripts/admin/verify-multisig.sh` (chain-state gate, hardware-agnostic). The verify script was sanity-tested against a single-sig account and correctly fails with the per-check breakdown. -- [ ] Mainnet deploy executed per `docs/mainnet-deploy-runbook.md`. Result committed to `deployments/mainnet.json`. -- [~] **On-chain credit removal: 1.0.0 -> 1.1.0 in-place upgrade (both contracts).** 2026-07-03: APPLIED on mainnet. Both contracts now report `version() == "1.1.0"`. propose (events tx `03b1b30b`, profile `531ff5a2`, 2026-06-29) -> ~1-day timelock -> apply (events tx `b2c84d7c` ledger 63315871, profile `663085fc` ledger 63315890, 2026-07-03). Live wasm: events `2a8789bf`, profile `b9e3500c`. Recorded in `deployments/mainnet.json` + `deployments/mainnet-upgrades.jsonl`. Remaining: `migrate()` no-op stamp on both (audit-trail marker), then deploy the credit-free `boundless-nestjs`. Original notes below. 2026-06-28: dropped the on-chain credit surface from both contracts (source + tests green, 41 profile / 150 events; wasm builds). Profile struct went `{ bootstrapped_at, credits, reputation }` -> `{ bootstrapped_at, reputation }`; `spend_credits` / `earn_credits` / `refund_credits` / `admin_grant_credits` / `set_default_bootstrap_credits` removed; events contract dropped `application_credit_cost` (EventRecord / CreateEventParams) and `credit_earn` (WinnerSpec). Credits are off-chain only now (see `boundless-credits-reputation-prd.md` ยง2). Versioned as a minor bump: `INITIAL_VERSION` + `contractmeta` are now `1.1.0` on both. **No data migration required:** the live contracts were freshly deployed with ZERO bootstrapped profiles and ZERO events, so there are no `Profile` / `EventRecord` rows in the old shape to rewrite. The dropped-field structs only ever have to deserialize rows that do not exist. **Timelock kept as-is** (audited H6 control; cheap insurance as real escrow lands; revisit only if operationally painful). Upgrade sequence (multisig governance op per `docs/mainnet-deploy-runbook.md` + `docs/admin-custody-policy.md`, NOT yet executed): build + commit the 1.1.0 wasm -> `propose_upgrade(new_wasm_hash, "1.1.0")` -> wait out `UPGRADE_TIMELOCK_LEDGERS` -> `apply_upgrade()` -> `migrate()` (no-op stamp; emits the `Migrated` audit event) -> verify `version()` reads `1.1.0` -> cut backend over to confirm the credit-free contract surface. Do BOTH contracts. Re-confirm zero on-chain profiles/events at upgrade time (the no-migration assumption rests on it). +- [ ] Third-party security audit (events + profile). Cost ~$30-80k for a Soroban-experienced firm. Scope it to the 2.0.0 / 1.2.1 tree. +- [ ] **Upgrade mainnet to events 2.0.0 + profile 1.2.1** (`docs/upgrade-runbook.md`, Section 8). Carries every threat-model fix (`docs/threat-model.md` v1.1, Section 4.1.2), restores the 17,280-ledger upgrade timelock (EoP.10: the deployed 1.7.0 / 1.2.0 builds have none), and finishes the 1.7.0 migration that never ran: events still reports a 1.6.0 marker, and events 1 and 2 (`โ€ฆ609`, `โ€ฆ610`, both Completed with zero escrow) are still in the old layout and fail to decode. Rehearsed on testnet 2026-10-02 (events `CBEODVJGโ€ฆ` at 2.0.0, 185 events through `migrate_events`, `migrate` stamped). Backend first: read pages of 90, refund cranks of 15, hackathon selections split at 20 per call, `forfeit_milestone` on milestone rejection, `claim_refund` for held refunds, and no calls to the removed participation entry points. Then profile propose / apply / migrate, and events pause / propose / apply / one `migrate_events` page / `migrate` / unpause, all under the deployed zero timelock. `deploy_mainnet.sh` now refuses to unpause events until `migrate` has stamped, the gate the August upgrade lacked. -### From the 2026-06 Stellar-skill audit +## P1 -See `docs/audit-2026-06-stellar-skill.md` for full findings. - -- [x] **H1 + H2** โ€” Admin/config moved to `instance()` storage; persistent reads of event-scoped data bump `extend_ttl`. Both contracts. (2026-06-04) -- [x] **H3 + H4** โ€” Per-event `Vec
` and `Map` storage replaced with per-element keys (`*Count` + `*At(idx)` + `*Slot(addr)` for O(1) membership). Submissions keyed per-(event, applicant). Caps lifted to 5,000 each after paged cancel landed. New errors `TooManyApplicants`, `TooManyContributors`. Paged read APIs `get_*_count` + `get_*_at` alongside the capped snapshot reads. (2026-06-04) -- [x] **Paged cancel_event** โ€” Replaces single-tx cancel with `start_cancel` + `process_cancel_batch` + `finalize_cancel`. `start_cancel` snapshots the refund math and flips `EventStatus::Cancelling`; OwnerOnly branch settles inline. Batches refund up to `MAX_REFUNDS_PER_BATCH = 25` partners per tx. Finalize pays owner residual on the FullPartnerThenResidual branch and flips Cancelled. Lifts the contributor cap to 5,000. (2026-06-04) -- [x] **H5** โ€” Two-step rotation for `set_events_contract` on profile contract. First-set stays single-step (deploy bootstrap); rotation is `propose_events_contract` + `accept_events_contract` with a ~1-day timelock and a 7-day expiry. `cancel_pending_events_contract` to prune. (2026-06-04) -- [x] **H6** โ€” Timelocked upgrade flow (`propose_upgrade` + `apply_upgrade` + `cancel_pending_upgrade` with ~1-day timelock, 30-day expiry); on-chain `version()` view (initial `0.2.0`); `migrate()` admin one-shot per version guarded by `MigratedToVersion`. Both contracts. (2026-06-04) -- [x] **Storage layout change shipped post-testnet-deploy.** 2026-06-05: testnet redeployed fresh at 0.2.0; the 0.1.x rows held nothing precious. Mainnet has not deployed yet, so the 0.1.0โ†’0.2.0 path will never run in production. `migrate()` exists per H6 with a documented per-`(from, to)` dispatch pattern in `contracts/events/src/admin.rs` + the profile mirror, ready for the first real storage-layout upgrade after mainnet goes live. -- [x] **Domain subscribers ignore the new cancel kinds.** 2026-06-05: all four subscribers (`BountyEscrowSubscriber`, `HackathonEscrowSubscriber`, `GrantEscrowSubscriber`, `CrowdfundingEscrowSubscriber`) now handle `FINALIZE_CANCEL` (mark domain row CANCELLED) and the `START_CANCEL` OwnerOnly inline path (read on-chain status; if already Cancelled, mirror). Tests green (events + queues + escrow contract suites = 133/133). -- [x] **Crowdfunding `claim_milestone` orchestrator path needs admin co-sign.** 2026-06-05: new `AdminSorobanAuthSignerService` finds the SorobanAuthorizationEntry whose address matches the configured admin and signs it via `authorizeEntry()` from `@stellar/stellar-base`. Smoke helper exposes `adminPreSign: true` on `driveToCompletion`; the crowdfunding claim path passes that flag. Verified end-to-end on testnet โ€” all three milestone claims confirmed with `signed 1 admin auth entry` in the log and the builder receiving the full 900 TUSD across three claim txs. - -## P1 (post-launch) - -- [x] `select_winners` re-run semantics: 1.3.0 (#61) made Single-release selection batchable โ€” each position is awardable exactly once (per-position `EventPrizeAward` key is the replay lock), amounts stay anchored to the baseline captured at the first batch, and pre-1.3.0 events remain one-shot. (2026-07-18) -- [ ] Per-event prize claim window: `PRIZE_CLAIM_WINDOW_SECS` (90 days) is a module constant for now because adding a field to `EventRecord` requires a storage migration. Move it onto `EventRecord` at the next real migration window, per the per-event-config rule in CLAUDE.md. -- [ ] `Error` enum is at the 50-case XDR spec cap. The next error needs consolidation of an existing variant; plan this before the audit freeze. -- [ ] Measure real `select_winners` batch headroom with `simulateTransaction` on testnet (entry writes per winner: row + award key). The 50/call cap is conservative; raise it only from measured numbers. +- [ ] Per-event prize claim window: `PRIZE_CLAIM_WINDOW_SECS` (90 days) is a module constant because adding a field to `EventRecord` requires a storage migration. Move it onto `EventRecord` at the next real migration window, per the per-event-config rule in `CLAUDE.md`. +- [ ] `Error` enum headroom: events uses 42 of the 50-case `contracterror` cap after 2.0.0, and retired codes are never reused. Plan a consolidation before the cap, not when the next variant fails to compile. - [ ] Grant committee multi-sig primitive (dedicated signer set + quorum at the contract level vs the current address-level multi-sig). -- [ ] Bounty Showdown participation badge on the boundless-profile contract for non-winning finalists. - [ ] Multi-token support audit: verify the whitelist mechanism handles tokens with non-Stellar 7-decimal scales (currently assumed uniform). -- [x] **M1** โ€” `select_winners` percent math now uses `remaining_escrow` snapshotted at select time so partner top-ups via `add_funds` flow to winners instead of getting trapped until cancel. (2026-06-04) -- [x] **M2** โ€” Documented operational policy: contract-layer trustline checks aren't reliably possible in Soroban today (SAC `balance()` collapses "no trustline" and "0 balance"). Admin verifies off-chain before `set_fee_account` / `register_supported_token`; `FeeAccountUpdated` + `TokenRegistered` events are the off-chain monitoring hooks. (2026-06-04) -- [x] **M4** โ€” Dropped `wins_count`, `submissions_count`, `applications_count`, `milestones_completed` from `Profile`. Off-chain indexer derives counters from emitted events. (2026-06-04) -- [x] **M5** โ€” Crowdfunding `claim_milestone` requires `admin.require_auth()` in addition to `event.owner.require_auth()`. Grants stay single-auth (event owner is the grant org). (2026-06-04) -- [x] **L1** โ€” Audit recommendation targeted the pre-H1 persistent layout. After H1 the Pending* keys live in instance storage which auto-extends and is the right home for them; the temporary-storage swap is no longer a net improvement. Decision recorded inline in storage.rs. -- [x] **L2** โ€” `Error::NotInitialized` added to both error enums. (Shipped with H1+H2.) -- [x] **L3** โ€” `panic_with_error!(NotInitialized)` replaces `.expect("admin not configured")`. (Shipped with H1+H2.) -- [x] **L4** โ€” `MAX_FEE_BPS` tightened from 5000 (50%) to 1000 (10%). Per-event overrides still respect the cap. (2026-06-04) -- [x] **L5** โ€” `EventCreated` event carries `title`. Indexers can populate listings without a follow-up `get_event` read. (2026-06-04) -- [x] **L6** โ€” `__link_keep` removed; `evt::EVENTS_LINK_KEEP` constant gone. The events module is widely consumed (37+ `evt::` references across operation modules), so the keep-alive trick is no longer needed. (2026-06-04) -- [x] **L7** โ€” Crowdfunding `validate_create` rejects nonzero `application_credit_cost` (reuses `Error::InvalidPillar` to stay inside the contracterror 50-variant cap). (2026-06-04) +- [ ] Decide whether to appoint a crowdfunding release validator on mainnet once 2.0.0 is live, and who holds the key (`docs/admin-custody-policy.md` ยง4.1). Until one accepts, the admin multisig co-signs every crowdfunding release. ## P2 (roadmap) @@ -59,32 +29,18 @@ See `docs/audit-2026-06-stellar-skill.md` for full findings. ## Done -- [x] 2026-07-17 โ€” Cancellation liveness hardening. `add_funds` now maintains an O(1) per-event non-owner contribution total, `start_cancel` no longer scans up to 5,000 contributor rows, and `process_cancel_batch` / `finalize_cancel` are permissionless after cancellation starts. The original guarded events 1.1.0 โ†’ 1.2.0 plan introduced the pause and zero-event checks; the current coordinated SDK 27 flow carries those checks forward to events 1.5.0 and profile 1.2.0. Older zero-contributor rows initialize the missing total lazily; a missing total with existing contributors fails closed. Tests cover a 220-contributor constant-footprint start and exact third-party-driven payout deltas. -- [x] 2026-06-03 โ€” `fee_bps_override` per-event field + `effective_fee_bps` resolver. -- [x] 2026-06-03 โ€” `WinnersAlreadySelected` replay lock on `select_winners`. -- [x] 2026-06-03 โ€” Grant last-milestone sweep (G4). -- [x] 2026-06-03 โ€” Contract upgrade primitive verified end to end on testnet (upgrade tx 50a6ab65). -- [x] 2026-06-04 โ€” Stellar-skill audit landed (`docs/audit-2026-06-stellar-skill.md`). -- [x] 2026-06-04 โ€” H1+H2 storage migration: admin/config โ†’ `instance()`, persistent reads bump TTL, both contracts. Tests green (events 64/64, profile 2/2). Adds `Error::NotInitialized` to both error enums; replaces `.expect()` with `panic_with_error!` on the admin getter (L2/L3). -- [x] 2026-06-04 โ€” H5 two-step events-contract rotation on the profile contract: `propose` + `accept` with a ~1-day timelock and a 7-day expiry; `cancel_pending_events_contract` prunes expired or unwanted proposals. First-set unchanged. Tests green (profile 9/9). -- [x] 2026-06-04 โ€” H3+H4 per-element storage layout for applicants, contributors, winners; per-(event, addr) submission entries. Soft caps at 100 per list to keep cancel_event single-tx. New paged read APIs (`get_*_count` + `get_*_at`). Tests green (events 66/66, profile 9/9). -- [x] 2026-06-04 โ€” Paged cancel: `start_cancel` + `process_cancel_batch` + `finalize_cancel`. `EventStatus::Cancelling` intermediate state. `CancellationState` snapshots refund math (non_owner_total, remaining_at_start, count_at_start, next_idx, branch). OwnerOnly branch settles inline. Lifts contributor + applicant caps to 5,000. Tests green (events 67/67, profile 9/9). -- [x] 2026-06-04 โ€” H6 timelocked upgrade + on-chain version + migrate. `propose_upgrade(wasm_hash, new_version)` + `apply_upgrade()` (after ~1 day, before 30 days) + `cancel_pending_upgrade()` + `migrate()` (one-shot per version). `version()` view returns the on-chain semver string (initial `0.2.0`). Both contracts. Tests green (events 74/74, profile 13/13). Closes audit recommendation; the prior immediate-upgrade path is gone, callers must rotate through the timelock. -- [x] 2026-06-04 โ€” M1 + M2 + M4 + M5. `select_winners` Single math switched to `remaining_escrow` (partner top-ups flow to winners). Operational trustline policy documented in `token_whitelist.rs` + `admin.rs` (M2). `Profile` counter fields dropped (M4). Crowdfunding `claim_milestone` requires admin auth on top of builder auth (M5). Tests green (events 76/76, profile 13/13). -- [x] 2026-06-04 โ€” L4 + L5 + L6 + L7. `MAX_FEE_BPS` tightened to 10% (L4). `EventCreated` event carries `title` for indexer convenience (L5). `__link_keep` + `EVENTS_LINK_KEEP` removed (L6). Crowdfunding rejects nonzero `application_credit_cost` (L7). L1 skipped per inline note: post-H1 the Pending* keys are already in instance storage, so the temporary swap is no longer a net improvement. Tests green (events 76/76, profile 13/13). -- [x] 2026-06-04 โ€” Off-chain catch-up. `deploy_and_upgrade.sh` rewritten for the timelocked upgrade flow (`propose-upgrade` + `apply-upgrade` + `cancel-pending-upgrade` + `migrate` + `status`); the old `upgrade` action errors out with migration instructions. boundless-nestjs: `EscrowContractClient` exposes `buildStartCancel` / `buildProcessCancelBatch` / `buildFinalizeCancel` + the H6 upgrade builders; orchestrator gains `beginStartCancel` + `beginProcessCancelBatch` + `beginFinalizeCancel` + `beginProposeUpgrade` + `beginApplyUpgrade` + `beginCancelPendingUpgrade` + `beginMigrate`. Paged read APIs (`get_applicant_count` / `get_applicant_at` / `get_winner_count` / `get_winner_at` / `get_contributor_count` / `get_contributor_at`). Smoke scripts updated. New `EscrowOpKind` values (START_CANCEL, PROCESS_CANCEL_BATCH, FINALIZE_CANCEL, PROPOSE_UPGRADE, APPLY_UPGRADE, CANCEL_PENDING_UPGRADE, MIGRATE) shipped in Prisma migration `20260604100000_paged_cancel_upgrade_op_kinds`. Profile.ts loses the four counter fields (M4). EventStatus gains `Cancelling`. `tsc --noEmit` clean; escrow-contract jest 125/125 green. -- [x] 2026-06-05 โ€” Orchestrator-path testnet smokes against the new wasm (`escrow-cancel.ts`, `escrow-multi-contributor-cancel.ts`, `escrow-select-winners.ts`, `grant-publish-and-claim.ts`, `hackathon-publish.ts`). All confirm the new contract surface flows cleanly through `EscrowContractClient` โ†’ orchestrator โ†’ reconcile โ†’ subscriber. Two smokes surfaced real off-chain integration gaps (recorded above as audit follow-ups): domain subscribers don't yet recognize the new cancel kinds, and the crowdfunding `claim_milestone` orchestrator path needs admin co-signing. Both are downstream of the audit, not in the audit itself. -- [x] 2026-06-05 โ€” H5 admin rotation flow on testnet. `propose_events_contract` โ†’ `accept_events_contract` returning contract error 17 (`PendingEventsContractTimelock`) before the ~1-day timelock elapses โ†’ `cancel_pending_events_contract` (emits `EventsRotationCancelled`) โ†’ `get_pending_events_contract` returns null. Verified the events binding stays unchanged when the rotation is aborted. -- [x] 2026-06-05 โ€” Testnet redeploy + smoke battery against the new wasm. - - profile: `CDSURDCUHB5GU64METASSZW6SZ7IIKA7RABBYPZTNM45GANGN72K22MA` (wasm hash `bf9fd1a7โ€ฆ`) - - events: `CDKZ5N2D4HYU7BAGNUJAB7WT5EYWVCRNUBJA54G6AVXXRLMAQFUEVMXH` (wasm hash `d9b0b9a1โ€ฆ`) - - both `version()` return `"0.2.0"`. - - TUSD registered (`CC2OZCF4HDJJEOTQJ6QMRXR5MZRALRTSVJHGTUFBBGDMHKHQJWCR7O7N`). - - **Surface verification**: legacy `upgrade` + `cancel_event` confirmed absent from the contract spec (CLI parser rejects them); all 13 new methods listed by `--help` (propose_upgrade, apply_upgrade, cancel_pending_upgrade, migrate, start_cancel, process_cancel_batch, finalize_cancel, get_applicant_count, get_winner_count, get_contributor_count, version, get_pending_upgrade, get_migrated_to_version). - - **OwnerOnly cancel smoke** (event 12552982520397825, hackathon, 100 TUSD budget, 0 contributors): `start_cancel` inline-flipped to `Cancelled`, full 100 TUSD refunded to admin. Tx `8c4390de5bโ€ฆ`. `EventCreated.title` field present in the event payload (L5 live). - - **Paged cancel smoke** (event 12552982520397826, hackathon, 50 TUSD budget + Alice 20 TUSD): `start_cancel` flipped to `Cancelling` (tx `7b3df18945โ€ฆ`); `process_cancel_batch(max_refunds=25)` refunded Alice 20 TUSD and returned remaining=0 (tx `288aeaa94dโ€ฆ`); `finalize_cancel` refunded owner 50 TUSD residual and flipped to `Cancelled` (tx `e6c1049fc7โ€ฆ`). Final state: `status: "Cancelled"`, `remaining_escrow: "0"`. - - **H6 migrate smoke**: first `migrate()` emitted `Migrated(from "0.0.0", to "0.2.0")`; replay returned contract error 69 = `MigrationAlreadyApplied`; `get_migrated_to_version` returns `"0.2.0"`. - - All txes recorded in `deployments/testnet.json`. +- [x] 2026-10-02: measured batch headroom on the test host, which enforces mainnet limits (100 footprint entries, 50 writes): single-release selection 19 + 4 per award, grant selection 15 + 2 per award, refund crank 11 + 5 per refund, read page 3 + 1 per row. Caps are now 20 single-release awards per call, 40 per grant, 15 refunds per crank and 90-row pages, each tested at its maximum (`grant_scenarios::limits`). +- [x] 2026-10-02: upgrade timelock restored in source (events 2.0.0, profile 1.2.1): 17,280 ledgers on mainnet builds, 0 with `--features testnet`; tests assert `UpgradeTimelockNotElapsed`. +- [x] 2026-09-28: on-chain participation removed in events 2.0.0 (`apply`, `apply_to_bounty`, `remove_applicant`, `submit` and their registries); entries live in boundless-nestjs. +- [x] 2026-07-30: mainnet events 1.1.0 to 1.6.0 (propose, apply, migrate). +- [x] 2026-07-24: SDK 23 to SDK 27 storage compatibility suite (`docs/history/mainnet-sdk27-upgrade-2026-07.md`); now the storage compatibility suite for 2.0.0 (`docs/storage-compatibility.md`). +- [x] 2026-07-18: `select_winners` batchable for single-release events (1.3.0, #61). Each position is awardable once (the `EventPrizeAward` key is the replay lock) and winners collect with `claim_prize`. +- [x] 2026-07-17: cancellation liveness. `add_funds` keeps an O(1) per-event non-owner contribution total, `start_cancel` no longer scans contributors, and `process_cancel_batch` / `finalize_cancel` are permissionless once cancellation starts. A missing total with existing contributors fails closed. +- [x] 2026-07-03: on-chain credits removed (events and profile 1.0.0 to 1.1.0 on mainnet). Credits are an off-chain ledger in boundless-nestjs. +- [x] 2026-06-27: mainnet deployed (events `CCFVEGOQโ€ฆ`, profile `CD3KH4OEโ€ฆ`). Admin of both is the 2-of-3 multisig `GCVK72I6โ€ฆ` (thresholds 0/2/2, master weight 0), checked by `scripts/admin/verify-multisig.sh`. +- [x] 2026-06-05: testnet redeploy and smoke battery against the audited surface (paged cancel, H6 migrate replay, token enumeration), plus a non-USDC end-to-end smoke with the testnet native XLM SAC. +- [x] 2026-06-04: June 2026 Stellar-skill audit fixed: H1 + H2 (instance storage, TTL bumps), H3 + H4 (per-element storage for per-event lists), paged cancel, H5 (two-step events-contract rotation on profile), H6 (timelocked upgrade, `version()`, `migrate()`), M1, M2 (trustline check is operational, not on chain), M4, L1 to L6. Report: `docs/history/audit-2026-06-stellar-skill.md`. +- [x] 2026-06-03: `fee_bps_override` per event, `WinnersAlreadySelected` replay lock, grant last-milestone sweep (G4). --- diff --git a/CLAUDE.md b/CLAUDE.md index f6a2538..9b7a85a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -18,26 +18,38 @@ Source: ## Hard rules - **No `unwrap()` on host-returned `Option`/`Result` in contract code.** Return a typed `Error` instead. Existing patterns: `Error::EventNotFound`, `Error::InsufficientEscrow`, `Error::WinnersAlreadySelected`. -- **Storage layout is stable.** Adding a field to `EventRecord` or any persisted struct must extend, never reorder, and must ship with a corresponding migration story (see `docs/mainnet-deploy-runbook.md` and the `upgrade()` admin function). +- **Storage layout is stable.** Adding a field to `EventRecord` or any persisted struct must extend, never reorder, and must ship with a corresponding migration story (see `docs/upgrade-runbook.md`: `propose_upgrade` / `apply_upgrade`, then `migrate_events` and `migrate`), proven by the mainnet replay in `docs/storage-compatibility.md`. - **Per-event configuration over global constants.** Anything sales might want to vary per program (fees, windows, caps) belongs on `EventRecord` or its variant payload, not in module constants. - **Tests cover the math.** Every payout split (single + multi-position + sweep) has a test that asserts both the recipient and the fee account deltas. -- **Snapshots are inspection tooling, not history.** `test_snapshots/` is gitignored: snapshots are derived artifacts that `cargo test` regenerates from any commit, and committing them made PR diffs so large that the security scanners skipped them. When reviewing a storage-layout or auth change, regenerate locally and inspect the snapshot diff โ€” but never commit snapshot files. -- **Comment sparingly.** A comment earns its place only by stating a constraint the code cannot: an invariant, a security ordering, a compatibility trap, a non-obvious "why". Do not narrate what the code does, restate the function name, tag changes with version/PR numbers, or leave banners over self-evident blocks. When in doubt, delete it โ€” dense explanatory comments read as AI-generated and make review harder, not easier. Match the density of the surrounding file. +- **Snapshots are inspection tooling, not history.** `test_snapshots/` is gitignored: snapshots are derived artifacts that `cargo test` regenerates from any commit, and committing them made PR diffs so large that the security scanners skipped them. When reviewing a storage-layout or auth change, regenerate locally and inspect the snapshot diff, but never commit snapshot files. +- **Comment sparingly.** A comment earns its place only by stating a constraint the code cannot: an invariant, a security ordering, a compatibility trap, a non-obvious "why". Do not narrate what the code does, restate the function name, tag changes with version/PR numbers, or leave banners over self-evident blocks. When in doubt, delete it: dense explanatory comments read as AI-generated and make review harder, not easier. Match the density of the surrounding file. ## Build, test, deploy ```bash -# Build -cd contracts/events && cargo build --target wasm32v1-none --release +# Build (remaps machine paths; soroban-sdk 28 refuses a plain +# `cargo build --target wasm32v1-none`) +./scripts/build-release.sh + +# The mainnet build: CI's Linux x86-64 environment via Docker, so the hash +# matches CI's from any machine +./scripts/build-release-linux.sh # Test (host target) cargo test -p boundless-events +cargo test -p boundless-profile + +# Replay the next mainnet upgrade against captured mainnet storage +./scripts/test-storage-compat.sh -# Deploy / upgrade testnet -./deploy_and_upgrade.sh +# Fresh deploy (testnet) +scripts/deploy/deploy.sh + +# Upgrade testnet +./deploy_and_upgrade.sh testnet # Deploy / upgrade mainnet -./deploy_mainnet.sh # see docs/mainnet-deploy-runbook.md +./deploy_mainnet.sh # see docs/DEPLOYMENT.md and docs/upgrade-runbook.md ``` Mainnet admin operations live behind the multi-sig defined in `docs/admin-custody-policy.md`. Never touch mainnet without confirming the runbook prerequisites first. @@ -45,8 +57,10 @@ Mainnet admin operations live behind the multi-sig defined in `docs/admin-custod ## Before opening a PR ```bash -cargo test -p boundless-events -cargo build --release --target wasm32v1-none +cargo fmt --check +cargo clippy --locked --all-targets -- -D warnings +cargo test --workspace +./scripts/test-storage-compat.sh ``` Update `BACKLOG.md` if your PR closes one of the entries there. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3a4c543..98ee446 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,8 +24,8 @@ Pull requests are the best way to propose changes to the codebase. We actively w ## Any contributions you make will be under the MIT Software License In short, when you submit code changes, your submissions are understood to be under the same [MIT License](http://choosealicense.com/licenses/mit/) that covers the project. Feel free to contact the maintainers if that's a concern. -## Report bugs using Github's [issue tracker](https://github.com/0xdevcollins/boundless/issues) -We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/0xdevcollins/boundless/issues/new); it's that easy! +## Report bugs using Github's [issue tracker](https://github.com/boundlessfi/boundless-contract/issues) +We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/boundlessfi/boundless-contract/issues/new); it's that easy! ## Write bug reports with detail, background, and sample code @@ -43,8 +43,8 @@ We use GitHub issues to track public bugs. Report a bug by [opening a new issue] 1. Clone the repository ```bash -git clone https://github.com/0xdevcollins/boundless.git -cd boundless +git clone https://github.com/boundlessfi/boundless-contract.git +cd boundless-contract ``` 2. Create a new branch diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 2e42fdf..0b6c7d1 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,15 +1,11 @@ # Contributors -## Automated Contributors List -### Top Contributors -![GitHub Contributors Image](https://contrib.rocks/image?repo=0xdevcollins/boundless-contract) +![GitHub contributors](https://contrib.rocks/image?repo=boundlessfi/boundless-contract) - -### Recent Contributors - - + + -## Want to Contribute? +## Want to contribute? -Check out our [CONTRIBUTING.md](CONTRIBUTING.md) guide to get started! +See [CONTRIBUTING.md](CONTRIBUTING.md). diff --git a/Cargo.lock b/Cargo.lock index 29468dd..3e78079 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -215,7 +215,7 @@ dependencies = [ [[package]] name = "boundless-events" -version = "1.6.0" +version = "2.0.0" dependencies = [ "boundless-profile", "soroban-sdk", @@ -223,7 +223,7 @@ dependencies = [ [[package]] name = "boundless-profile" -version = "1.2.0" +version = "1.2.1" dependencies = [ "soroban-sdk", ] @@ -232,6 +232,8 @@ dependencies = [ name = "boundless-storage-compatibility" version = "0.1.0" dependencies = [ + "boundless-events", + "boundless-profile", "soroban-sdk", ] @@ -1324,9 +1326,9 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "soroban-builtin-sdk-macros" -version = "27.0.0" +version = "28.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d769030e3b2c27873e9be4931decbbe79787b943d5b30e31f8c395eae83144b8" +checksum = "86ffd329211a50add3965a8f4a8f70e24fc5c8268c945566ab963029b12dce40" dependencies = [ "itertools", "proc-macro2", @@ -1336,12 +1338,12 @@ dependencies = [ [[package]] name = "soroban-env-common" -version = "27.0.0" +version = "28.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa50d998c0baafcc6078cb94f5228040c7719b1608c15debc3fc78365dc22f5" +checksum = "610bb12ee937a56c2b629f8eb16efb7e47607cba4e79ab0c24132b9a53dd19a0" dependencies = [ "arbitrary", - "crate-git-revision 0.0.6", + "crate-git-revision 0.0.9", "ethnum", "num-derive", "num-traits", @@ -1355,9 +1357,9 @@ dependencies = [ [[package]] name = "soroban-env-guest" -version = "27.0.0" +version = "28.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fde1064f5e92dbcc8018ecc8e92728bf5bbff0236abaf792c6858367a6853415" +checksum = "7d383176b27bb286f718ab0ff5713bd9b01132089151266359bd9b20f38684cf" dependencies = [ "soroban-env-common", "static_assertions", @@ -1365,9 +1367,9 @@ dependencies = [ [[package]] name = "soroban-env-host" -version = "27.0.0" +version = "28.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f47762a1b75b9ccd07558f28e1a0289ca6adec56810c581cde5cf16e329e00b9" +checksum = "36d7e5920c200939164cc58038224e2d90d7e2fabbfa505d6e2129d648dce7e2" dependencies = [ "ark-bls12-381", "ark-bn254", @@ -1402,9 +1404,9 @@ dependencies = [ [[package]] name = "soroban-env-macros" -version = "27.0.0" +version = "28.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc04b813a9e32456b37875fc41cdb05912a9e947000b9414b7985bffe07a889a" +checksum = "077600bb175ea54592c1ac5983b8fb34ec9ab7a65f298af11d687b61e9d646a4" dependencies = [ "itertools", "proc-macro2", @@ -1417,9 +1419,9 @@ dependencies = [ [[package]] name = "soroban-ledger-snapshot" -version = "27.0.0" +version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4bf41f85da648dca4153ca5ed41411658d2029e15d9ba693fdd2e3e5dbe05d" +checksum = "b5caeb0a4c8af6d04dc1dfbf96199e0d50ae086c7d54c9001abe78bb891fc44f" dependencies = [ "serde", "serde_json", @@ -1431,9 +1433,9 @@ dependencies = [ [[package]] name = "soroban-sdk" -version = "27.0.0" +version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5636f9d62dd0cc6d23f08f775aa60f712ec596e5761f6911aee154337d401bf" +checksum = "e4946477e75667215a25b652b0febb446485686c944d364c117c903e3fb98bab" dependencies = [ "arbitrary", "bytes-lit", @@ -1455,9 +1457,9 @@ dependencies = [ [[package]] name = "soroban-sdk-macros" -version = "27.0.0" +version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c9f001d91196d9cd659634f9113f75609819204aef5fae27b4ab845cdfc741" +checksum = "168f2d2c3fd4da57584c71e0a8315a8e656486495bc53e18c93b8ec4db085438" dependencies = [ "darling 0.20.11", "heck", @@ -1475,9 +1477,9 @@ dependencies = [ [[package]] name = "soroban-spec" -version = "27.0.0" +version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca1e22ce713871c6f9d21a321051b58e53080629b6a5be1132cf11f42cca4d10" +checksum = "2f48c8e183fc140ccd89e1fe1663cc605fb18641967c0bb591f64887599fde59" dependencies = [ "base64", "sha2", @@ -1488,9 +1490,9 @@ dependencies = [ [[package]] name = "soroban-spec-rust" -version = "27.0.0" +version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89fb158f79ec527e46a5d5162f11c4269e17748e6b69391cdf648133d76cfead" +checksum = "40cd0021887fd047e9f63cea36da35b202881bc0e0dbcc067a146137ca46f192" dependencies = [ "prettyplease", "proc-macro2", @@ -1566,14 +1568,14 @@ dependencies = [ [[package]] name = "stellar-xdr" -version = "27.0.0" +version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ff843326969bdf1ef673dcdba94c08f4a3c8f1e58d6e6ef39b1bd4f749179a" +checksum = "f93d09ff8b9f919b084f664003c4c546ac66a76affd5429460dbe29f4b326f8e" dependencies = [ "arbitrary", "base64", "cfg_eval", - "crate-git-revision 0.0.6", + "crate-git-revision 0.0.9", "escape-bytes", "ethnum", "hex", diff --git a/Cargo.toml b/Cargo.toml index 52f51f7..a8484d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ members = [ ] [workspace.dependencies] -soroban-sdk = "27.0.0" +soroban-sdk = "28.0.0" [profile.release] opt-level = "z" diff --git a/README.md b/README.md index b5c0a1f..5c9ba43 100644 --- a/README.md +++ b/README.md @@ -1,116 +1,145 @@ # boundless-contract -Soroban smart contracts that anchor the Boundless platform on Stellar. - -## What is in this repo - -Two contracts in one workspace. +The Soroban contracts behind Boundless on Stellar: escrow and records for +hackathons, bounties, grants and crowdfunding, plus builder reputation and +earnings. | Contract | Path | Purpose | |----------|------|---------| -| `boundless-events` | `contracts/events` | Event records for the four pillars (hackathon, bounty, grant, crowdfunding) with inlined escrow. Multi-token whitelist. Idempotent operations. Per-pillar dispatch on a single canonical `create_event`. Paged cancellation and timelocked upgrades. | -| `boundless-profile` | `contracts/profile` | Per-user reputation and per-token earnings. Lazy profile bootstrap. Mutated almost exclusively by the events contract. | +| `boundless-events` | `contracts/events` | Events for the four pillars with escrow held in the contract. Whitelisted tokens, prize floors, winner awards and claims, milestone releases, paged cancellation and refunds, idempotent operations, timelocked upgrades. | +| `boundless-profile` | `contracts/profile` | Per-user reputation and per-token earnings, written by the events contract. | ## Deployments | Network | Contract | Address | Version | |---------|----------|---------|---------| -| Mainnet | `boundless-events` | `CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ` | `1.1.0` | -| Mainnet | `boundless-profile` | `CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC` | `1.1.0` | -| Testnet | `boundless-events` | `CBEODVJGUYCIYTVXD7KI5UG3BJ2UE4T7AGI2TGY3T4Q5GQRFGTRYVTZP` | `1.0.0` | -| Testnet | `boundless-profile` | `CCA3OAIBOZBUPHPRI5GI6N5PDTE7RTNLKAEID4JTC2YZIHIZNDX5Q6T3` | `1.0.0` | - -Both contracts expose an on-chain `version()` view; the versions above are live reads. - -## Architecture in one paragraph - -The events contract is the on-chain anchor of event existence, key terms, escrow custody, submission anchors, and winner records. Funds enter escrow at creation (or through top-ups), fees are taken at deposit, and payouts release through `select_winners` or per-milestone claims. The profile contract is the on-chain anchor of reputation scores and per-token earnings. The events contract calls into the profile contract to bootstrap profiles on first touch, bump reputation on wins and milestones, and register earnings on payout. Every state-mutating operation carries an idempotency key, admin surfaces are pausable, and upgrades are timelocked. - -## Prerequisites - -- Rust 1.90.0 (`rust-toolchain.toml` pins this). -- Soroban SDK 23.5.x (workspace-pinned in `Cargo.toml`). -- `stellar` CLI for building WASM (`brew install stellar/tap/stellar-cli`). -- `wasm32v1-none` target: `rustup target add wasm32v1-none`. +| Mainnet | `boundless-events` | `CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ` | `1.7.0` | +| Mainnet | `boundless-profile` | `CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC` | `1.2.0` | +| Testnet | `boundless-events` | `CBEODVJGUYCIYTVXD7KI5UG3BJ2UE4T7AGI2TGY3T4Q5GQRFGTRYVTZP` | `2.0.0` | +| Testnet | `boundless-profile` | `CCA3OAIBOZBUPHPRI5GI6N5PDTE7RTNLKAEID4JTC2YZIHIZNDX5Q6T3` | `1.2.0` | + +This tree builds events `2.0.0` and profile `1.2.1`. Mainnet moves to them +through the procedure in `docs/upgrade-runbook.md` (Section 8); until then it +runs the versions above. Both contracts answer `version()`, so read it rather +than trusting this table. + +On mainnet both contracts are administered by the 2-of-3 multisig +`GCVK72I6TVJVDTTY4UKU6MQT4QJ2T2AAG3NULNEUDM46L3UOQYDSO4O2`. Fees go to +`GADSIP2HPINWTMEUNMVYA5NJRL372OV52HDEJTRTLDZXMHADIPQNYH55` at 250 bps, and the +whitelisted tokens are USDC (`CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75`) +and native XLM (`CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA`). + +## How it fits together + +An owner creates an event with `create_event`; the budget moves into the +contract and the platform fee goes to the fee account in the same call +(crowdfunding starts empty and is charged at release instead). Anyone can top +an event up with `add_funds`. The owner, or a manager the owner has delegated +to, records awards with `select_winners`: hackathons and bounties in batches of +at most 20, grants once with at most 40 recipients. No award may fall below the +event's published prize floor for its position. +Hackathon and bounty winners collect with `claim_prize`; grant awards and +crowdfunding funds are paid per milestone with `claim_milestone`, and an owner +can `forfeit_milestone` a grant milestone it rejects. A crowdfunding release +also needs the release validator's signature, or the admin's while none is +appointed. Cancellation is paged (`start_cancel`, `process_cancel_batch` with at +most 15 refunds per call, `finalize_cancel`), and a refund an account cannot +receive is held for it to collect with `claim_refund`. + +Applying and submitting are off chain since 2.0.0; the contract keeps what +money depends on. The profile contract accepts reputation bumps and earnings +only from the events contract it is bound to; the admin can lower a +reputation with `admin_slash_reputation`. Every mutating call carries an +`op_id` for idempotency, both contracts can be paused, and upgrades are +timelocked: `propose_upgrade`, then `apply_upgrade` 17,280 ledgers later on +mainnet builds, then `migrate_events` (events) and `migrate`. More in +`docs/ARCHITECTURE.md`. + +## Toolchain + +- Rust 1.93.0 with the `wasm32v1-none` target (`rust-toolchain.toml`). +- soroban-sdk 28.0.0 (workspace `Cargo.toml`). +- Stellar CLI 28.1.0 (`cargo install --locked stellar-cli@28.1.0`). + +Build wasm with `scripts/build-release.sh`, which runs +`stellar contract build --locked` with machine paths remapped so the same +commit gives the same hash on machines of the same platform. The build that +goes on mainnet is `scripts/build-release-linux.sh`, which reproduces CI's +Linux x86-64 build from any machine through Docker. SDK 28 refuses a plain +`cargo build --target wasm32v1-none`. ## Build and test ```sh -# Unit tests, host target -cargo test --all +cargo test --workspace -# WASM build, both contracts -cd contracts/events && make build && cd ../.. -cd contracts/profile && make build && cd ../.. +# Release wasm as mainnet runs it (17,280-ledger upgrade timelock) +./scripts/build-release.sh --package boundless-events +./scripts/build-release.sh --package boundless-profile -# Check WASM sizes against the 64 KB Soroban ceiling +# Testnet wasm (no upgrade timelock) +./scripts/build-release.sh --package boundless-events --features testnet + +# Size against the 64 KB ceiling cd contracts/events && make size && cd ../.. -cd contracts/profile && make size && cd ../.. + +./scripts/check-versions.sh # Cargo.toml, INITIAL_VERSION and contractmeta agree +./scripts/test-admin-scripts.sh # admin pre-flight scripts against fixtures +./scripts/test-mainnet-upgrade-guards.sh # deploy_mainnet.sh guards against a mock CLI +./scripts/test-storage-compat.sh # replays the mainnet upgrade on real storage ``` -Test snapshots under `contracts/*/test_snapshots/` are the audit trail. When fixtures change shape, regenerate snapshots intentionally and commit them in the same PR. +Test snapshots (`test_snapshots/`) are gitignored. `cargo test` regenerates +them; inspect the diff locally when reviewing a storage or auth change, but +never commit them. ## Repo layout ``` boundless-contract/ -โ”œโ”€โ”€ Cargo.toml # workspace +โ”œโ”€โ”€ Cargo.toml # workspace โ”œโ”€โ”€ rust-toolchain.toml -โ”œโ”€โ”€ deploy_and_upgrade.sh # testnet deploy / upgrade helper -โ”œโ”€โ”€ deploy_mainnet.sh # mainnet cold deploy -โ”œโ”€โ”€ .github/workflows/ # verify-build, rustfmt, deploy +โ”œโ”€โ”€ deploy_mainnet.sh # mainnet deploy and upgrade tool (prepares multisig XDRs) +โ”œโ”€โ”€ deploy_and_upgrade.sh # testnet upgrade helper +โ”œโ”€โ”€ .env.deploy.example # parameters for scripts/deploy/deploy.sh โ”œโ”€โ”€ contracts/ -โ”‚ โ”œโ”€โ”€ events/ -โ”‚ โ”‚ โ”œโ”€โ”€ Cargo.toml -โ”‚ โ”‚ โ”œโ”€โ”€ Makefile -โ”‚ โ”‚ โ””โ”€โ”€ src/ -โ”‚ โ”‚ โ”œโ”€โ”€ lib.rs # contract entry, public surface -โ”‚ โ”‚ โ”œโ”€โ”€ types.rs # EventRecord, Submission, Winner, enums -โ”‚ โ”‚ โ”œโ”€โ”€ errors.rs # error code enum -โ”‚ โ”‚ โ”œโ”€โ”€ events.rs # contract event emissions -โ”‚ โ”‚ โ”œโ”€โ”€ storage.rs # persistent / temporary key helpers -โ”‚ โ”‚ โ”œโ”€โ”€ admin.rs # init, rotation, pause, timelocked upgrade -โ”‚ โ”‚ โ”œโ”€โ”€ token_whitelist.rs # admin-managed supported-tokens set -โ”‚ โ”‚ โ”œโ”€โ”€ escrow.rs # fee math, token transfer helpers -โ”‚ โ”‚ โ”œโ”€โ”€ event_ops.rs # canonical create / submit / select_winners -โ”‚ โ”‚ โ”œโ”€โ”€ hackathon.rs # pillar-specific validation -โ”‚ โ”‚ โ”œโ”€โ”€ bounty.rs # pillar-specific validation + apply / withdraw -โ”‚ โ”‚ โ”œโ”€โ”€ grant.rs # pillar-specific validation + claim_milestone -โ”‚ โ”‚ โ”œโ”€โ”€ crowdfunding.rs # pillar-specific validation -โ”‚ โ”‚ โ”œโ”€โ”€ profile_client.rs # cross-contract interface to boundless-profile -โ”‚ โ”‚ โ”œโ”€โ”€ idempotency.rs # OpSeen helpers + deployment-epoch ID base -โ”‚ โ”‚ โ””โ”€โ”€ tests/ # per-area integration tests -โ”‚ โ””โ”€โ”€ profile/ -โ”‚ โ”œโ”€โ”€ Cargo.toml -โ”‚ โ”œโ”€โ”€ Makefile -โ”‚ โ””โ”€โ”€ src/ -โ”‚ โ”œโ”€โ”€ lib.rs # contract entry, public surface -โ”‚ โ”œโ”€โ”€ types.rs # Profile, PendingAdmin, PendingUpgrade -โ”‚ โ”œโ”€โ”€ errors.rs -โ”‚ โ”œโ”€โ”€ events.rs -โ”‚ โ”œโ”€โ”€ storage.rs -โ”‚ โ”œโ”€โ”€ admin.rs # init, two-step rotations, pause, timelocked upgrade -โ”‚ โ”œโ”€โ”€ bootstrap.rs # lazy profile creation (bootstrap / bootstrap_self) -โ”‚ โ”œโ”€โ”€ reputation.rs # bump, slash, admin_slash -โ”‚ โ”œโ”€โ”€ earnings.rs # per-token earnings registration -โ”‚ โ”œโ”€โ”€ idempotency.rs # OpSeen helpers -โ”‚ โ””โ”€โ”€ tests/ -โ””โ”€โ”€ scripts/ - โ”œโ”€โ”€ admin/ # verify-multisig.sh - โ””โ”€โ”€ deploy/ # deploy.sh, register_token.sh +โ”‚ โ”œโ”€โ”€ events/src/ # lib.rs, admin.rs, event_ops.rs, grant.rs, escrow.rs, +โ”‚ โ”‚ # token_whitelist.rs, idempotency.rs, profile_client.rs, +โ”‚ โ”‚ # storage.rs, types.rs, errors.rs, events.rs, tests/ +โ”‚ โ”œโ”€โ”€ profile/src/ # lib.rs, admin.rs, bootstrap.rs, reputation.rs, earnings.rs, +โ”‚ โ”‚ # idempotency.rs, storage.rs, types.rs, errors.rs, events.rs, tests/ +โ”‚ โ””โ”€โ”€ compatibility/ # storage compatibility suite and its fixtures +โ”œโ”€โ”€ scripts/ +โ”‚ โ”œโ”€โ”€ deploy/ # deploy.sh, register_token.sh, verify.sh (testnet, futurenet) +โ”‚ โ”œโ”€โ”€ admin/ # verify-multisig.sh, verify-fee-trustline.sh +โ”‚ โ”œโ”€โ”€ lib/deploy-env.sh # shared helpers for the deploy scripts +โ”‚ โ”œโ”€โ”€ testnet/ # grant-scenarios.ts, a testnet grant lifecycle run +โ”‚ โ”œโ”€โ”€ testdata/ # Horizon fixtures and the mock stellar CLI +โ”‚ โ”œโ”€โ”€ check-versions.sh +โ”‚ โ”œโ”€โ”€ test-admin-scripts.sh +โ”‚ โ”œโ”€โ”€ test-mainnet-upgrade-guards.sh +โ”‚ โ”œโ”€โ”€ test-storage-compat.sh +โ”‚ โ””โ”€โ”€ capture-mainnet-compat-snapshot.sh +โ”œโ”€โ”€ docs/ # see below +โ””โ”€โ”€ deployments/ # local deploy records, gitignored ``` -## Deployment and upgrades - -Fresh deploy sequence for a new network: - -1. Deploy `boundless-profile` with the admin address. -2. Deploy `boundless-events` with the profile contract's address, admin, fee account, and fee bps. -3. Call `profile.set_events_contract(events_addr)` (first-set-only; later rotation is a timelocked two-step). -4. Register supported tokens on `boundless-events`. - -Upgrades are timelocked three-step operations: `propose_upgrade(wasm_hash, version)`, wait the timelock (~1 day on mainnet), `apply_upgrade()`, then `migrate()` to stamp the migration marker. A pending proposal can be inspected with `get_pending_upgrade()` and withdrawn with `cancel_pending_upgrade()`. - -## Contributing - -See `CONTRIBUTING.md`. +## Docs + +| Doc | What it is for | +|-----|----------------| +| `docs/ARCHITECTURE.md` | What lives on chain and why, roles, cross-contract calls | +| `docs/DEPLOYMENT.md` | Fresh deploy on testnet or mainnet, token registration, admin rotation | +| `docs/upgrade-runbook.md` | Upgrading live contracts, including mainnet 1.7.0 to 2.0.0 | +| `docs/contract-ops-runbook.md` | Building, simulating, signing and submitting admin transactions | +| `docs/multisig-guide.md` | Plain-English guide for signers; provisioning the multisig | +| `docs/admin-custody-policy.md` | Custody policy: signers, thresholds, rotation, release validator | +| `docs/threat-model.md` | Threat model for the 2.0.0 contracts | +| `docs/scout-audit-report.md` | Static analysis report | +| `docs/storage-compatibility.md` | The storage compatibility suite | +| `docs/dune-analytics.md` | Emitted events and Dune queries (`docs/dune-queries/`) | +| `docs/push-payouts-feasibility.md` | Proposal: paying prizes at selection again | +| `docs/audit/testnet-grant-run.md` | Latest testnet grant scenario run | +| `docs/history/` | Finished procedures and the June 2026 audit, kept for the record | + +Follow-ups live in `BACKLOG.md`. Contributing: `CONTRIBUTING.md`. diff --git a/contracts/compatibility/Cargo.toml b/contracts/compatibility/Cargo.toml index 8920cbc..88a1c71 100644 --- a/contracts/compatibility/Cargo.toml +++ b/contracts/compatibility/Cargo.toml @@ -9,3 +9,7 @@ doctest = false [dependencies] soroban-sdk = { workspace = true, features = ["testutils"] } + +[dev-dependencies] +boundless-events = { path = "../events" } +boundless-profile = { path = "../profile" } diff --git a/contracts/compatibility/fixtures/events-1.3.0-sdk23.wasm b/contracts/compatibility/fixtures/events-1.3.0-sdk23.wasm deleted file mode 100644 index b389736..0000000 Binary files a/contracts/compatibility/fixtures/events-1.3.0-sdk23.wasm and /dev/null differ diff --git a/contracts/compatibility/fixtures/events-1.5.0-sdk27.wasm b/contracts/compatibility/fixtures/events-1.5.0-sdk27.wasm deleted file mode 100644 index f8453b6..0000000 Binary files a/contracts/compatibility/fixtures/events-1.5.0-sdk27.wasm and /dev/null differ diff --git a/contracts/compatibility/fixtures/mainnet-events-1.1.0-sdk23.wasm b/contracts/compatibility/fixtures/mainnet-events-1.1.0-sdk23.wasm deleted file mode 100644 index 0087d08..0000000 Binary files a/contracts/compatibility/fixtures/mainnet-events-1.1.0-sdk23.wasm and /dev/null differ diff --git a/contracts/compatibility/fixtures/mainnet-events-1.7.0.wasm b/contracts/compatibility/fixtures/mainnet-events-1.7.0.wasm new file mode 100644 index 0000000..6f16840 Binary files /dev/null and b/contracts/compatibility/fixtures/mainnet-events-1.7.0.wasm differ diff --git a/contracts/compatibility/fixtures/mainnet-profile-1.1.0-sdk23.wasm b/contracts/compatibility/fixtures/mainnet-profile-1.1.0-sdk23.wasm deleted file mode 100644 index c310961..0000000 Binary files a/contracts/compatibility/fixtures/mainnet-profile-1.1.0-sdk23.wasm and /dev/null differ diff --git a/contracts/compatibility/fixtures/profile-1.2.0-sdk27.wasm b/contracts/compatibility/fixtures/mainnet-profile-1.2.0.wasm similarity index 90% rename from contracts/compatibility/fixtures/profile-1.2.0-sdk27.wasm rename to contracts/compatibility/fixtures/mainnet-profile-1.2.0.wasm index 5154b31..0c38043 100644 Binary files a/contracts/compatibility/fixtures/profile-1.2.0-sdk27.wasm and b/contracts/compatibility/fixtures/mainnet-profile-1.2.0.wasm differ diff --git a/contracts/compatibility/fixtures/mainnet-state-63617727.json b/contracts/compatibility/fixtures/mainnet-state-63617727.json deleted file mode 100644 index f9f6b92..0000000 --- a/contracts/compatibility/fixtures/mainnet-state-63617727.json +++ /dev/null @@ -1,619 +0,0 @@ -{ - "protocol_version": 27, - "sequence_number": 63617727, - "timestamp": 1784850182, - "network_id": "7ac33997544e3175d266bd022439b22cdb16508c01163f26e5cb2a3e1045a979", - "base_reserve": 5000000, - "min_persistent_entry_ttl": 2073600, - "min_temp_entry_ttl": 17280, - "max_entry_ttl": 3110400, - "ledger_entries": [ - { - "entry": { - "last_modified_ledger_seq": 63315871, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", - "key": "ledger_key_contract_instance", - "durability": "persistent", - "val": { - "contract_instance": { - "executable": { - "wasm": "2a8789bf5dd392b91ddfe6591072a0cb9fae70045abf379fd1dbbc2db4af1de3" - }, - "storage": [ - { - "key": { - "vec": [ - { - "symbol": "Admin" - } - ] - }, - "val": { - "address": "GCVK72I6TVJVDTTY4UKU6MQT4QJ2T2AAG3NULNEUDM46L3UOQYDSO4O2" - } - }, - { - "key": { - "vec": [ - { - "symbol": "DeploymentSeq" - } - ] - }, - "val": { - "u32": 63222823 - } - }, - { - "key": { - "vec": [ - { - "symbol": "FeeAccount" - } - ] - }, - "val": { - "address": "GADSIP2HPINWTMEUNMVYA5NJRL372OV52HDEJTRTLDZXMHADIPQNYH55" - } - }, - { - "key": { - "vec": [ - { - "symbol": "FeeBps" - } - ] - }, - "val": { - "u32": 250 - } - }, - { - "key": { - "vec": [ - { - "symbol": "Paused" - } - ] - }, - "val": { - "bool": false - } - }, - { - "key": { - "vec": [ - { - "symbol": "ProfileContract" - } - ] - }, - "val": { - "address": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC" - } - }, - { - "key": { - "vec": [ - { - "symbol": "SupportedToken" - }, - { - "address": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA" - } - ] - }, - "val": { - "bool": true - } - }, - { - "key": { - "vec": [ - { - "symbol": "SupportedToken" - }, - { - "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" - } - ] - }, - "val": { - "bool": true - } - }, - { - "key": { - "vec": [ - { - "symbol": "SupportedTokenAt" - }, - { - "u32": 0 - } - ] - }, - "val": { - "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" - } - }, - { - "key": { - "vec": [ - { - "symbol": "SupportedTokenAt" - }, - { - "u32": 1 - } - ] - }, - "val": { - "address": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA" - } - }, - { - "key": { - "vec": [ - { - "symbol": "SupportedTokenCount" - } - ] - }, - "val": { - "u32": 2 - } - }, - { - "key": { - "vec": [ - { - "symbol": "SupportedTokenSlot" - }, - { - "address": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA" - } - ] - }, - "val": { - "u32": 2 - } - }, - { - "key": { - "vec": [ - { - "symbol": "SupportedTokenSlot" - }, - { - "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" - } - ] - }, - "val": { - "u32": 1 - } - }, - { - "key": { - "vec": [ - { - "symbol": "Version" - } - ] - }, - "val": { - "string": "1.1.0" - } - } - ] - } - } - } - }, - "ext": "v0" - }, - "live_until": 4294967295 - }, - { - "entry": { - "last_modified_ledger_seq": 63315890, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", - "key": "ledger_key_contract_instance", - "durability": "persistent", - "val": { - "contract_instance": { - "executable": { - "wasm": "b9e3500cfb559781e68359655f37775c78afffc5a8436daca9d1d1f8e3569b02" - }, - "storage": [ - { - "key": { - "vec": [ - { - "symbol": "Admin" - } - ] - }, - "val": { - "address": "GCVK72I6TVJVDTTY4UKU6MQT4QJ2T2AAG3NULNEUDM46L3UOQYDSO4O2" - } - }, - { - "key": { - "vec": [ - { - "symbol": "DefaultBootstrapCredits" - } - ] - }, - "val": { - "u32": 10 - } - }, - { - "key": { - "vec": [ - { - "symbol": "DeploymentSeq" - } - ] - }, - "val": { - "u32": 63222664 - } - }, - { - "key": { - "vec": [ - { - "symbol": "EventsContract" - } - ] - }, - "val": { - "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" - } - }, - { - "key": { - "vec": [ - { - "symbol": "Paused" - } - ] - }, - "val": { - "bool": false - } - }, - { - "key": { - "vec": [ - { - "symbol": "Version" - } - ] - }, - "val": { - "string": "1.1.0" - } - } - ] - } - } - } - }, - "ext": "v0" - }, - "live_until": 4294967295 - }, - { - "entry": { - "last_modified_ledger_seq": 63585475, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", - "key": { - "vec": [ - { - "symbol": "OpSeen" - }, - { - "bytes": "22f9dff5b7184344e5bac394f9fb141af5b1da8e71ae36e7612fb1aa68f2f1bc" - } - ] - }, - "durability": "temporary", - "val": { - "bool": true - } - } - }, - "ext": "v0" - }, - "live_until": 4294967295 - }, - { - "entry": { - "last_modified_ledger_seq": 63597602, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", - "key": { - "vec": [ - { - "symbol": "OpSeen" - }, - { - "bytes": "d01286fa654b4f924eb2a165e3d8386142917b07af9a22f222420ba8d2b01ad8" - } - ] - }, - "durability": "temporary", - "val": { - "bool": true - } - } - }, - "ext": "v0" - }, - "live_until": 4294967295 - }, - { - "entry": { - "last_modified_ledger_seq": 63593387, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", - "key": { - "vec": [ - { - "symbol": "OpSeen" - }, - { - "bytes": "d456ce7dbe62e2f5949dc2cce2b6a99900ce9ed08ee44237219af22755fa71d5" - } - ] - }, - "durability": "temporary", - "val": { - "bool": true - } - } - }, - "ext": "v0" - }, - "live_until": 4294967295 - }, - { - "entry": { - "last_modified_ledger_seq": 63585475, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", - "key": { - "vec": [ - { - "symbol": "Profile" - }, - { - "address": "GAHGDV4MWDLT3BXOUT5A2T774IUAE54DZ6BUCBH4O7PG5TJGWXSV3OJO" - } - ] - }, - "durability": "persistent", - "val": { - "map": [ - { - "key": { - "symbol": "bootstrapped_at" - }, - "val": { - "u64": "1784668845" - } - }, - { - "key": { - "symbol": "reputation" - }, - "val": { - "u64": "0" - } - } - ] - } - } - }, - "ext": "v0" - }, - "live_until": 4294967295 - }, - { - "entry": { - "last_modified_ledger_seq": 63593387, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", - "key": { - "vec": [ - { - "symbol": "Profile" - }, - { - "address": "GBVQKBWHZGO6YED3EVXOZW76VPNYUMJLBLKE5IN4XE5LTT262UXCBIR7" - } - ] - }, - "durability": "persistent", - "val": { - "map": [ - { - "key": { - "symbol": "bootstrapped_at" - }, - "val": { - "u64": "1784713278" - } - }, - { - "key": { - "symbol": "reputation" - }, - "val": { - "u64": "0" - } - } - ] - } - } - }, - "ext": "v0" - }, - "live_until": 4294967295 - }, - { - "entry": { - "last_modified_ledger_seq": 63539164, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", - "key": { - "vec": [ - { - "symbol": "Profile" - }, - { - "address": "GCCCPDSWYDVTD2VSXNXDKWWNENSRTA637CHVHIIXISTKSK4FV6T7G3HV" - } - ] - }, - "durability": "persistent", - "val": { - "map": [ - { - "key": { - "symbol": "bootstrapped_at" - }, - "val": { - "u64": "1784408398" - } - }, - { - "key": { - "symbol": "reputation" - }, - "val": { - "u64": "0" - } - } - ] - } - } - }, - "ext": "v0" - }, - "live_until": 4294967295 - }, - { - "entry": { - "last_modified_ledger_seq": 63519879, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", - "key": { - "vec": [ - { - "symbol": "Profile" - }, - { - "address": "GCS5XWO3M72B6PSMZVGOSB3CLQVWB5OJ6Z7FTFAP5FAZVWS3MLO4Y3WH" - } - ] - }, - "durability": "persistent", - "val": { - "map": [ - { - "key": { - "symbol": "bootstrapped_at" - }, - "val": { - "u64": "1784300085" - } - }, - { - "key": { - "symbol": "reputation" - }, - "val": { - "u64": "0" - } - } - ] - } - } - }, - "ext": "v0" - }, - "live_until": 4294967295 - }, - { - "entry": { - "last_modified_ledger_seq": 63597602, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", - "key": { - "vec": [ - { - "symbol": "Profile" - }, - { - "address": "GDCLE5VYYAZ5HYSBSG3PIKQEXHPYNSHF2W7PSW2R7WEIPP2AD275EL4S" - } - ] - }, - "durability": "persistent", - "val": { - "map": [ - { - "key": { - "symbol": "bootstrapped_at" - }, - "val": { - "u64": "1784736975" - } - }, - { - "key": { - "symbol": "reputation" - }, - "val": { - "u64": "0" - } - } - ] - } - } - }, - "ext": "v0" - }, - "live_until": 4294967295 - } - ] -} diff --git a/contracts/compatibility/fixtures/mainnet-state.json b/contracts/compatibility/fixtures/mainnet-state.json new file mode 100644 index 0000000..3f4f170 --- /dev/null +++ b/contracts/compatibility/fixtures/mainnet-state.json @@ -0,0 +1,93454 @@ +{ + "protocol_version": 29, + "sequence_number": 64747647, + "timestamp": 1791024017, + "network_id": "7ac33997544e3175d266bd022439b22cdb16508c01163f26e5cb2a3e1045a979", + "base_reserve": 5000000, + "min_persistent_entry_ttl": 2073600, + "min_temp_entry_ttl": 17280, + "max_entry_ttl": 3110400, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 64460331, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "b87365c16102f7242a8fc3e770f615991841741c40673bb241cb254130be4c26" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "GCVK72I6TVJVDTTY4UKU6MQT4QJ2T2AAG3NULNEUDM46L3UOQYDSO4O2" + } + }, + { + "key": { + "vec": [ + { + "symbol": "DeploymentSeq" + } + ] + }, + "val": { + "u32": 63222823 + } + }, + { + "key": { + "vec": [ + { + "symbol": "FeeAccount" + } + ] + }, + "val": { + "address": "GADSIP2HPINWTMEUNMVYA5NJRL372OV52HDEJTRTLDZXMHADIPQNYH55" + } + }, + { + "key": { + "vec": [ + { + "symbol": "FeeBps" + } + ] + }, + "val": { + "u32": 250 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MigratedToVersion" + } + ] + }, + "val": { + "string": "1.6.0" + } + }, + { + "key": { + "vec": [ + { + "symbol": "NextEventId" + } + ] + }, + "val": { + "u64": "271539957145796617" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "ProfileContract" + } + ] + }, + "val": { + "address": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC" + } + }, + { + "key": { + "vec": [ + { + "symbol": "SupportedToken" + }, + { + "address": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "SupportedToken" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "SupportedTokenAt" + }, + { + "u32": 0 + } + ] + }, + "val": { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + }, + { + "key": { + "vec": [ + { + "symbol": "SupportedTokenAt" + }, + { + "u32": 1 + } + ] + }, + "val": { + "address": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA" + } + }, + { + "key": { + "vec": [ + { + "symbol": "SupportedTokenCount" + } + ] + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "vec": [ + { + "symbol": "SupportedTokenSlot" + }, + { + "address": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA" + } + ] + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "vec": [ + { + "symbol": "SupportedTokenSlot" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "string": "1.7.0" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63718136, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "u64": "271539957145796609" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://api.boundless.fi/bounties/b7f3bf3d-08be-45c7-a961-e09880808c7f/content" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "1785406727" + } + }, + { + "key": { + "symbol": "deadline" + }, + "val": { + "u64": "1785408000" + } + }, + { + "key": { + "symbol": "fee_bps_override" + }, + "val": "void" + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": "271539957145796609" + } + }, + { + "key": { + "symbol": "owner" + }, + "val": { + "address": "GAMLW7AE65JHO5YZDPAGONCHZY5R3FKMWM7KVPHXSRUOW6T6LO32S2DH" + } + }, + { + "key": { + "symbol": "pillar" + }, + "val": { + "vec": [ + { + "symbol": "Bounty" + } + ] + } + }, + { + "key": { + "symbol": "release_kind" + }, + "val": { + "vec": [ + { + "symbol": "Single" + } + ] + } + }, + { + "key": { + "symbol": "remaining_escrow" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Completed" + } + ] + } + }, + { + "key": { + "symbol": "title" + }, + "val": { + "string": "End-to-end contract test \\xe2\\x80\\x93 single winner" + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + }, + { + "key": { + "symbol": "total_budget" + }, + "val": { + "i128": "100000000" + } + }, + { + "key": { + "symbol": "winner_distribution" + }, + "val": { + "map": [ + { + "key": { + "u32": 1 + }, + "val": { + "u32": 100 + } + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63841346, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "u64": "271539957145796610" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://api.boundless.fi/bounties/2c4e884a-aca2-46dd-a02b-bdc98e7c1ae0/content" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "1785415413" + } + }, + { + "key": { + "symbol": "deadline" + }, + "val": { + "u64": "1786057140" + } + }, + { + "key": { + "symbol": "fee_bps_override" + }, + "val": "void" + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": "271539957145796610" + } + }, + { + "key": { + "symbol": "owner" + }, + "val": { + "address": "GDX7CNDBKSTWGHS5QDUJC2KK2RUWDR43AVNJPUG5MZ5EEOKHRDSJ37TD" + } + }, + { + "key": { + "symbol": "pillar" + }, + "val": { + "vec": [ + { + "symbol": "Bounty" + } + ] + } + }, + { + "key": { + "symbol": "release_kind" + }, + "val": { + "vec": [ + { + "symbol": "Single" + } + ] + } + }, + { + "key": { + "symbol": "remaining_escrow" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Completed" + } + ] + } + }, + { + "key": { + "symbol": "title" + }, + "val": { + "string": "Muwa Creator Bounty" + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + }, + { + "key": { + "symbol": "total_budget" + }, + "val": { + "i128": "1000000000" + } + }, + { + "key": { + "symbol": "winner_distribution" + }, + "val": { + "map": [ + { + "key": { + "u32": 1 + }, + "val": { + "u32": 60 + } + }, + { + "key": { + "u32": 2 + }, + "val": { + "u32": 40 + } + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64164377, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "u64": "271539957145796611" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://api.boundless.fi/bounties/513b62b6-047f-4843-96c9-53593c6336eb/content" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "1787925823" + } + }, + { + "key": { + "symbol": "deadline" + }, + "val": { + "u64": "1787935800" + } + }, + { + "key": { + "symbol": "fee_bps_override" + }, + "val": "void" + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": "271539957145796611" + } + }, + { + "key": { + "symbol": "owner" + }, + "val": { + "address": "GAMLW7AE65JHO5YZDPAGONCHZY5R3FKMWM7KVPHXSRUOW6T6LO32S2DH" + } + }, + { + "key": { + "symbol": "pillar" + }, + "val": { + "vec": [ + { + "symbol": "Bounty" + } + ] + } + }, + { + "key": { + "symbol": "prize_floors" + }, + "val": { + "map": [ + { + "key": { + "u32": 1 + }, + "val": { + "i128": "150000000" + } + }, + { + "key": { + "u32": 2 + }, + "val": { + "i128": "100000000" + } + }, + { + "key": { + "u32": 3 + }, + "val": { + "i128": "50000000" + } + } + ] + } + }, + { + "key": { + "symbol": "release_kind" + }, + "val": { + "vec": [ + { + "symbol": "Single" + } + ] + } + }, + { + "key": { + "symbol": "remaining_escrow" + }, + "val": { + "i128": "300000000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + }, + { + "key": { + "symbol": "title" + }, + "val": { + "string": "Boundless Team Quest \\xe2\\x80\\x94 30 USDC to Top 3 Entries" + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + }, + { + "key": { + "symbol": "total_budget" + }, + "val": { + "i128": "300000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64744258, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "u64": "271539957145796612" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://api.boundless.fi/bounties/2ceaee23-1e0d-4c5e-8aa2-b407574f6274/content" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "1788187059" + } + }, + { + "key": { + "symbol": "deadline" + }, + "val": { + "u64": "1790355600" + } + }, + { + "key": { + "symbol": "fee_bps_override" + }, + "val": "void" + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": "271539957145796612" + } + }, + { + "key": { + "symbol": "owner" + }, + "val": { + "address": "GAA6HG7FCNPKSS6CQLN27GUIMWJJMLDCSBF64G5QWM4HH536KABLFD4Y" + } + }, + { + "key": { + "symbol": "pillar" + }, + "val": { + "vec": [ + { + "symbol": "Bounty" + } + ] + } + }, + { + "key": { + "symbol": "prize_floors" + }, + "val": { + "map": [ + { + "key": { + "u32": 1 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 2 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 3 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 4 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 5 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 6 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 7 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 8 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 9 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 10 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 11 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 12 + }, + "val": { + "i128": "500000000" + } + } + ] + } + }, + { + "key": { + "symbol": "release_kind" + }, + "val": { + "vec": [ + { + "symbol": "Single" + } + ] + } + }, + { + "key": { + "symbol": "remaining_escrow" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + }, + { + "key": { + "symbol": "title" + }, + "val": { + "string": "Stellar Vietnam Mid-autumn festival Track 1" + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + }, + { + "key": { + "symbol": "total_budget" + }, + "val": { + "i128": "6000000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64725863, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "u64": "271539957145796613" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://api.boundless.fi/bounties/c369f344-0563-4812-b4a6-6a4831be543e/content" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "1788187155" + } + }, + { + "key": { + "symbol": "deadline" + }, + "val": { + "u64": "1790355600" + } + }, + { + "key": { + "symbol": "fee_bps_override" + }, + "val": "void" + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": "271539957145796613" + } + }, + { + "key": { + "symbol": "owner" + }, + "val": { + "address": "GAA6HG7FCNPKSS6CQLN27GUIMWJJMLDCSBF64G5QWM4HH536KABLFD4Y" + } + }, + { + "key": { + "symbol": "pillar" + }, + "val": { + "vec": [ + { + "symbol": "Bounty" + } + ] + } + }, + { + "key": { + "symbol": "prize_floors" + }, + "val": { + "map": [ + { + "key": { + "u32": 1 + }, + "val": { + "i128": "2000000000" + } + }, + { + "key": { + "u32": 2 + }, + "val": { + "i128": "1000000000" + } + }, + { + "key": { + "u32": 3 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 4 + }, + "val": { + "i128": "500000000" + } + } + ] + } + }, + { + "key": { + "symbol": "release_kind" + }, + "val": { + "vec": [ + { + "symbol": "Single" + } + ] + } + }, + { + "key": { + "symbol": "remaining_escrow" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Completed" + } + ] + } + }, + { + "key": { + "symbol": "title" + }, + "val": { + "string": "Stellar Vietnam Mid-autumn festival Track 2" + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + }, + { + "key": { + "symbol": "total_budget" + }, + "val": { + "i128": "4000000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64440680, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "u64": "271539957145796614" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://api.boundless.fi/bounties/302dde2f-23a8-482f-b6cb-2d7bacc22d64/content" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "1789469950" + } + }, + { + "key": { + "symbol": "deadline" + }, + "val": { + "u64": "1789513140" + } + }, + { + "key": { + "symbol": "fee_bps_override" + }, + "val": "void" + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": "271539957145796614" + } + }, + { + "key": { + "symbol": "owner" + }, + "val": { + "address": "GAMLW7AE65JHO5YZDPAGONCHZY5R3FKMWM7KVPHXSRUOW6T6LO32S2DH" + } + }, + { + "key": { + "symbol": "pillar" + }, + "val": { + "vec": [ + { + "symbol": "Bounty" + } + ] + } + }, + { + "key": { + "symbol": "prize_floors" + }, + "val": { + "map": [ + { + "key": { + "u32": 1 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 2 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 3 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 4 + }, + "val": { + "i128": "500000000" + } + } + ] + } + }, + { + "key": { + "symbol": "release_kind" + }, + "val": { + "vec": [ + { + "symbol": "Single" + } + ] + } + }, + { + "key": { + "symbol": "remaining_escrow" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + }, + { + "key": { + "symbol": "title" + }, + "val": { + "string": "Boundless Content & Visibility Bounty for SEBW" + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + }, + { + "key": { + "symbol": "total_budget" + }, + "val": { + "i128": "2000000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599980, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "u64": "271539957145796615" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://api.boundless.fi/hackathons/ed56ed9b-0ba9-47b8-8aec-87b69cc83749/content" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "1789571859" + } + }, + { + "key": { + "symbol": "deadline" + }, + "val": { + "u64": "1789736400" + } + }, + { + "key": { + "symbol": "fee_bps_override" + }, + "val": "void" + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": "271539957145796615" + } + }, + { + "key": { + "symbol": "owner" + }, + "val": { + "address": "GCT7D6S5VTFGEURS6ZYIO33YZRPQMA3LNWB4GEOHDFDXZGWTA4EPIM5E" + } + }, + { + "key": { + "symbol": "pillar" + }, + "val": { + "vec": [ + { + "symbol": "Hackathon" + } + ] + } + }, + { + "key": { + "symbol": "prize_floors" + }, + "val": { + "map": [ + { + "key": { + "u32": 1 + }, + "val": { + "i128": "2500000000" + } + }, + { + "key": { + "u32": 2 + }, + "val": { + "i128": "1500000000" + } + }, + { + "key": { + "u32": 3 + }, + "val": { + "i128": "1000000000" + } + } + ] + } + }, + { + "key": { + "symbol": "release_kind" + }, + "val": { + "vec": [ + { + "symbol": "Single" + } + ] + } + }, + { + "key": { + "symbol": "remaining_escrow" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Completed" + } + ] + } + }, + { + "key": { + "symbol": "title" + }, + "val": { + "string": "Pollar Hackathon: Build on Pollar" + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + }, + { + "key": { + "symbol": "total_budget" + }, + "val": { + "i128": "5000000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609068, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "u64": "271539957145796616" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://api.boundless.fi/bounties/77704abb-02e5-4d13-9a63-780bb8bfa173/content" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "1789587431" + } + }, + { + "key": { + "symbol": "deadline" + }, + "val": { + "u64": "1789772340" + } + }, + { + "key": { + "symbol": "fee_bps_override" + }, + "val": "void" + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": "271539957145796616" + } + }, + { + "key": { + "symbol": "owner" + }, + "val": { + "address": "GD6YISBW2D6MNFHSBGQLQU4RPWTRJGJ2OFDDRPTF7WHOHUTJBQOAWHNS" + } + }, + { + "key": { + "symbol": "pillar" + }, + "val": { + "vec": [ + { + "symbol": "Bounty" + } + ] + } + }, + { + "key": { + "symbol": "prize_floors" + }, + "val": { + "map": [ + { + "key": { + "u32": 1 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 2 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 3 + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "u32": 4 + }, + "val": { + "i128": "500000000" + } + } + ] + } + }, + { + "key": { + "symbol": "release_kind" + }, + "val": { + "vec": [ + { + "symbol": "Single" + } + ] + } + }, + { + "key": { + "symbol": "remaining_escrow" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Completed" + } + ] + } + }, + { + "key": { + "symbol": "title" + }, + "val": { + "string": "Boundless \\xc3\\x97 Southeast Blockchain & Games Week (SEBGW) 2026 Content Bounty" + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + }, + { + "key": { + "symbol": "total_budget" + }, + "val": { + "i128": "2000000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63716826, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796609" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCPX5J4CXKA7KFIJEGUIR63SR6CKQIEGBFSAALMFLE5IURDHXJ66KFKL" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63799235, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796610" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63806525, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796610" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCFRGHJSLBUIN536Y2K4Q5KGKE2AXSZPQZW37ZH62VCYD2XSEWBNZWNO" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63817349, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796610" + }, + { + "u32": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAMYN5NNVOY2O4E6PTTAUWFSVA2TYKHFJX2Y4N3XW4MX6KSH6WXJJQRU" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63829522, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796610" + }, + { + "u32": 3 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBKA233FZEZ3QIZVY4BH5IO3UZMZQV7UHPCJVXB4FYCMEYBUSPRYB3DA" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63829801, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796610" + }, + { + "u32": 4 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDRZCJDIVZTOLCQRQWTVCB5UUIJOGD3P4SUZ3PAABWXQJL63O2OFJ3XL" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64213360, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAD2PJIY4WZIZM3HIWB4STXDGQWQ4GFFDBQYIOEAEGVWIQST53PVU6B5" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425814, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 100 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDNC6UMPK62ZGHRT6PUY7LRLIJUZ7SWGLTF7XPDOYHZWC3VKDMT4ZNFM" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425821, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 101 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDTRBLSF6K3MI2MVS6DSLEHWRKHWUE74ZF6SE57VHFSL463TY2L6QX7O" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425864, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 102 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBCI4C4GGIYM2C2MFRFOTULRATO46JM5DLO2WNBL42LQPOO3PEHXU3FH" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425883, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 103 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDRZ3DFYOVBOOONOM6UWYINJLRE4BUSOXCEJCKWXOVU2WOC7XT6F7MXR" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425892, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 104 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDEUNFH2WAXZC5VPHTULLKE5I6VJMRWZHDN5ZGL3DAGLHMGSCBHPJCPC" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425901, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 105 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDKSGHVOWEEVLKW7WFNR62N5DRVTLYVSMODJ4ZSKB4EFR5K4LGOIGSUJ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425906, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 106 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA2MMWELTIH5IUJE7CWK6AW7EAMOZVGKY3F3GBNFVSQFYE5W52VBAFTD" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426577, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 107 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBFRBYERVZWUK26QRHHMVSPMUG5N2Z5BZHTZL5QMHUIXLECF36L454LS" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426628, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 108 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA6QAJ6TMPTODF6DOMLU6XI7VD6XYYYM7JZA6PPAWNNQEF5454NQ2ELN" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426634, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 109 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD4ZUBMN7HPBN3YQPIFNL5JQICVFXZFXIQ7Y2T7MRIDHXMOLBBGD2HWS" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64226093, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 10 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCWCR3TKBCT6BH6YNTEONYLRLX57TOVWWANPY4S5ZEVS3PJQQXVQIDS3" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426641, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 110 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCR6F3I3ZNQXNC5GADLO6EOAKDWWSJV63VS6WXVRISAOV6OPMFAIA4IA" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426648, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 111 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDGH345DWYQUQJT3LFED4SVRVTGYYBP7MWTWXDAJTBDBQA6HG2E3KRD5" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426667, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 112 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDBTK4QJ22WZC7CD2I5KOBNVN5AIRU3DD2EX3YZBLV7M46Y6RYUNCDLR" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426676, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 113 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCQDJQXVVAF7NRWSPV7BFSIJX7JQP7XVPGBVMXMZW5LBSBJV4F4EA6NG" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426690, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 114 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA2CWWXT26Q4TNNRHRSV674ZF6OWCNDW5JAGEEJD2FB3CBDKXSEVLWNU" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426699, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 115 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAF6ML2FAQIT7GPP74FRUH4DDEOIMPJENDKBJLMAEHY37B7RTEBTIYOP" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64431409, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 116 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDENLMKPPVI7HYVJWRJIB6Z2AAIQNUKT7VSG6VJW4WGR3VAC5MAY6IQL" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64435448, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 117 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAAKMCBKEHJHWVLYR6CSX77AYAFYMAITCUI4GM6EFO54V6OSCKA2KONZ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64436749, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 118 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAXFCHETKZD2SH45HJP4RCNGRDPPDSMFFSJX5P44V54XFHEDYXB4KKAS" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437608, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 119 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAMUGU5B43ZFG2BW2DRMEZZTQI2WPYU5BGOXTVJT6UA23DKKZLXGMSKN" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64226562, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 11 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDNWNV2PBY54YRL45GVHRDHA737SEPL6BZMAKRI2IDRKUEP56GERIHDT" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437610, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 120 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD7R4BI47Q5R4EUYN3AZ5EV4ZMMN2DRUG5DOSQS2ZRCYQLD2OICI3CLT" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437613, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 121 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC7J5RFWAERY3PJD4SFTS5UKS7R4BCA3LFOG5I5GS2IKYJSAWEKXWXQO" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437617, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 122 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBEYGVKWVZNB2MYLOBAQVGATNKGJ3ZK5SYHYS4JUXU6PKS5QHWPEDM6W" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437623, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 123 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBKTPUI7K3X6556BEEKZW6TMPLPB6U3S2IP7SZOYPQWYELJHQIJ5F7VY" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437628, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 124 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCKDWMET5N7PWM6DOCSLPLFN37CAD3DQYEBGEPNWREBCHCNYQZWOWQFS" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437802, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 125 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAAJ4XUODHJUC23YRMFVTS5M73S5ZZTQSZIDF2ZOSA5P2COKXJOTNUSN" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437806, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 126 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCEL3ZJPOL4KGX5AQ2V7D6DTV7XIJNSN3CLFDDBZUMGCPL3E7LCFWJXS" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64442651, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 127 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBKPM5RCXJDRYLHTDETCCXM3274GNJY6BTFDMNNESTMQI3NDSC6PRYGV" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64447172, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 128 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDLKJIHOV4BOBWWKZAKVVHYGULR6NNGTR2SB5OYTROGMSGODVJIZ4BH2" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64449629, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 129 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAJJYKVGLTGP6A3ANITXSKM26FT5OWLOV6MLWQPGHMOLWGSXXPRNOAFM" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64227083, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 12 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBZNFITNWK2KBCHUERLOBCS6XBQC4LFKEEURYWM7G3AT55LWS3YHOWRL" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64454063, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 130 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBWSKQ7QLQEOSATZI27DB7SPPRHQOTH7XGLHF4FE2T7SVVNDMX5F666K" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64464803, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 131 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCWYCR2NNOZMITJBLXGNSFAWT3YQDHXOIPUPCONCQZPRAUZGWDNGNM7M" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472892, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 132 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCUOHOGGKIGOYZAIN7GI62E47UPPJJK2J6BJYIM6YUEBVTRRE6NKABDL" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475191, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 133 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDOR4CPOMWGJIYUKLHUAWG6YKG5O54W6QXU4W6HSB5I7UIZ3GK3LFGDX" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490349, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 134 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA7YDWNQYXXLAWBZG25MH3XI2QATNC5CVZZ7U3IKWEWCDEV4B6E54TLM" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490394, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 135 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCDD35WKILCDXEKL275OFVXPZBYN2DCTOEIXJZY5W4A2ODWEXK3CU7RH" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495699, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 136 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAJOAYF7JRQNPAFECS7SDYAKPPZHEUVSDMHFHPKYWYWECIDAMTTFUBRW" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64498913, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 137 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBVUU2XPZVGPNMOW7TDPI7CPJ2RL2EPD33AB2DZUZLIKGAVECTKIIFKV" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64498971, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 138 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GB2LBLRAJMXCNQ3R43GXJ7PLQBIPFDBAUEQO4ZKBTOHKNGCBHKMWKBIB" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64505310, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 139 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBQ2D2PC5TGR6NBZXREJDBAQESEUQ3WWIJ62A5B7P2VEJ7NDT47QPI4S" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64229868, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 13 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAJA3EEWG5SJDV2OSC7NBAGQ4OFEC64DFO7GKTK5J6A6SXDEO4EQ4CRM" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64509367, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 140 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCUKUSWC6GI2UMBIGLS6IECS2BVDDCNBRVFR4QUHXSKMF47MYBYBMJ5V" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64511498, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 141 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDJ4W5TOTWIUWSKKGWGT4UXEZNHVEGEU5JHSASXUYT7ZSZV3ZY7HE3VC" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64516562, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 142 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBLMKYSUMGNJB3CL5BYH6TJ7LPZCIHA47G56A4YQZTXV6PA23KPUPLT4" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64516784, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 143 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDKMSQYPV3M2ZOZ6ELXDVQF5YWYEZPJIQA2XODJOGHZ57PE2XAD3BD7O" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64521005, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 144 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDFZJIBTR7JFFH5MSTBWVXPI3ZB5VZAJQDYRHAZ3EHK6TCIMW4NPVHWV" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64522749, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 145 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD2NW7INAHXPCY2CGXA7K74QVA3GOB7M6KP7DJNDAIEHVSK4CROWYNIA" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64522794, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 146 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD5PABD6RFOAKVAH47H2RNQDPS5HWGDYXM5N7LPEMZ4N34CH7QZOW7HL" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64523878, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 147 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBPHQXYYQXNDI6O3LMKY5P4BISQH2NQRRI3GFDMD2UXVEDLBM6Z3SA6B" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64525310, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 148 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCCPDM7HRDZIVHIYK3JEPBQEBYNXLXM5CXCYT2QPBMMS3QZQOAO3MTXK" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64532030, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 149 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GASEQUQAP7QMLZK4VMNQLMGKLZ2GR5XJ3MTO5C2RA22RKDKHEPRKKAHU" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64232430, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 14 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBKOUX6KOXYS2PNX7U66OVTHWW4GW2JGQF2DFWHO64N3Y2M2BF5DEGBB" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64536143, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 150 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GASWMZPKDGCQCKDRYQCGVD7FF7D2NRWUOG7KSDDO4XGGN7XETX5OEE4L" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64538458, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 151 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA6UANZSAIOSKXKPYXEYLHAUNTQOJNKUIKCPGFNU6RVVTPJDJJNHOJYH" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64539238, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 152 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBGARGMSDMLW7I4ZPRD5HTGVAEOUJG73PPGBXZ7C7AP7DKXV6TK3QTRN" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64539293, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 153 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GADR2KUYLHAZNUH7J4IPC4QOFKMJS2CHTXIUVMRFLI536VL3XPNTEUWZ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64541587, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 154 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCQQRPKZQAE542XOF53KM7KESYPDWK6LA4EEX2FNUQAG43CL66DQUXHG" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64541867, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 155 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDJTYHSIWQG35TO6YFFJ6GB4RWFFJH4FMWQNG6BW7DGXHBIWESZXY66S" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64542673, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 156 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBFW6RSAV6YPDKIL6QEYE5R6M3KROSQ6J7DYWFNQ2TT3FMT7POUPJCUL" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64547244, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 157 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBDVM5H2HUR2UJU4U62H3AO3B3QA7XXRPOMJQYWKBJ2UT4G7CKKCHXRS" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64552995, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 158 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA3NAZYKIAQWJHXCUORX3FUXZCCMWRFIKJFEDMLEUFMCWELYD2LCDWON" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553085, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 159 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC3Q4CJXKLYESHLL4C34CT3ENOT4TXDO3W4PRIQ3C7TC4FHTRAQ5S37J" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64236524, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 15 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553195, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 160 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDQRHRIHCEFBBBGV25MVVV4CPOZKGC3L2WE2VEAJP5YU3MGYSXU472DT" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553590, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 161 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC7PKCYZRRDRT6HBGPPON4NKQGHKNJJJQ7JN74TM5XBHFH7JBVI7LBR6" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64556512, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 162 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCCZVSEE77TOK6QTPLUNUUFZ5JOHFQJNXJCN63FBW6VEVLQ676RW7UV3" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64556953, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 163 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBAJXEV6RQSHLNXIWQJYUAVFZTOQOVN4AAN76EKUQFNX6YPTWEDTAWNJ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64558142, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 164 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC3OLVPNJYDH26LFK4B4PNVFRGDJYUCMSGJVDJQ3UN76FMLJE77VTX6S" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64559446, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 165 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCEE54NZQVKEPPYF5BUWJHMGRORKIRJIXQYW3IFIMHTJIYLSBWPYCZ5H" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64560480, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 166 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA4DJDM66BZLZ54K7GLZFFPKGBNC44IPZSHMMZ6G7YY5TOQH3N5T5HAM" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64563749, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 167 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDIFMYOSTTEWCFFRQS53JEQ7MFXGHG77I7ACVJKU4Y72QBWP5HRI5XF3" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64567911, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 168 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAHDDTSTE2P6JSTUBYIHZ566S2MT554CYJBJIU4W4Z3P3T7XKLGA2TIK" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64567958, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 169 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDQRMSPPL36367H7GTGY737ZCMERZIODQYBUSSKQZ2KKJQXVP4J3KICR" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64238030, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 16 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDI3IFSW6CZNMF7XMBME6YYUDBE34UQ67QZR64PNRIJSZUR6YFH7UI5L" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64567988, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 170 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCPBFZPPLKE6OYQE74UYFWGTS32UHACB62TO5TJU2VG6NXY4VXBYWLD6" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64568043, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 171 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GADGXEIP2NEIJ3723RFTFCSPVJIJVM42RTONINH4MRTMUV2KBDFBORF5" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64571211, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 172 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBL6Q3ZKJ6VIJ6KPWWS5O6MWNYQXPBIS3IFFL5NYNRCEGRXZDBGXDECS" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574382, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 173 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAYNG64UV3AS4PK5CAAZE65HQYBVPYEAAGSK4YMSIW3DAT6GZY632N62" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574604, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 174 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA25XFBDROFS3V53RRGHGN5IY2LQFP3HO4IFSOZS2SAAQA4DEJ7JHWX4" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574737, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 175 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAHCZAPDQH32PUCAUSIA6YUHRZP37C2RHNN3IHBW35JR2A4W6IQZEFKE" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574784, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 176 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAJWVQLHXY6DFSC3CMWL6YZNJTQT7SRD4BOZHQOVEHHRLP535VJ6JH6O" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64576606, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 177 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBRPYPLGP7KNWYRGWJYP2NSJ672ZU54UISVFKBXVRCHSRKEQBIX2YI2B" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64577954, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 178 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GATTCGMJ2MDHDT5TBQX4NGMSHSMTMCHXRVIKPBES6JM5VGZSHC45OGJC" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64586456, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 179 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GACELCRF3P7PBSFLSPHHLK2YIQ6WNEOZGBN3EJ6TMLCMJPSVDAZDXDDM" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64239111, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 17 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAOMRKOZJOXUHI3PHRPRQUORZ4NXZVSCRZSHDJJYEYNFBWZIO5WMRZJ3" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64587184, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 180 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCMYZU6UFGB2MWTCCGNOAUQWAM4JUWDQDBS4GVB7HZBDDYOUGGBSKXRW" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64587482, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 181 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAIR7XYIVOIEADFWYP3TNHDBXBIB2DVASZRSIYRJXBCTPCA7KQDJVANC" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64587744, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 182 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBXV2EEM4ME3VBQNHSKBTEDEY4UGKT4PSRWNI4XB3ZHE43KVIFA66PSS" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64588133, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 183 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAEVYIB4QUSGU2GPEBBEOSS2B6ATCZLIQ4ZNF2IMIO2RAOJIEZDQY2YX" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64588732, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 184 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDC25VYWGWCK265BS6MKGYAUCBSV3LVQS4LUY33PUOT6S5NUNOEPVRVD" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64588820, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 185 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC5P3MKC4MK5IE5IJYQVLPS6EVSHMYUPOYWPS6AAQQ7FUEF32G3H4TRJ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591138, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 186 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCAR2MD5F3ALAUZM6XJP7JKKGAPA73DQ6NNUDBBBPSO6GP3SFUKDUBSJ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591255, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 187 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDC7HWCF35MCND4IJBTSVBOAKR4BG2HI45R345ERWFQGML2HS7KGGDLQ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64593502, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 188 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD2SOPA77HAN6FUAT7XXCTC6EVRL3WWN5OZ7VYNZY2WBZP4RKNQVV2IG" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64595118, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 189 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBQF3E7EDEE5LGCLYZNP5DHXM3FIDHR3SG44BJ3WRLHEKZ3D4OGTAHXB" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64239428, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 18 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDP25U2QVO5LSHQRG36UEFV3EU2B7SGI5QSKBWHMGZILOYQM5T6ZLDFL" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64595220, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 190 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA7VIS5CL6LXI23TADDI5TTKZORASCUQDJRH6EKF2TPLTNMXS5MJUFWF" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64596310, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 191 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDMBA5ZEC45HNJEO4R6HV6X53LDALAV4PBI22KGJL4X3WVFKBWGAPFUM" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64596813, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 192 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCHYROHFWJWBNFR2T5DXVCORNFEWFPGX3LBOQEIZRTOVE7SBBJEQLCGM" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599724, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 193 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCIR3QJXGKOTEDVBNFAJOG7WZ6CWI7NYAHWYT67F5CD7ARKXYWRF3LAD" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64603494, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 194 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBF5JQPKGAH73ENUHNY57YNX4R2CDAGSRQW43LULFKNHP42DQR5XI53P" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64606257, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 195 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCW7KCKK4T3KZBP4X2TT2UKYOZPJH52TPFDZWNUXUIW2PDVRDNZJUPGE" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64607691, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 196 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GB444W6G4PHTTCSUA7FR5JNVSN3GMXRE6SBJZ3VKMIVEEYAYFGEPHC3H" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64608024, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 197 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCZZV7L6SJY3KDPUCSXD5MQCXOYSZA22WTXYX62M3RBCRNXE7J4ZJHLV" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609994, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 198 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAAZEXTYFCDS2QNXAYKVCMAUJLUZACWVOQ2WVRUUEIXC6ZKSHC6GDU5O" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610286, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 199 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GB2DG2EQGAUIW6VFQ5I62RMXJBWUBAKYBKCY77Z7UEJUCYHX4IPEGEOA" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64240078, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 19 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDTEKTRGDPHBT5UTUHYTJR3JDZDPAJ4ZNKFOUROFSDZI72POQJM3RBXK" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64216055, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GALE3JTPDC3NR6KV3RWS42CCAQVFCO2IJYTMTBODAG6ET42P65WEY4CV" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610669, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 200 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCE4LIJFKVHC7DCFHMTAURZFHXT2EWUVDOFMTKGA7WDGZ7VVRSQYNUER" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610945, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 201 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCK7E564LET4I42RNS2CEERKHCIUAFJLM2HNKK7M44IQRH4RB2KFPJU5" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 202 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBHSU3DNI6IZCVUTBHHYGJUUOVFYORPYKBOQFVBLQBCNOPGCKR4KB32U" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612252, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 203 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCNVUL4E4KBP3S6P7DMLHL7G5DFTIOEIMWXWITBGY3ZIDZQJKOFGDYWO" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612707, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 204 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBS3VO3ARGGIXRBHDSN5MZ3NTBB6HGQEMRUCE3E5PBPIEE7QCV4BZURI" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612808, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 205 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCTLMEFWQJ4F4VPJKKEAO4FZB5BQ354MGMB7TBNOWV63D6KN7ER34MHM" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613761, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 206 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC3NRR7ZZLRZAZL4WMLJMUXPXD2HXLYVWKTQOUDLLJP4U2LL7CTWTWJ6" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613955, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 207 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD2DEIBYTR4H6ME44J53Z7XQOGDDZEF3ZT2SGKXIQXTW46QFNMUT6B3D" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64245403, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 20 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDEHJYBPFQLVO4YIOG6USXYIZYHSBLLTIH5XAXX7ZARLNHTXPC6RQUQG" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64255095, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 21 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA67HUSONXSYG553UG5IDDIQSBH5Q4F2BU7ZYAQSIZ7L2IX43JAUXWAJ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64255124, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 22 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBHCXMJLEJAS7YIIQ7LM5MZZOZGWUTZOAJ65M6WUZTM6YCWKAL54RQLY" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64255160, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 23 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDYEUWPLNHSIZ3YC5B2WTFF2EFRVCHLEAE3BN4IMY2PIVU5OW6BTYXTS" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258430, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 24 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC35DGZ4HDRMI622LUTETV7W6MJH6GO5KM7FH4LNYMQ57VM3YRMBPC4L" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258512, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 25 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC6C6HXLFESMAVPIOG5ILS7WFQOD6TIWC7M4ASVNJRGTJXYZSAM634GC" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258549, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 26 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GB4A4YFSQTSKA46YNIDIDIRDOEKIXOCCME6RG45BRULD633KDQZABRJC" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263534, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 27 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC2XWR6TCACRQXGLJKBW4LFOS7ZHGEFC5QX6GIQPNCLAOK554BE4NVDW" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263818, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 28 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA6X5ENKESTG2CXBYC3DUWFZ3LKHDWSESUT3YK3N5QOLBP5V2EUUKXLS" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263930, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 29 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC7MQXJZ7FWEK42QSYTVEIKGBSO77EED5CKTILBWROPZ3J7LASINK7AI" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64220183, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GADZJQYATX2GFX7FOEHHKB7K5XQCDHTZTG2SSJA3SKL7MRKEZBD5EVJV" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264018, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 30 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD5AVPHJ26B4NBSLDUAUB7HI3XBFKUKLNOHKKK6EKYHB5ILTNA263PDB" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264248, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 31 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBZAMWZSJXEJZQJWOOHBM4U74OQQGQFFQWID5F4QOWUWHLPE7RI5CI3M" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264419, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 32 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAH4O6GYKLK2VZBSRWVKLLJ6K6XWWW3RPYG37BHA3J6SNW6WKW5MURKU" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264565, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 33 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD5B6W6W7DA5EJQN2OX7CJAVZW6EODGUUSGHBNFA7DSBNDY7KFDPLWFC" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264592, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 34 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCIYSZBHHDAD4HFTZKEBV2UC2XTAN76SXZMHWQFS2SRGUKGLBSQ6VFQN" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264601, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 35 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBJEYD5ZZXMPXDZJZ5OAHHDCK56TZDBTZ5WIWCXFFVGAK4AMYJTYFD2O" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264611, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 36 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDVGNWW3GMZE7TNCBCZKB5UZJMECGGLG4XB3FJGG5NFNHICRXWQF3AAQ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264620, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 37 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBHMTQZDOI2VVZMBBDQ3KAXMRJR35N7GFYRYK4NDSXAII4GAUZQJVTIY" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264628, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 38 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAWI2SC7R3U6H7I4YCCDMBTACYICY4ZZ2OTXSSTZ3QZ4DSEFXY2IAVLF" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264636, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 39 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDOAQK5AK4Z3TAFIMU4WMVJSVZECLK2NEVPRGG4CSO54ZWHFHBE6IDMI" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64221425, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 3 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GATJYZIXPTLOIK7F7XRM4PCHTTMVLWKHATECHLA4QOQUQ4LMCZOCGUKX" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264641, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 40 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCQMZAECNSAIMOVZWB7OFLJ6BF3JEL35KR42FG5WE6DIVT5TRLXFWXGG" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64271152, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 41 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCFN7SN46VC6E766HPZRMBWISI5HVRMGWFFMWPDGDKM5EVPXSLZ6T34Z" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64271845, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 42 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBLVHWN3K6J4KPPYIV7BMVELFVUM4UV4CRHXLPUBQ4SGZUSCVNXVTW67" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64273042, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 43 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBNXYGYADZN3OFMXB5HUDKXTJ66MLZ2BGVR22VDEXILALZ26BO7BEUDQ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64282055, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 44 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDGZXEANOXIJRO5CGHDUTWDARC43OBEFWZF2ORWCMGTMQD6OELJ5VQPF" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64288317, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 45 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDJUY3N2IVMYWPWL5CHEIGQHSMBQROELUHF4QTIMC56GVO27FLKDEPUS" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64298304, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 46 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC6Z7QLRJDCAMTP4DIJO77I3MBH7WHW444FYP7E6YJNACR4W7XACDQOX" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64300085, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 47 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCFZKKIYA4QFR2H2QZZ4QHRPZBUU7XRILEQHNYB2FTYRSP7XGP6F645Y" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64302334, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 48 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCCRAS23I66EM4AYUUEFVLMQYO6OQMPFXZWLCPWJYLPZW2RETQ324BRR" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64302366, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 49 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCYNTQNZYQLRF4ND3FAWGYFFYN3XSAGZF6WW6IGBTVRQXPIQYP5WRU2X" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223244, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 4 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBQ5NADAG6PXWTOZR3KSOAJJ2PIRB4CETM6NBIEUW6JCE3W2D3YFIU2U" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64311089, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 50 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBZIEOJ4VXBSNSLQQ73ZXLACAOU7PNR3JIOMT33PYE46UTB47PLIYIPC" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64312367, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 51 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCVRUOOSB53I2QNGBHMW4WMKPVULRKBYEIW3JPB56O64PMOJMCZGX5HI" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64313083, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 52 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAB6Z7XBXJDS736GUA7RXUSXSHZCDC5X23BB2OSN6UAG7CNKE4SXQGIL" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64313527, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 53 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDUHWGNSL6WL4IIYKP7QMEC7H4CAOX5Q65QG7JGHCPBRRXALLSE6WBP4" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64314187, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 54 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD6UB3JOFRLJ4DJAWJ53GFG5FXBJSZITL3LG3PGSQRLXGWRTMQJNQA7B" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64315541, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 55 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDMGYNO4UIGSZP46GRSUFR6IZANBMAK4XECGYCI5N5UIWQCTRVKOJWW7" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64316997, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 56 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GB4O24QI4GT65UXRBH2ZVXPKDCS3HF7UXSCW4ZBU4JUE52RAS7OS7GNH" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64318575, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 57 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDXURAFHE27EXW2L2HE4PQIWJEO7MXNROPZBSZ4XO2HQWTDNA4REUD4U" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64318732, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 58 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDWHA4JM3W57ZZMIZBZIQF4H7PZOACWVR2ZWOI34VJLBMFB6TCAH7KP4" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64322410, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 59 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAV4V6WZGMVPZM54DR2242NMUHV3JPVRLC7XDYIFSRU2WZIXLWQIKYO2" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223247, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 5 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCPT5TY7QL3G64O6LEDCJXULHXESZ6AAVGA5EUKKHGJSKODX4PBWSGFJ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64322521, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 60 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCLTZEUNUK6KSTI6OKMZCXUXQ44VIS2NTSR7RWFU2UMDZSF2M3WPKBB2" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323202, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 61 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GADWDDKP4TKUVNZVSKXFNFN6FXSZYIAHL35R6GEQB4M3QK3FNEF225YS" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323554, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 62 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64324056, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 63 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDATYNHFA7NFTK7NORYI2HENINM3LJ2MA2BEFGYK46POPG662WHB524H" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64325736, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 64 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDZ2HV576TOUH6MXE5NR3NOSZHELDXRQ2ULBZS3IKNFANRMTU4FTMIUG" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326729, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 65 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBJ7TIB5D7WQTE7DG7ZNVUJTD5AY663RPVCCRV5L2LQA3KUHUARAWJWT" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64327770, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 66 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDT3QTEWTO6MY4UDP6OSQ3CBBAYA7LQLFAMS5SDIA4BZIUPISEJ4DVXA" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64328418, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 67 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC6AMJ46H25FQJ4Y2F7VITAWKUEJCUKQWJDEM2OP6SWEH2WQJM4QTQEY" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329545, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 68 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD44P5UZ4XJJJI2KSHGYXHYR2R44Y4KLKPH3DQDKPBSJD65PSWQKPXCI" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329858, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 69 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAFVBUV7COXHXLQWL6VWB63AP6VXHTKIIM7KA4S2DZEXCEZJKANJQLNV" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223577, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 6 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCFCMBKVHECP3TLBPCC6QRHZJ3AVJDFZM2JGZDHJBW3NVVUV7TJYDLKB" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329903, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 70 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GARBDCXQS4LEIJL3DYSCES34OGHBMDKMAIIKFNHB7SENYSFPWVKTQXLH" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329959, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 71 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBYUOXGBUQ746GKXETUCY6TNE326DS2HM6CWBNXAPAEPBFI34IZL7RVK" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329965, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 72 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAMDZSTTRZ3FXHAIVZXSLYWZVRC57I4U4NRAWL5TLREOERRJOE6QPQI5" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329983, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 73 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCBLDIFSZZLQV2Y7XZ7UMY3B4UGBGQQRX636JW5GVCV3CFFMLFDJFC6H" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329987, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 74 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBZYZX3UDSZBK5N7QS4B3BJDGEE3BITVZWXFFQMRWT6HIDGK53FTESAP" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329990, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 75 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCQKGG22LREYEVUF4QAIMXT32SKGETGIWQZDKMYG2W6GZO4KJNGCVWXA" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329998, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 76 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCCKOGI4JF3PODDOKPICCGFIMWHGCRCEBAM6JW5ZBOCH3M5B6HC5HM76" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64330020, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 77 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBPT2QI464Z4YGYVFWZ4HZ4JCOZAB4N5TMVC3C4JAVLJ7VZ5TEFC2FV2" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64330670, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 78 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDOIC3LPD34KTKRTFOAMB6CKAYZNOIGV5V7H5YESTNMFSQ5JG5PMFS3P" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64347628, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 79 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBZN72COCY4J4755G4KGSCYH4XN353JWVIUD2OL6UYEAZ5VI2PZGRLXH" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223707, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 7 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBE22IVD5UZGE3BBGBPRIDYWZ25WUZ5XDTVVKXRYHLSD7KJK63QY3JNZ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64431116, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 80 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDGR7CBKULHMNJNCWPSS3TMNAOWK57PRKRQESDKZCR6LX4FU5ABFDUBR" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64352866, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 81 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBBZ5ARLATIB362OH74BIYUJ7SKZBZG2Q3WRPW6USGNLXPRYMRCT52PV" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64353136, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 82 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDRNFVUHSAEFPJ6RHROZNL4PZODJQAGOPUNDY7XHQKN7QGNFJZPNRJ6F" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64359735, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 83 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBWGVQRGKZJNJZP2SQMF6DDBCRST5J5O7HZMDS3HCWHJ7KZOIIYTPIM4" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64359798, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 84 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCP6XZS6WEONXRC44RG2RFHGF35EJNWT3HBKF2FFNDOWCYAC653323N7" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64363141, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 85 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBJ6A5DSSKOERUXDT2G2KNCJLRY32IJIT4QG5NQ644DHQHDDKDYAXQLU" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64366182, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 86 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBQ6SEKS34TMVVIDJAS6U3BP26D2YB246ZP3W5JCZALI6DYJUUXPYKSJ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367137, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 87 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDJ4K2KHJTAM3MH47NXOOPCRPKCKRVS5VLVGIBEK7BHVB6NPJNIOQLGF" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367196, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 88 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAU2MGBQZKRFNAASGQSBQX7LY6Z6DXEV6DXV234U3XHDUP5HFZUOJQ67" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367205, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 89 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDIWDJGCMGXXYGG6HPLNQHQV3KFOYXRKBSCKJZZNTMXELIFBS4D4ZSDK" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223816, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 8 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDCM56BZLWE46BDAXPZFSASAXWW3YQLPZY2AKF4FILXNDPREOVJMSONX" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367650, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 90 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBKKKVQR5YPXA6GERFMJYPSSMGJ43DUJPOPLYHUGEV3CMDNVAJDESFGX" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64379321, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 91 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDCTZYDD3YXCXSA66WRLLBYYM5Z6IWITBSP3T3AYZOC4RUAIFS6GJNM7" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64380430, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 92 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCETB2HL6ZPYZPJAGKTB2STFYYUBTFCIMCUHYIW5F5I5PJY2UPY6KZCO" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64388953, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 93 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCOHSWSJ75CEEHNRLYTK6R4ALEDJWFY535UOIFVCFHNSJSSIPKXB3NML" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64392919, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 94 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBCUPSMCHV6F5WGQ2F6GTVYW3A72O75U5ZBX2JI7UOD3L3EVAT2X2DBM" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64400758, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 95 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDH3X6UEA7BDMXY4HNQOM4RYAYSJNUT4TFSFWMF2F3ODG6FE7MZ5IMZK" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64418241, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 96 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA224ZNNKZKU7AX3UOOLVDWMMSYRXDHDKESM2YS3KVO52URJDCNMLKFY" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425799, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 97 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD6L5SNMVT5SXUG5OGXLGWQDBNVGY3OQFXPEZHA53PNEE5DAXOX4CDH4" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425807, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 98 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GACNFVACOQPBXJARGRKEJM2K5TD3RYJQM5RQV6Y3J3JH3BENWCI7J5YE" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425811, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 99 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBULATZ5EGBJ6R77RIRJVLHR4TEYRLMES4U7I7TVW4AOA3EDRMYKL2CD" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64225305, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 9 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBKEV6LBMLRLWLIVYZMVH2DVO7CANWFNWHWZI6IPV6VSXNI2RTGGYXQL" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64227353, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDNWNV2PBY54YRL45GVHRDHA737SEPL6BZMAKRI2IDRKUEP56GERIHDT" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64311866, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 10 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBZIEOJ4VXBSNSLQQ73ZXLACAOU7PNR3JIOMT33PYE46UTB47PLIYIPC" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64313252, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 11 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCFZKKIYA4QFR2H2QZZ4QHRPZBUU7XRILEQHNYB2FTYRSP7XGP6F645Y" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64322664, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 12 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCB7TCOUJXKWM4SQIKD5C72G6Y4WPKFLILOGMR7FLKOHPO7SC65I5WNI" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323352, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 13 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GADWDDKP4TKUVNZVSKXFNFN6FXSZYIAHL35R6GEQB4M3QK3FNEF225YS" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323677, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 14 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64324047, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 15 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDATYNHFA7NFTK7NORYI2HENINM3LJ2MA2BEFGYK46POPG662WHB524H" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326452, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 16 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBJ7TIB5D7WQTE7DG7ZNVUJTD5AY663RPVCCRV5L2LQA3KUHUARAWJWT" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64327810, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 17 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDT3QTEWTO6MY4UDP6OSQ3CBBAYA7LQLFAMS5SDIA4BZIUPISEJ4DVXA" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64336905, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 18 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCFZFN54GPXIVILU6XGGZXGA6UIKPAIUOQWVBEEX4RJHKSPEVKZ2P5QQ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64340114, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 19 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDUHWGNSL6WL4IIYKP7QMEC7H4CAOX5Q65QG7JGHCPBRRXALLSE6WBP4" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64238973, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD2KSWPRAFE24PS7ZRJ6JWTB4HA4HMPODUK62KTTTQTP6WWLA2N6AXZ7" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64344681, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 20 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD6ZYOSMNEEZAIJYKCDN7MDA6H2MUHQKYKM6GIYEQ52JU5GI4SSGMWL6" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64349189, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 21 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBAYJECW5TX6VC5BVHMHC3CXNGOCH7SMKEB7HY7PY3FA74ITFV6EHRKU" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64349918, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 22 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC33RPJWTEV5ND6DQ25SLT3GYDDPBZBQ3T3CT7R6QDY45YKJLLSTIJBZ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64352849, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 23 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBBZ5ARLATIB362OH74BIYUJ7SKZBZG2Q3WRPW6USGNLXPRYMRCT52PV" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64353004, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 24 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDWHA4JM3W57ZZMIZBZIQF4H7PZOACWVR2ZWOI34VJLBMFB6TCAH7KP4" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64353050, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 25 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDRNFVUHSAEFPJ6RHROZNL4PZODJQAGOPUNDY7XHQKN7QGNFJZPNRJ6F" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64359712, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 26 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBWGVQRGKZJNJZP2SQMF6DDBCRST5J5O7HZMDS3HCWHJ7KZOIIYTPIM4" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64361040, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 27 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC3KL2WTNWWK4C2KZFLKKMECF6JZVDXKHGATDIWQ7OJU3OHZSVUBK2Y5" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64376174, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 28 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBNKYCX5V47NRSXU6JVHZNUUG37GXVEM2VACRURJMES7NPKPG64A2Z5E" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64379345, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 29 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDCTZYDD3YXCXSA66WRLLBYYM5Z6IWITBSP3T3AYZOC4RUAIFS6GJNM7" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64241513, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBZNFITNWK2KBCHUERLOBCS6XBQC4LFKEEURYWM7G3AT55LWS3YHOWRL" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64381438, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 30 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCETB2HL6ZPYZPJAGKTB2STFYYUBTFCIMCUHYIW5F5I5PJY2UPY6KZCO" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64388918, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 31 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCVRUOOSB53I2QNGBHMW4WMKPVULRKBYEIW3JPB56O64PMOJMCZGX5HI" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64430415, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 32 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAB6Z7XBXJDS736GUA7RXUSXSHZCDC5X23BB2OSN6UAG7CNKE4SXQGIL" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64444487, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 33 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAPFD4AVZGSXJGZ6SQBM4VOVNAVCZHGQT7UXALJSNDZAN45DCBFNVFZP" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64465329, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 34 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCWYCR2NNOZMITJBLXGNSFAWT3YQDHXOIPUPCONCQZPRAUZGWDNGNM7M" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473451, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 35 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD4UNF3UMYMI3NA4RZGPRYIDELND3RAS2LV6LTJKNKWHBAZVSI4GELOG" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490194, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 36 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBSXTAYAIUG74OCSFQQ5W4CME2WLMQMQBTPSPZDG47XALAL42D6IULES" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490680, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 37 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA7YDWNQYXXLAWBZG25MH3XI2QATNC5CVZZ7U3IKWEWCDEV4B6E54TLM" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490740, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 38 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDK2HMIISZ4B5RR5EEA726OJEVRQHHZJHDM7SVB2Y7K5XCRI33QIVU3H" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64563490, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 39 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCDD35WKILCDXEKL275OFVXPZBYN2DCTOEIXJZY5W4A2ODWEXK3CU7RH" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64256892, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 3 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDHEFAG7XPZ4UZXDT7OT342PYTCF7OQQ34LZJNOWK5CLRLTLXJAYENKI" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64502292, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 40 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GATRUJAWQWVWSSXYGUDDXPDQG4EGHNIQBMYCBYWX7HVZJQYYAMPYAHKL" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64511098, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 41 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBMFSMT3OK6T7LOWJBINEAGN7W26GLOCAFOV5GQU2ORSHI6Z2SBFP3OM" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64521140, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 42 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDFZJIBTR7JFFH5MSTBWVXPI3ZB5VZAJQDYRHAZ3EHK6TCIMW4NPVHWV" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64537806, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 43 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDRA4YPSRYDIG5QPAB2WISP3V5SGRCJVID2MZHI7UVCPCZGB3JWCZZAZ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64540447, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 44 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAJJYKVGLTGP6A3ANITXSKM26FT5OWLOV6MLWQPGHMOLWGSXXPRNOAFM" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64542112, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 45 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDJTYHSIWQG35TO6YFFJ6GB4RWFFJH4FMWQNG6BW7DGXHBIWESZXY66S" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64548617, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 46 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDP25U2QVO5LSHQRG36UEFV3EU2B7SGI5QSKBWHMGZILOYQM5T6ZLDFL" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553013, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 47 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA3NAZYKIAQWJHXCUORX3FUXZCCMWRFIKJFEDMLEUFMCWELYD2LCDWON" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553077, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 48 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC3Q4CJXKLYESHLL4C34CT3ENOT4TXDO3W4PRIQ3C7TC4FHTRAQ5S37J" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553203, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 49 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDQRHRIHCEFBBBGV25MVVV4CPOZKGC3L2WE2VEAJP5YU3MGYSXU472DT" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264367, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 4 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAH4O6GYKLK2VZBSRWVKLLJ6K6XWWW3RPYG37BHA3J6SNW6WKW5MURKU" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553584, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 50 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC7PKCYZRRDRT6HBGPPON4NKQGHKNJJJQ7JN74TM5XBHFH7JBVI7LBR6" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64555426, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 51 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC6NCYXDLUZ6KYJBVYJ6MSIHORZYGTL6T7B6GTLF4CCI6AJ6SBVF3NUQ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64558228, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 52 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC3OLVPNJYDH26LFK4B4PNVFRGDJYUCMSGJVDJQ3UN76FMLJE77VTX6S" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64559191, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 53 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC2ZO2H7SYITX7AXBGOJNQHRGVWSTABIKHROFFE3ZDBYUOGGBDJ5ASHK" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64563922, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 54 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC4ZC6F65CYSIN2TT6XO5BZ4GNYZ2TCQIVGBRMCHUI2QMPOQISORL6DO" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64565073, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 55 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAJOAYF7JRQNPAFECS7SDYAKPPZHEUVSDMHFHPKYWYWECIDAMTTFUBRW" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64566539, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 56 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDKMSQYPV3M2ZOZ6ELXDVQF5YWYEZPJIQA2XODJOGHZ57PE2XAD3BD7O" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64569906, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 57 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA6UANZSAIOSKXKPYXEYLHAUNTQOJNKUIKCPGFNU6RVVTPJDJJNHOJYH" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64571749, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 58 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDE2M7YEYHQIJMR4I6HD2AHUVJEYPMRSHY6KLWM2C6CIJYVYHNQW5JJP" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64580318, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 59 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA4DJDM66BZLZ54K7GLZFFPKGBNC44IPZSHMMZ6G7YY5TOQH3N5T5HAM" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64271512, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 5 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCKAXQ6XLXOJ366C3P3VVLXU24X2UQ3YERWL5VNX2C77E6U7C6KTAAVJ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64582915, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 60 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBKOUX6KOXYS2PNX7U66OVTHWW4GW2JGQF2DFWHO64N3Y2M2BF5DEGBB" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64584892, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 61 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCCZVSEE77TOK6QTPLUNUUFZ5JOHFQJNXJCN63FBW6VEVLQ676RW7UV3" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64585926, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 62 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GADGXEIP2NEIJ3723RFTFCSPVJIJVM42RTONINH4MRTMUV2KBDFBORF5" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64589963, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 63 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDOLN2CLLI2KI6CVENF2NWCL36NBONRP64P5MVAIP5CPT5QWQCFYYWYV" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64590230, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 64 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA25XFBDROFS3V53RRGHGN5IY2LQFP3HO4IFSOZS2SAAQA4DEJ7JHWX4" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64590320, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 65 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAYNG64UV3AS4PK5CAAZE65HQYBVPYEAAGSK4YMSIW3DAT6GZY632N62" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591593, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 66 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC5P3MKC4MK5IE5IJYQVLPS6EVSHMYUPOYWPS6AAQQ7FUEF32G3H4TRJ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591761, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 67 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAAZEXTYFCDS2QNXAYKVCMAUJLUZACWVOQ2WVRUUEIXC6ZKSHC6GDU5O" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64596126, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 68 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDZIGG5CNRL45CAWPFYTJ7K6JP4XJIS7DF6T3OIX4NVIU4F6C6E7JIH5" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599740, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 69 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCIR3QJXGKOTEDVBNFAJOG7WZ6CWI7NYAHWYT67F5CD7ARKXYWRF3LAD" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64278949, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 6 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCP6XZS6WEONXRC44RG2RFHGF35EJNWT3HBKF2FFNDOWCYAC653323N7" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64603476, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 70 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBF5JQPKGAH73ENUHNY57YNX4R2CDAGSRQW43LULFKNHP42DQR5XI53P" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64605244, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 71 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAHCZAPDQH32PUCAUSIA6YUHRZP37C2RHNN3IHBW35JR2A4W6IQZEFKE" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64606654, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 72 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64607938, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 73 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCZZV7L6SJY3KDPUCSXD5MQCXOYSZA22WTXYX62M3RBCRNXE7J4ZJHLV" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609321, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 74 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD2SOPA77HAN6FUAT7XXCTC6EVRL3WWN5OZ7VYNZY2WBZP4RKNQVV2IG" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609893, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 75 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAW4DTRCC6JEBXQN53RYX6D2TZZ3Y2EUBF54HC35RR6TOYCHCCUQZVI2" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610272, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 76 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GB2DG2EQGAUIW6VFQ5I62RMXJBWUBAKYBKCY77Z7UEJUCYHX4IPEGEOA" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64611674, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 77 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCK7E564LET4I42RNS2CEERKHCIUAFJLM2HNKK7M44IQRH4RB2KFPJU5" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612242, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 78 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GB3EXLNQXLMQIHHIRT2RRMSUJVZGCDSJ5K2GSIQ6H7CQZBDXCMWLD4XQ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613249, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 79 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDC7HWCF35MCND4IJBTSVBOAKR4BG2HI45R345ERWFQGML2HS7KGGDLQ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64290460, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 7 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC35DGZ4HDRMI622LUTETV7W6MJH6GO5KM7FH4LNYMQ57VM3YRMBPC4L" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613315, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 80 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCEE54NZQVKEPPYF5BUWJHMGRORKIRJIXQYW3IFIMHTJIYLSBWPYCZ5H" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613922, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 81 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBTCII43YUWJ4Y6KUZR46SP6BJLWLJWUYVHVRGMANY2XR5RG35FXRR3S" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613951, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 82 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBISWUA6YYUXWP5LZ6HEQSUSAGYLSIQPMVJOOPELXNLJNFSAI67DAYK5" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64294465, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 8 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDGZXEANOXIJRO5CGHDUTWDARC43OBEFWZF2ORWCMGTMQD6OELJ5VQPF" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64306440, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 9 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDAHCRUEUXSLIGGYPCKBHQT2TWFTNEII62GAHGJETGOON5N4I6XPLFVA" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64470394, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD7X75IVSNG2O2KULMFUOFTXZEIGMRYSVIJRUNQ74RSVOPA6W6IRTZ3S" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476688, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 10 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBKJMLBPFWZTUVBJ5DFQJGJLDHR52JHJTAOO3JDPAILRTABKGR2A2UUY" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64478094, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 11 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCZJMNAUIQ2U577P4RA6JQNRX6LABXZGQWBCJAKERN46GU457K6C3GQW" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64478167, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 12 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAUB4KOF5DQRW35B6Z6Q5ZBJNGCWZY5F55OFYDW5OD5A5FGPN5VPBEBJ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64479234, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 13 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC7QUT5CLSK35R2C5JI4LP4P6W47K6RJJARZLPTLVLTJ34YVZIFRKLTY" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485056, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 14 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCXQ7ZGE45A4SCBQYRNZS2OD3MZF4KSELDJNBEQOKGOR6RKTY6OGABUZ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485104, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 15 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCUKUSWC6GI2UMBIGLS6IECS2BVDDCNBRVFR4QUHXSKMF47MYBYBMJ5V" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485238, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 16 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDYKGYYSOGYXBOIYOOO5MNZKVT537H3C2T35UIIXWKVXTZRLOKR7DTS5" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485370, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 17 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD2KSWPRAFE24PS7ZRJ6JWTB4HA4HMPODUK62KTTTQTP6WWLA2N6AXZ7" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485393, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 18 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAMH2GEVQXETLZGAFWMIU5RKXSRON5UFIMTWX3B7JMTJ7QG77C46RLNO" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485594, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 19 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBAKTZONDEPRZCAJVS3LPLCT33OUW2UV5ZSJFBWMIEZDZXLKLR6GH3TG" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64471296, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCX3NIFZEBAVU6DHZ4O4ZVJYTEMVBFDXVHX6V6PV2N4EYPCRFBP7GW3X" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485992, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 20 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBU5PAXAFBGLPYZRCWHUFFN77737DN6CVRSRQP67IBMTEX6ZP553UKON" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486073, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 21 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDKMSQYPV3M2ZOZ6ELXDVQF5YWYEZPJIQA2XODJOGHZ57PE2XAD3BD7O" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486172, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 22 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDJTYHSIWQG35TO6YFFJ6GB4RWFFJH4FMWQNG6BW7DGXHBIWESZXY66S" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486466, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 23 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDMHMOM65BWYHVYJRXPYDCSXT4WPP2XMZC6OR5V3NFNJWUEXQR4YPUX7" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486556, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 24 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA4DJDM66BZLZ54K7GLZFFPKGBNC44IPZSHMMZ6G7YY5TOQH3N5T5HAM" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486858, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 25 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAXWC6RGYLTDCLD52LLRUVTHW6RUE2QYTMSGGUMZMZBFAAZ4E4GTURSB" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487023, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 26 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC3BD233YVEL4NVYZHQ2IHWQNNYJQTVDQGY3R357A77PU3KAO2RH2AUF" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487063, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 27 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCFM2ROFIA7AGJ2UER2GVWIKTNWY6UZGYX46TP4FGX2CGJZZ643WVNJJ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487180, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 28 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GARDPYJY3URSWQWU2CSOG4JQHBD3A2HK6EOQHUEPKDWYNNUPL4FDDWS7" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487659, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 29 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCN5RTDME54YCDS4LJYWDGX3ASD6MYURMVGAYPV24LWW6KYWYDMDZKWQ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472984, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD4UNF3UMYMI3NA4RZGPRYIDELND3RAS2LV6LTJKNKWHBAZVSI4GELOG" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487829, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 30 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBNQO6SYESAPXFRZOOFJUMW7QQL2DSNAC3IQH2XWOGLPEE2S3SXSU77D" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488011, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 31 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCXEAJ7WYM5ZR5O56OHCMWGKCHRSGOJJVRGSCVNNLSENQXDAGIVPSU72" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488075, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 32 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA25YVWWZN4AME3HS3OTPSDEAHC7DQXEQXFLZHDLCKONARU66ZGCXMUE" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488251, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 33 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488310, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 34 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAOAE5MEJCCWMBAIKDGD64UBHUX73SE3EBVV7GW5UWJK6AHZSUWA6U6H" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488724, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 35 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GANHXXHJWLACEFFSZJOQSTAZBBRV65F2G5CNS5J5YBOWROWIGUS4E3R3" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488941, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 36 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBI7MHCOBO56HPIOJ4WBDZIAZB2WB3YBJYBZRLAWIOMSEKOMJTKNBMBX" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489094, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 37 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBNAYCLP6TYGS3NLUCHUHWHCEKUNX3B5UQEMO3K5BH7ATG73JBV3XTXO" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489189, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 38 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCQ5VQGWHOKPR5MRI52TJNLOGJMQGXHI34FICOV47G2Y4NIDHPVDFR7G" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489307, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 39 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCE4LIJFKVHC7DCFHMTAURZFHXT2EWUVDOFMTKGA7WDGZ7VVRSQYNUER" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473380, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 3 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489511, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 40 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC75TVZ4HGQF7PF4LEAT5Y7OONTTGUQ2I275A6AOR5ZHRXQHYCREZRTC" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489532, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 41 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCIBOCOAT3JJJWEEGATGHLM4GFR75MDW5G66UXGLXKB27N5EOSKT3GFD" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489739, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 42 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDI3IFSW6CZNMF7XMBME6YYUDBE34UQ67QZR64PNRIJSZUR6YFH7UI5L" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489869, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 43 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBCQCUF56FZ34A4LIFBUMSGQ3PD2HONTADI7OZVDW2LQ5I2NPHXE56UK" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490048, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 44 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBVUU2XPZVGPNMOW7TDPI7CPJ2RL2EPD33AB2DZUZLIKGAVECTKIIFKV" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490193, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 45 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA6WVPSKHSY5SYBSQLYRQILALJRYDJKCJ24GMZVA3SW2BI3CBGHDKEN3" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490237, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 46 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDK2HMIISZ4B5RR5EEA726OJEVRQHHZJHDM7SVB2Y7K5XCRI33QIVU3H" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490475, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 47 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDL7S4G5BGQECSBNGAVTLMZTICV5MSO5GNPRZBNJEWDXWR5NENHUEM3U" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490635, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 48 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GA6UANZSAIOSKXKPYXEYLHAUNTQOJNKUIKCPGFNU6RVVTPJDJJNHOJYH" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490867, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 49 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBFEMXAVBW2JSNVFQQKHWAKOAO2COIMZOIIKMRE6OL63R74SMSWFIZLI" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473460, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 4 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBZFPXM2L6ENBLXBPUOXTVUIXLTI4TRAZ6N52NP2FNWRER7R5ZETVSCG" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64491027, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 50 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDGU3HWNHGZX3T7LERAOCP73TYESCPT6QYOXNBY7JPYWIM6WKJWHSFCI" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64491521, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 51 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDOR4CPOMWGJIYUKLHUAWG6YKG5O54W6QXU4W6HSB5I7UIZ3GK3LFGDX" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492070, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 52 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCZ5BVJDG7OVI6GUEA3GPBGQLMJLSJVAFND7QWZUEC4KDYMB5HSA2SFB" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492232, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 53 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCZINFPZ33TOWAMT4A52UU7P5ZZURRYFQUHP2N3RSSKVGXHX6AWDWCOD" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492337, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 54 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBT3QYFC2VJRKTWAW2JJ4ZGUSOSXJN4T4XHSLYCB7BSDRCQOA6YIATJG" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492415, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 55 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBP2P4JAKP7ASHKSOQABFRSV624LYNS45NE57ZOMUJD2E2ONBHP66MRJ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492536, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 56 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAJGJRHG6ISSURFHTMSG7SI3PVS5XVME7OJHOAMP7BRHASSIZQHUOS6E" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492554, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 57 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDGNENZ4B2HIZOXO2LUVTI4MC3HIT6LWOX2LAMTMGSGQ57MSFE5ERJIT" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492651, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 58 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDWVOFFYGIYWYTRKPXMNUES7NHAJWEUKEUL423DE36R23TAJO5Z7Q6LT" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492866, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 59 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDUYVERC6QT6QQZ3SCBIZYRAJH6E42JZQHUFG6F46Z4Y2OM27BK4WO53" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473715, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 5 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBLW2D4KJQTSPLMHBTQ3F7Q4W2KNJYPT7DUF5P3FVRIC63CZOQEHGPDQ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492879, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 60 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCX4YJNRMCNCXBH3DGZ7HWAXXLXFBRSJWU7BNNSEDMREYSGL35I2AN5H" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493102, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 61 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDXURAFHE27EXW2L2HE4PQIWJEO7MXNROPZBSZ4XO2HQWTDNA4REUD4U" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493186, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 62 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDOJ3XPIAHCYG26SGBSJY6KJDIATCNHEIV7WGFVL7WAY5XX2KRDVA47Y" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493733, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 63 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDBY6AK3PTYQFDF6L3AV2RQE74V3KSKVJAT7GEV6TPCX3KQ7C6QCKPZD" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493834, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 64 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBBIXKRKYU4XVEWEZPQ6XE4HUIEDI26OOCANJC37AJCUKYGQANFMEVI7" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493955, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 65 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAR3M54VVNPAC7TKQZVZZQTW5LLXV6UL56VAD3P3GVM4FQNTJNEI6WPV" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494333, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 66 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCT5HH53MXGEX7OQCPRBM5VBYPWMXFTS7VFIAA77K2UDSOGXZONH35CK" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494481, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 67 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBWGHKRNC7CAR4FBY7FQTTTKEJGTPL2L6RTS7RIXDEPCIEG2ZXCEVF5I" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494593, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 68 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GC5DALRCGWSK4PZDOK7I47EGJGEENNGBZMTBNQAZMPMPQKFYOKQYLW56" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494600, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 69 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCPXZWNP7AD3MVOLQFKVCDMXITHI6ZX4LL5JYLS4XQNPEVTF7CCKXYMV" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475486, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 6 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDO3D2K3TFJSEB7GFKMUGXVCFFIEXRGNPXZTRJ27KQLYEZDDCOBUZV74" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494791, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 70 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GD5NEGKB7H2E74FQPY2ZVZRUGPHW6AVJIVUX4TVNZXVZATLWAJDU7XYP" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494875, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 71 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GADCI46FPSCQ4GWCJBXZYLPUTIIYV5OFR5JFRU7ABFMO4AH7W2ELUGAP" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494940, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 72 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCSYQ5IDWYTRFX36UAIUOLG6TNWPKTP5MJ73FLV5R4ETQ6BQORU6M4FI" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495134, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 73 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBH5L3YEZICNEZV4GXJ6LYNG5TIAXRELYWZYBKUOZI5LOFO6CLUT5GPY" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495638, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 74 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAPS5LQAH6LLBRSFX23COJV6NAN32T7SMX5Y3BRQZIIFMRZJCRWLOQWT" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495898, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 75 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCUKGEAU7QNUFG4CRDNJZYUA2XR3AETEVS6MDH3GF5DY5LOEYC6HDQTD" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496002, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 76 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCIR3QJXGKOTEDVBNFAJOG7WZ6CWI7NYAHWYT67F5CD7ARKXYWRF3LAD" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496861, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 77 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GAHLSHD53JDVKMPIOZNB3GNKTQXYCLS6R6FYX2BGFEWDCBHV2JMHUCVK" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496872, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 78 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDC7HWCF35MCND4IJBTSVBOAKR4BG2HI45R345ERWFQGML2HS7KGGDLQ" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496981, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 79 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBYXAGK76FXYNAD73E5W6O5UYD74MR4F6N74O5JHOSOMU7A5Q7Q2O6U4" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475731, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 7 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDLVB47EHGB6DBTAZHC24N5VGC5B5JGAG6NTBJ3O23JXLONDWLIQVJVL" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497100, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 80 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GCIFU4XBA4JFJNR5CJNDACNTXMTUCW5LU2XTZ5V6PYIGQF7MIQEYGUDH" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497105, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 81 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDGVNX64C46N2RGQ7E7EW4RKBG6PZ54MPWSWSSOYZA2LVSLY3NXBSC6R" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497291, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 82 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GDENLMKPPVI7HYVJWRJIB6Z2AAIQNUKT7VSG6VJW4WGR3VAC5MAY6IQL" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497309, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 83 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBPA53YAWB3I6CLSEPX6D6BG6SOTP6G7OJVSEPJ4QUTBHLTRWQC2YTEI" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476163, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 8 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBVFPIPPCXIW2GCUEA7WTOYZJ32VUYNO7GUZSB6DCAYV4G2IJ7JWS43O" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476489, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 9 + } + ] + }, + "durability": "persistent", + "val": { + "address": "GBDVM5H2HUR2UJU4U62H3AO3B3QA7XXRPOMJQYWKBJ2UT4G7CKKCHXRS" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63716826, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantCount" + }, + { + "u64": "271539957145796609" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63829801, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantCount" + }, + { + "u64": "271539957145796610" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 5 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613955, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantCount" + }, + { + "u64": "271539957145796612" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 208 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613951, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantCount" + }, + { + "u64": "271539957145796613" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 83 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497309, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantCount" + }, + { + "u64": "271539957145796616" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 84 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63716826, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796609" + }, + { + "address": "GCPX5J4CXKA7KFIJEGUIR63SR6CKQIEGBFSAALMFLE5IURDHXJ66KFKL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63817349, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796610" + }, + { + "address": "GAMYN5NNVOY2O4E6PTTAUWFSVA2TYKHFJX2Y4N3XW4MX6KSH6WXJJQRU" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 3 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63829522, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796610" + }, + { + "address": "GBKA233FZEZ3QIZVY4BH5IO3UZMZQV7UHPCJVXB4FYCMEYBUSPRYB3DA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 4 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63806525, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796610" + }, + { + "address": "GCFRGHJSLBUIN536Y2K4Q5KGKE2AXSZPQZW37ZH62VCYD2XSEWBNZWNO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 2 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63799235, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796610" + }, + { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63829801, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796610" + }, + { + "address": "GDRZCJDIVZTOLCQRQWTVCB5UUIJOGD3P4SUZ3PAABWXQJL63O2OFJ3XL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 5 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64418241, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA224ZNNKZKU7AX3UOOLVDWMMSYRXDHDKESM2YS3KVO52URJDCNMLKFY" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 97 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574604, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA25XFBDROFS3V53RRGHGN5IY2LQFP3HO4IFSOZS2SAAQA4DEJ7JHWX4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 175 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426690, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA2CWWXT26Q4TNNRHRSV674ZF6OWCNDW5JAGEEJD2FB3CBDKXSEVLWNU" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 115 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425906, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA2MMWELTIH5IUJE7CWK6AW7EAMOZVGKY3F3GBNFVSQFYE5W52VBAFTD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 107 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64552995, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA3NAZYKIAQWJHXCUORX3FUXZCCMWRFIKJFEDMLEUFMCWELYD2LCDWON" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 159 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64560480, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA4DJDM66BZLZ54K7GLZFFPKGBNC44IPZSHMMZ6G7YY5TOQH3N5T5HAM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 167 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64255095, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA67HUSONXSYG553UG5IDDIQSBH5Q4F2BU7ZYAQSIZ7L2IX43JAUXWAJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 22 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426628, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA6QAJ6TMPTODF6DOMLU6XI7VD6XYYYM7JZA6PPAWNNQEF5454NQ2ELN" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 109 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64538458, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA6UANZSAIOSKXKPYXEYLHAUNTQOJNKUIKCPGFNU6RVVTPJDJJNHOJYH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 152 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263818, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA6X5ENKESTG2CXBYC3DUWFZ3LKHDWSESUT3YK3N5QOLBP5V2EUUKXLS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 29 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64595220, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA7VIS5CL6LXI23TADDI5TTKZORASCUQDJRH6EKF2TPLTNMXS5MJUFWF" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 191 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490349, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA7YDWNQYXXLAWBZG25MH3XI2QATNC5CVZZ7U3IKWEWCDEV4B6E54TLM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 135 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437802, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAAJ4XUODHJUC23YRMFVTS5M73S5ZZTQSZIDF2ZOSA5P2COKXJOTNUSN" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 126 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64435448, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAAKMCBKEHJHWVLYR6CSX77AYAFYMAITCUI4GM6EFO54V6OSCKA2KONZ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 118 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609994, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAAZEXTYFCDS2QNXAYKVCMAUJLUZACWVOQ2WVRUUEIXC6ZKSHC6GDU5O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 199 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64313083, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAB6Z7XBXJDS736GUA7RXUSXSHZCDC5X23BB2OSN6UAG7CNKE4SXQGIL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 53 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64586456, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GACELCRF3P7PBSFLSPHHLK2YIQ6WNEOZGBN3EJ6TMLCMJPSVDAZDXDDM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 180 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425807, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GACNFVACOQPBXJARGRKEJM2K5TD3RYJQM5RQV6Y3J3JH3BENWCI7J5YE" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 99 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64213360, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAD2PJIY4WZIZM3HIWB4STXDGQWQ4GFFDBQYIOEAEGVWIQST53PVU6B5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64568043, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GADGXEIP2NEIJ3723RFTFCSPVJIJVM42RTONINH4MRTMUV2KBDFBORF5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 172 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64539293, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GADR2KUYLHAZNUH7J4IPC4QOFKMJS2CHTXIUVMRFLI536VL3XPNTEUWZ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 154 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323202, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GADWDDKP4TKUVNZVSKXFNFN6FXSZYIAHL35R6GEQB4M3QK3FNEF225YS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 62 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64220183, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GADZJQYATX2GFX7FOEHHKB7K5XQCDHTZTG2SSJA3SKL7MRKEZBD5EVJV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 3 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64588133, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAEVYIB4QUSGU2GPEBBEOSS2B6ATCZLIQ4ZNF2IMIO2RAOJIEZDQY2YX" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 184 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426699, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAF6ML2FAQIT7GPP74FRUH4DDEOIMPJENDKBJLMAEHY37B7RTEBTIYOP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 116 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329858, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAFVBUV7COXHXLQWL6VWB63AP6VXHTKIIM7KA4S2DZEXCEZJKANJQLNV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 70 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264419, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAH4O6GYKLK2VZBSRWVKLLJ6K6XWWW3RPYG37BHA3J6SNW6WKW5MURKU" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 33 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574737, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAHCZAPDQH32PUCAUSIA6YUHRZP37C2RHNN3IHBW35JR2A4W6IQZEFKE" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 176 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64567911, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAHDDTSTE2P6JSTUBYIHZ566S2MT554CYJBJIU4W4Z3P3T7XKLGA2TIK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 169 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64587482, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAIR7XYIVOIEADFWYP3TNHDBXBIB2DVASZRSIYRJXBCTPCA7KQDJVANC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 182 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64229868, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAJA3EEWG5SJDV2OSC7NBAGQ4OFEC64DFO7GKTK5J6A6SXDEO4EQ4CRM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 14 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64449629, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAJJYKVGLTGP6A3ANITXSKM26FT5OWLOV6MLWQPGHMOLWGSXXPRNOAFM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 130 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495699, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAJOAYF7JRQNPAFECS7SDYAKPPZHEUVSDMHFHPKYWYWECIDAMTTFUBRW" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 137 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574784, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAJWVQLHXY6DFSC3CMWL6YZNJTQT7SRD4BOZHQOVEHHRLP535VJ6JH6O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 177 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64216055, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GALE3JTPDC3NR6KV3RWS42CCAQVFCO2IJYTMTBODAG6ET42P65WEY4CV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 2 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329965, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAMDZSTTRZ3FXHAIVZXSLYWZVRC57I4U4NRAWL5TLREOERRJOE6QPQI5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 73 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437608, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAMUGU5B43ZFG2BW2DRMEZZTQI2WPYU5BGOXTVJT6UA23DKKZLXGMSKN" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 120 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64239111, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAOMRKOZJOXUHI3PHRPRQUORZ4NXZVSCRZSHDJJYEYNFBWZIO5WMRZJ3" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 18 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329903, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GARBDCXQS4LEIJL3DYSCES34OGHBMDKMAIIKFNHB7SENYSFPWVKTQXLH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 71 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64532030, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GASEQUQAP7QMLZK4VMNQLMGKLZ2GR5XJ3MTO5C2RA22RKDKHEPRKKAHU" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 150 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64536143, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GASWMZPKDGCQCKDRYQCGVD7FF7D2NRWUOG7KSDDO4XGGN7XETX5OEE4L" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 151 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64221425, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GATJYZIXPTLOIK7F7XRM4PCHTTMVLWKHATECHLA4QOQUQ4LMCZOCGUKX" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 4 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64577954, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GATTCGMJ2MDHDT5TBQX4NGMSHSMTMCHXRVIKPBES6JM5VGZSHC45OGJC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 179 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367196, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAU2MGBQZKRFNAASGQSBQX7LY6Z6DXEV6DXV234U3XHDUP5HFZUOJQ67" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 89 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64322410, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAV4V6WZGMVPZM54DR2242NMUHV3JPVRLC7XDYIFSRU2WZIXLWQIKYO2" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 60 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264628, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAWI2SC7R3U6H7I4YCCDMBTACYICY4ZZ2OTXSSTZ3QZ4DSEFXY2IAVLF" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 39 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64436749, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAXFCHETKZD2SH45HJP4RCNGRDPPDSMFFSJX5P44V54XFHEDYXB4KKAS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 119 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574382, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAYNG64UV3AS4PK5CAAZE65HQYBVPYEAAGSK4YMSIW3DAT6GZY632N62" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 174 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610286, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GB2DG2EQGAUIW6VFQ5I62RMXJBWUBAKYBKCY77Z7UEJUCYHX4IPEGEOA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 200 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64498971, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GB2LBLRAJMXCNQ3R43GXJ7PLQBIPFDBAUEQO4ZKBTOHKNGCBHKMWKBIB" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 139 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64607691, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GB444W6G4PHTTCSUA7FR5JNVSN3GMXRE6SBJZ3VKMIVEEYAYFGEPHC3H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 197 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258549, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GB4A4YFSQTSKA46YNIDIDIRDOEKIXOCCME6RG45BRULD633KDQZABRJC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 27 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64316997, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GB4O24QI4GT65UXRBH2ZVXPKDCS3HF7UXSCW4ZBU4JUE52RAS7OS7GNH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 57 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64556953, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBAJXEV6RQSHLNXIWQJYUAVFZTOQOVN4AAN76EKUQFNX6YPTWEDTAWNJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 164 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64352866, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBBZ5ARLATIB362OH74BIYUJ7SKZBZG2Q3WRPW6USGNLXPRYMRCT52PV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 82 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425864, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBCI4C4GGIYM2C2MFRFOTULRATO46JM5DLO2WNBL42LQPOO3PEHXU3FH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 103 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64392919, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBCUPSMCHV6F5WGQ2F6GTVYW3A72O75U5ZBX2JI7UOD3L3EVAT2X2DBM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 95 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64547244, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBDVM5H2HUR2UJU4U62H3AO3B3QA7XXRPOMJQYWKBJ2UT4G7CKKCHXRS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 158 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223707, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBE22IVD5UZGE3BBGBPRIDYWZ25WUZ5XDTVVKXRYHLSD7KJK63QY3JNZ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 8 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437617, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBEYGVKWVZNB2MYLOBAQVGATNKGJ3ZK5SYHYS4JUXU6PKS5QHWPEDM6W" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 123 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64603494, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBF5JQPKGAH73ENUHNY57YNX4R2CDAGSRQW43LULFKNHP42DQR5XI53P" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 195 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426577, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBFRBYERVZWUK26QRHHMVSPMUG5N2Z5BZHTZL5QMHUIXLECF36L454LS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 108 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64542673, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBFW6RSAV6YPDKIL6QEYE5R6M3KROSQ6J7DYWFNQ2TT3FMT7POUPJCUL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 157 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64539238, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBGARGMSDMLW7I4ZPRD5HTGVAEOUJG73PPGBXZ7C7AP7DKXV6TK3QTRN" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 153 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64255124, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBHCXMJLEJAS7YIIQ7LM5MZZOZGWUTZOAJ65M6WUZTM6YCWKAL54RQLY" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 23 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264620, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBHMTQZDOI2VVZMBBDQ3KAXMRJR35N7GFYRYK4NDSXAII4GAUZQJVTIY" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 38 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBHSU3DNI6IZCVUTBHHYGJUUOVFYORPYKBOQFVBLQBCNOPGCKR4KB32U" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 203 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64363141, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBJ6A5DSSKOERUXDT2G2KNCJLRY32IJIT4QG5NQ644DHQHDDKDYAXQLU" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 86 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326729, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBJ7TIB5D7WQTE7DG7ZNVUJTD5AY663RPVCCRV5L2LQA3KUHUARAWJWT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 66 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264601, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBJEYD5ZZXMPXDZJZ5OAHHDCK56TZDBTZ5WIWCXFFVGAK4AMYJTYFD2O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 36 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64225305, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBKEV6LBMLRLWLIVYZMVH2DVO7CANWFNWHWZI6IPV6VSXNI2RTGGYXQL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 10 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367650, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBKKKVQR5YPXA6GERFMJYPSSMGJ43DUJPOPLYHUGEV3CMDNVAJDESFGX" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 91 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64232430, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBKOUX6KOXYS2PNX7U66OVTHWW4GW2JGQF2DFWHO64N3Y2M2BF5DEGBB" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 15 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64442651, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBKPM5RCXJDRYLHTDETCCXM3274GNJY6BTFDMNNESTMQI3NDSC6PRYGV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 128 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437623, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBKTPUI7K3X6556BEEKZW6TMPLPB6U3S2IP7SZOYPQWYELJHQIJ5F7VY" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 124 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64571211, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBL6Q3ZKJ6VIJ6KPWWS5O6MWNYQXPBIS3IFFL5NYNRCEGRXZDBGXDECS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 173 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64516562, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBLMKYSUMGNJB3CL5BYH6TJ7LPZCIHA47G56A4YQZTXV6PA23KPUPLT4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 143 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64271845, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBLVHWN3K6J4KPPYIV7BMVELFVUM4UV4CRHXLPUBQ4SGZUSCVNXVTW67" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 43 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64273042, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBNXYGYADZN3OFMXB5HUDKXTJ66MLZ2BGVR22VDEXILALZ26BO7BEUDQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 44 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64523878, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBPHQXYYQXNDI6O3LMKY5P4BISQH2NQRRI3GFDMD2UXVEDLBM6Z3SA6B" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 148 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64330020, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBPT2QI464Z4YGYVFWZ4HZ4JCOZAB4N5TMVC3C4JAVLJ7VZ5TEFC2FV2" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 78 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64505310, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBQ2D2PC5TGR6NBZXREJDBAQESEUQ3WWIJ62A5B7P2VEJ7NDT47QPI4S" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 140 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223244, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBQ5NADAG6PXWTOZR3KSOAJJ2PIRB4CETM6NBIEUW6JCE3W2D3YFIU2U" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 5 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64366182, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBQ6SEKS34TMVVIDJAS6U3BP26D2YB246ZP3W5JCZALI6DYJUUXPYKSJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 87 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64595118, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBQF3E7EDEE5LGCLYZNP5DHXM3FIDHR3SG44BJ3WRLHEKZ3D4OGTAHXB" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 190 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64576606, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBRPYPLGP7KNWYRGWJYP2NSJ672ZU54UISVFKBXVRCHSRKEQBIX2YI2B" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 178 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612707, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBS3VO3ARGGIXRBHDSN5MZ3NTBB6HGQEMRUCE3E5PBPIEE7QCV4BZURI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 205 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425811, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBULATZ5EGBJ6R77RIRJVLHR4TEYRLMES4U7I7TVW4AOA3EDRMYKL2CD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 100 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64498913, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBVUU2XPZVGPNMOW7TDPI7CPJ2RL2EPD33AB2DZUZLIKGAVECTKIIFKV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 138 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64359735, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBWGVQRGKZJNJZP2SQMF6DDBCRST5J5O7HZMDS3HCWHJ7KZOIIYTPIM4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 84 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64454063, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBWSKQ7QLQEOSATZI27DB7SPPRHQOTH7XGLHF4FE2T7SVVNDMX5F666K" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 131 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64587744, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBXV2EEM4ME3VBQNHSKBTEDEY4UGKT4PSRWNI4XB3ZHE43KVIFA66PSS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 183 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329959, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBYUOXGBUQ746GKXETUCY6TNE326DS2HM6CWBNXAPAEPBFI34IZL7RVK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 72 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264248, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBZAMWZSJXEJZQJWOOHBM4U74OQQGQFFQWID5F4QOWUWHLPE7RI5CI3M" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 32 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64311089, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBZIEOJ4VXBSNSLQQ73ZXLACAOU7PNR3JIOMT33PYE46UTB47PLIYIPC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 51 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64347628, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBZN72COCY4J4755G4KGSCYH4XN353JWVIUD2OL6UYEAZ5VI2PZGRLXH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 80 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64227083, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBZNFITNWK2KBCHUERLOBCS6XBQC4LFKEEURYWM7G3AT55LWS3YHOWRL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 13 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329987, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBZYZX3UDSZBK5N7QS4B3BJDGEE3BITVZWXFFQMRWT6HIDGK53FTESAP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 75 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263534, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC2XWR6TCACRQXGLJKBW4LFOS7ZHGEFC5QX6GIQPNCLAOK554BE4NVDW" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 28 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258430, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC35DGZ4HDRMI622LUTETV7W6MJH6GO5KM7FH4LNYMQ57VM3YRMBPC4L" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 25 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613761, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC3NRR7ZZLRZAZL4WMLJMUXPXD2HXLYVWKTQOUDLLJP4U2LL7CTWTWJ6" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 207 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64558142, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC3OLVPNJYDH26LFK4B4PNVFRGDJYUCMSGJVDJQ3UN76FMLJE77VTX6S" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 165 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553085, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC3Q4CJXKLYESHLL4C34CT3ENOT4TXDO3W4PRIQ3C7TC4FHTRAQ5S37J" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 160 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64588820, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC5P3MKC4MK5IE5IJYQVLPS6EVSHMYUPOYWPS6AAQQ7FUEF32G3H4TRJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 186 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64328418, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC6AMJ46H25FQJ4Y2F7VITAWKUEJCUKQWJDEM2OP6SWEH2WQJM4QTQEY" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 68 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258512, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC6C6HXLFESMAVPIOG5ILS7WFQOD6TIWC7M4ASVNJRGTJXYZSAM634GC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 26 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64298304, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC6Z7QLRJDCAMTP4DIJO77I3MBH7WHW444FYP7E6YJNACR4W7XACDQOX" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 47 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437613, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC7J5RFWAERY3PJD4SFTS5UKS7R4BCA3LFOG5I5GS2IKYJSAWEKXWXQO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 122 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263930, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC7MQXJZ7FWEK42QSYTVEIKGBSO77EED5CKTILBWROPZ3J7LASINK7AI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 30 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553590, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC7PKCYZRRDRT6HBGPPON4NKQGHKNJJJQ7JN74TM5XBHFH7JBVI7LBR6" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 162 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591138, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCAR2MD5F3ALAUZM6XJP7JKKGAPA73DQ6NNUDBBBPSO6GP3SFUKDUBSJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 187 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329983, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCBLDIFSZZLQV2Y7XZ7UMY3B4UGBGQQRX636JW5GVCV3CFFMLFDJFC6H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 74 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329998, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCCKOGI4JF3PODDOKPICCGFIMWHGCRCEBAM6JW5ZBOCH3M5B6HC5HM76" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 77 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64525310, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCCPDM7HRDZIVHIYK3JEPBQEBYNXLXM5CXCYT2QPBMMS3QZQOAO3MTXK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 149 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64302334, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCCRAS23I66EM4AYUUEFVLMQYO6OQMPFXZWLCPWJYLPZW2RETQ324BRR" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 49 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64556512, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCCZVSEE77TOK6QTPLUNUUFZ5JOHFQJNXJCN63FBW6VEVLQ676RW7UV3" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 163 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490394, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCDD35WKILCDXEKL275OFVXPZBYN2DCTOEIXJZY5W4A2ODWEXK3CU7RH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 136 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610669, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCE4LIJFKVHC7DCFHMTAURZFHXT2EWUVDOFMTKGA7WDGZ7VVRSQYNUER" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 201 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64559446, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCEE54NZQVKEPPYF5BUWJHMGRORKIRJIXQYW3IFIMHTJIYLSBWPYCZ5H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 166 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437806, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCEL3ZJPOL4KGX5AQ2V7D6DTV7XIJNSN3CLFDDBZUMGCPL3E7LCFWJXS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 127 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64380430, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCETB2HL6ZPYZPJAGKTB2STFYYUBTFCIMCUHYIW5F5I5PJY2UPY6KZCO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 93 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223577, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCFCMBKVHECP3TLBPCC6QRHZJ3AVJDFZM2JGZDHJBW3NVVUV7TJYDLKB" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 7 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64271152, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCFN7SN46VC6E766HPZRMBWISI5HVRMGWFFMWPDGDKM5EVPXSLZ6T34Z" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 42 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64300085, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCFZKKIYA4QFR2H2QZZ4QHRPZBUU7XRILEQHNYB2FTYRSP7XGP6F645Y" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 48 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64596813, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCHYROHFWJWBNFR2T5DXVCORNFEWFPGX3LBOQEIZRTOVE7SBBJEQLCGM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 193 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599724, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCIR3QJXGKOTEDVBNFAJOG7WZ6CWI7NYAHWYT67F5CD7ARKXYWRF3LAD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 194 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264592, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCIYSZBHHDAD4HFTZKEBV2UC2XTAN76SXZMHWQFS2SRGUKGLBSQ6VFQN" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 35 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64236524, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 16 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610945, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCK7E564LET4I42RNS2CEERKHCIUAFJLM2HNKK7M44IQRH4RB2KFPJU5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 202 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437628, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCKDWMET5N7PWM6DOCSLPLFN37CAD3DQYEBGEPNWREBCHCNYQZWOWQFS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 125 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64322521, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCLTZEUNUK6KSTI6OKMZCXUXQ44VIS2NTSR7RWFU2UMDZSF2M3WPKBB2" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 61 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64587184, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCMYZU6UFGB2MWTCCGNOAUQWAM4JUWDQDBS4GVB7HZBDDYOUGGBSKXRW" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 181 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612252, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCNVUL4E4KBP3S6P7DMLHL7G5DFTIOEIMWXWITBGY3ZIDZQJKOFGDYWO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 204 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64388953, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCOHSWSJ75CEEHNRLYTK6R4ALEDJWFY535UOIFVCFHNSJSSIPKXB3NML" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 94 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64359798, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCP6XZS6WEONXRC44RG2RFHGF35EJNWT3HBKF2FFNDOWCYAC653323N7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 85 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64567988, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCPBFZPPLKE6OYQE74UYFWGTS32UHACB62TO5TJU2VG6NXY4VXBYWLD6" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 171 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223247, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCPT5TY7QL3G64O6LEDCJXULHXESZ6AAVGA5EUKKHGJSKODX4PBWSGFJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 6 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426676, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCQDJQXVVAF7NRWSPV7BFSIJX7JQP7XVPGBVMXMZW5LBSBJV4F4EA6NG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 114 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329990, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCQKGG22LREYEVUF4QAIMXT32SKGETGIWQZDKMYG2W6GZO4KJNGCVWXA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 76 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264641, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCQMZAECNSAIMOVZWB7OFLJ6BF3JEL35KR42FG5WE6DIVT5TRLXFWXGG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 41 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64541587, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCQQRPKZQAE542XOF53KM7KESYPDWK6LA4EEX2FNUQAG43CL66DQUXHG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 155 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426641, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCR6F3I3ZNQXNC5GADLO6EOAKDWWSJV63VS6WXVRISAOV6OPMFAIA4IA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 111 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612808, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCTLMEFWQJ4F4VPJKKEAO4FZB5BQ354MGMB7TBNOWV63D6KN7ER34MHM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 206 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64509367, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCUKUSWC6GI2UMBIGLS6IECS2BVDDCNBRVFR4QUHXSKMF47MYBYBMJ5V" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 141 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472892, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCUOHOGGKIGOYZAIN7GI62E47UPPJJK2J6BJYIM6YUEBVTRRE6NKABDL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 133 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64312367, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCVRUOOSB53I2QNGBHMW4WMKPVULRKBYEIW3JPB56O64PMOJMCZGX5HI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 52 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64606257, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCW7KCKK4T3KZBP4X2TT2UKYOZPJH52TPFDZWNUXUIW2PDVRDNZJUPGE" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 196 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64226093, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCWCR3TKBCT6BH6YNTEONYLRLX57TOVWWANPY4S5ZEVS3PJQQXVQIDS3" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 11 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64464803, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCWYCR2NNOZMITJBLXGNSFAWT3YQDHXOIPUPCONCQZPRAUZGWDNGNM7M" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 132 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323554, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 63 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64302366, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCYNTQNZYQLRF4ND3FAWGYFFYN3XSAGZF6WW6IGBTVRQXPIQYP5WRU2X" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 50 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64608024, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCZZV7L6SJY3KDPUCSXD5MQCXOYSZA22WTXYX62M3RBCRNXE7J4ZJHLV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 198 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613955, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD2DEIBYTR4H6ME44J53Z7XQOGDDZEF3ZT2SGKXIQXTW46QFNMUT6B3D" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 208 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64522749, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD2NW7INAHXPCY2CGXA7K74QVA3GOB7M6KP7DJNDAIEHVSK4CROWYNIA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 146 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64593502, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD2SOPA77HAN6FUAT7XXCTC6EVRL3WWN5OZ7VYNZY2WBZP4RKNQVV2IG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 189 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329545, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD44P5UZ4XJJJI2KSHGYXHYR2R44Y4KLKPH3DQDKPBSJD65PSWQKPXCI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 69 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426634, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD4ZUBMN7HPBN3YQPIFNL5JQICVFXZFXIQ7Y2T7MRIDHXMOLBBGD2HWS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 110 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264018, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD5AVPHJ26B4NBSLDUAUB7HI3XBFKUKLNOHKKK6EKYHB5ILTNA263PDB" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 31 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264565, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD5B6W6W7DA5EJQN2OX7CJAVZW6EODGUUSGHBNFA7DSBNDY7KFDPLWFC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 34 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64522794, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD5PABD6RFOAKVAH47H2RNQDPS5HWGDYXM5N7LPEMZ4N34CH7QZOW7HL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 147 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425799, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD6L5SNMVT5SXUG5OGXLGWQDBNVGY3OQFXPEZHA53PNEE5DAXOX4CDH4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 98 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64314187, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD6UB3JOFRLJ4DJAWJ53GFG5FXBJSZITL3LG3PGSQRLXGWRTMQJNQA7B" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 55 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437610, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD7R4BI47Q5R4EUYN3AZ5EV4ZMMN2DRUG5DOSQS2ZRCYQLD2OICI3CLT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 121 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64324056, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDATYNHFA7NFTK7NORYI2HENINM3LJ2MA2BEFGYK46POPG662WHB524H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 64 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426667, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDBTK4QJ22WZC7CD2I5KOBNVN5AIRU3DD2EX3YZBLV7M46Y6RYUNCDLR" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 113 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64588732, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDC25VYWGWCK265BS6MKGYAUCBSV3LVQS4LUY33PUOT6S5NUNOEPVRVD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 185 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591255, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDC7HWCF35MCND4IJBTSVBOAKR4BG2HI45R345ERWFQGML2HS7KGGDLQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 188 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223816, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDCM56BZLWE46BDAXPZFSASAXWW3YQLPZY2AKF4FILXNDPREOVJMSONX" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 9 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64379321, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDCTZYDD3YXCXSA66WRLLBYYM5Z6IWITBSP3T3AYZOC4RUAIFS6GJNM7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 92 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64245403, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDEHJYBPFQLVO4YIOG6USXYIZYHSBLLTIH5XAXX7ZARLNHTXPC6RQUQG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 21 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64431409, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDENLMKPPVI7HYVJWRJIB6Z2AAIQNUKT7VSG6VJW4WGR3VAC5MAY6IQL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 117 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425892, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDEUNFH2WAXZC5VPHTULLKE5I6VJMRWZHDN5ZGL3DAGLHMGSCBHPJCPC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 105 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64521005, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDFZJIBTR7JFFH5MSTBWVXPI3ZB5VZAJQDYRHAZ3EHK6TCIMW4NPVHWV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 145 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426648, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDGH345DWYQUQJT3LFED4SVRVTGYYBP7MWTWXDAJTBDBQA6HG2E3KRD5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 112 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64431116, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDGR7CBKULHMNJNCWPSS3TMNAOWK57PRKRQESDKZCR6LX4FU5ABFDUBR" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 81 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64282055, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDGZXEANOXIJRO5CGHDUTWDARC43OBEFWZF2ORWCMGTMQD6OELJ5VQPF" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 45 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64400758, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDH3X6UEA7BDMXY4HNQOM4RYAYSJNUT4TFSFWMF2F3ODG6FE7MZ5IMZK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 96 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64238030, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDI3IFSW6CZNMF7XMBME6YYUDBE34UQ67QZR64PNRIJSZUR6YFH7UI5L" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 17 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64563749, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDIFMYOSTTEWCFFRQS53JEQ7MFXGHG77I7ACVJKU4Y72QBWP5HRI5XF3" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 168 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367205, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDIWDJGCMGXXYGG6HPLNQHQV3KFOYXRKBSCKJZZNTMXELIFBS4D4ZSDK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 90 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367137, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDJ4K2KHJTAM3MH47NXOOPCRPKCKRVS5VLVGIBEK7BHVB6NPJNIOQLGF" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 88 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64511498, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDJ4W5TOTWIUWSKKGWGT4UXEZNHVEGEU5JHSASXUYT7ZSZV3ZY7HE3VC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 142 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64541867, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDJTYHSIWQG35TO6YFFJ6GB4RWFFJH4FMWQNG6BW7DGXHBIWESZXY66S" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 156 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64288317, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDJUY3N2IVMYWPWL5CHEIGQHSMBQROELUHF4QTIMC56GVO27FLKDEPUS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 46 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64516784, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDKMSQYPV3M2ZOZ6ELXDVQF5YWYEZPJIQA2XODJOGHZ57PE2XAD3BD7O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 144 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425901, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDKSGHVOWEEVLKW7WFNR62N5DRVTLYVSMODJ4ZSKB4EFR5K4LGOIGSUJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 106 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64447172, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDLKJIHOV4BOBWWKZAKVVHYGULR6NNGTR2SB5OYTROGMSGODVJIZ4BH2" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 129 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64596310, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDMBA5ZEC45HNJEO4R6HV6X53LDALAV4PBI22KGJL4X3WVFKBWGAPFUM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 192 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64315541, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDMGYNO4UIGSZP46GRSUFR6IZANBMAK4XECGYCI5N5UIWQCTRVKOJWW7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 56 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425814, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDNC6UMPK62ZGHRT6PUY7LRLIJUZ7SWGLTF7XPDOYHZWC3VKDMT4ZNFM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 101 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64226562, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDNWNV2PBY54YRL45GVHRDHA737SEPL6BZMAKRI2IDRKUEP56GERIHDT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 12 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264636, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDOAQK5AK4Z3TAFIMU4WMVJSVZECLK2NEVPRGG4CSO54ZWHFHBE6IDMI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 40 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64330670, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDOIC3LPD34KTKRTFOAMB6CKAYZNOIGV5V7H5YESTNMFSQ5JG5PMFS3P" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 79 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475191, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDOR4CPOMWGJIYUKLHUAWG6YKG5O54W6QXU4W6HSB5I7UIZ3GK3LFGDX" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 134 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64239428, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDP25U2QVO5LSHQRG36UEFV3EU2B7SGI5QSKBWHMGZILOYQM5T6ZLDFL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 19 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553195, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDQRHRIHCEFBBBGV25MVVV4CPOZKGC3L2WE2VEAJP5YU3MGYSXU472DT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 161 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64567958, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDQRMSPPL36367H7GTGY737ZCMERZIODQYBUSSKQZ2KKJQXVP4J3KICR" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 170 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64353136, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDRNFVUHSAEFPJ6RHROZNL4PZODJQAGOPUNDY7XHQKN7QGNFJZPNRJ6F" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 83 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425883, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDRZ3DFYOVBOOONOM6UWYINJLRE4BUSOXCEJCKWXOVU2WOC7XT6F7MXR" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 104 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64327770, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDT3QTEWTO6MY4UDP6OSQ3CBBAYA7LQLFAMS5SDIA4BZIUPISEJ4DVXA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 67 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64240078, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDTEKTRGDPHBT5UTUHYTJR3JDZDPAJ4ZNKFOUROFSDZI72POQJM3RBXK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 20 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425821, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDTRBLSF6K3MI2MVS6DSLEHWRKHWUE74ZF6SE57VHFSL463TY2L6QX7O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 102 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64313527, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDUHWGNSL6WL4IIYKP7QMEC7H4CAOX5Q65QG7JGHCPBRRXALLSE6WBP4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 54 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264611, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDVGNWW3GMZE7TNCBCZKB5UZJMECGGLG4XB3FJGG5NFNHICRXWQF3AAQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 37 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64318732, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDWHA4JM3W57ZZMIZBZIQF4H7PZOACWVR2ZWOI34VJLBMFB6TCAH7KP4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 59 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64318575, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDXURAFHE27EXW2L2HE4PQIWJEO7MXNROPZBSZ4XO2HQWTDNA4REUD4U" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 58 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64255160, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDYEUWPLNHSIZ3YC5B2WTFF2EFRVCHLEAE3BN4IMY2PIVU5OW6BTYXTS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 24 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64325736, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDZ2HV576TOUH6MXE5NR3NOSZHELDXRQ2ULBZS3IKNFANRMTU4FTMIUG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 65 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64590230, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GA25XFBDROFS3V53RRGHGN5IY2LQFP3HO4IFSOZS2SAAQA4DEJ7JHWX4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 65 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553013, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GA3NAZYKIAQWJHXCUORX3FUXZCCMWRFIKJFEDMLEUFMCWELYD2LCDWON" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 48 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64580318, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GA4DJDM66BZLZ54K7GLZFFPKGBNC44IPZSHMMZ6G7YY5TOQH3N5T5HAM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 60 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64569906, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GA6UANZSAIOSKXKPYXEYLHAUNTQOJNKUIKCPGFNU6RVVTPJDJJNHOJYH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 58 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490680, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GA7YDWNQYXXLAWBZG25MH3XI2QATNC5CVZZ7U3IKWEWCDEV4B6E54TLM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 38 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591761, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAAZEXTYFCDS2QNXAYKVCMAUJLUZACWVOQ2WVRUUEIXC6ZKSHC6GDU5O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 68 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64430415, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAB6Z7XBXJDS736GUA7RXUSXSHZCDC5X23BB2OSN6UAG7CNKE4SXQGIL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 33 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64585926, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GADGXEIP2NEIJ3723RFTFCSPVJIJVM42RTONINH4MRTMUV2KBDFBORF5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 63 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323352, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GADWDDKP4TKUVNZVSKXFNFN6FXSZYIAHL35R6GEQB4M3QK3FNEF225YS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 14 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264367, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAH4O6GYKLK2VZBSRWVKLLJ6K6XWWW3RPYG37BHA3J6SNW6WKW5MURKU" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 5 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64605244, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAHCZAPDQH32PUCAUSIA6YUHRZP37C2RHNN3IHBW35JR2A4W6IQZEFKE" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 72 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64540447, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAJJYKVGLTGP6A3ANITXSKM26FT5OWLOV6MLWQPGHMOLWGSXXPRNOAFM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 45 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64565073, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAJOAYF7JRQNPAFECS7SDYAKPPZHEUVSDMHFHPKYWYWECIDAMTTFUBRW" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 56 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64444487, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAPFD4AVZGSXJGZ6SQBM4VOVNAVCZHGQT7UXALJSNDZAN45DCBFNVFZP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 34 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64502292, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GATRUJAWQWVWSSXYGUDDXPDQG4EGHNIQBMYCBYWX7HVZJQYYAMPYAHKL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 41 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609893, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAW4DTRCC6JEBXQN53RYX6D2TZZ3Y2EUBF54HC35RR6TOYCHCCUQZVI2" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 76 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64590320, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAYNG64UV3AS4PK5CAAZE65HQYBVPYEAAGSK4YMSIW3DAT6GZY632N62" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 66 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610272, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GB2DG2EQGAUIW6VFQ5I62RMXJBWUBAKYBKCY77Z7UEJUCYHX4IPEGEOA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 77 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612242, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GB3EXLNQXLMQIHHIRT2RRMSUJVZGCDSJ5K2GSIQ6H7CQZBDXCMWLD4XQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 79 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64349189, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBAYJECW5TX6VC5BVHMHC3CXNGOCH7SMKEB7HY7PY3FA74ITFV6EHRKU" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 22 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64352849, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBBZ5ARLATIB362OH74BIYUJ7SKZBZG2Q3WRPW6USGNLXPRYMRCT52PV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 24 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64603476, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBF5JQPKGAH73ENUHNY57YNX4R2CDAGSRQW43LULFKNHP42DQR5XI53P" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 71 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613951, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBISWUA6YYUXWP5LZ6HEQSUSAGYLSIQPMVJOOPELXNLJNFSAI67DAYK5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 83 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326452, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBJ7TIB5D7WQTE7DG7ZNVUJTD5AY663RPVCCRV5L2LQA3KUHUARAWJWT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 17 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64582915, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBKOUX6KOXYS2PNX7U66OVTHWW4GW2JGQF2DFWHO64N3Y2M2BF5DEGBB" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 61 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64511098, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBMFSMT3OK6T7LOWJBINEAGN7W26GLOCAFOV5GQU2ORSHI6Z2SBFP3OM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 42 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64376174, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBNKYCX5V47NRSXU6JVHZNUUG37GXVEM2VACRURJMES7NPKPG64A2Z5E" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 29 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490194, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBSXTAYAIUG74OCSFQQ5W4CME2WLMQMQBTPSPZDG47XALAL42D6IULES" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 37 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613922, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBTCII43YUWJ4Y6KUZR46SP6BJLWLJWUYVHVRGMANY2XR5RG35FXRR3S" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 82 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64359712, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBWGVQRGKZJNJZP2SQMF6DDBCRST5J5O7HZMDS3HCWHJ7KZOIIYTPIM4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 27 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64311866, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBZIEOJ4VXBSNSLQQ73ZXLACAOU7PNR3JIOMT33PYE46UTB47PLIYIPC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 11 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64241513, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBZNFITNWK2KBCHUERLOBCS6XBQC4LFKEEURYWM7G3AT55LWS3YHOWRL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 3 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64559191, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC2ZO2H7SYITX7AXBGOJNQHRGVWSTABIKHROFFE3ZDBYUOGGBDJ5ASHK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 54 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64349918, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC33RPJWTEV5ND6DQ25SLT3GYDDPBZBQ3T3CT7R6QDY45YKJLLSTIJBZ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 23 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64290460, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC35DGZ4HDRMI622LUTETV7W6MJH6GO5KM7FH4LNYMQ57VM3YRMBPC4L" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 8 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64361040, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC3KL2WTNWWK4C2KZFLKKMECF6JZVDXKHGATDIWQ7OJU3OHZSVUBK2Y5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 28 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64558228, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC3OLVPNJYDH26LFK4B4PNVFRGDJYUCMSGJVDJQ3UN76FMLJE77VTX6S" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 53 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553077, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC3Q4CJXKLYESHLL4C34CT3ENOT4TXDO3W4PRIQ3C7TC4FHTRAQ5S37J" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 49 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64563922, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC4ZC6F65CYSIN2TT6XO5BZ4GNYZ2TCQIVGBRMCHUI2QMPOQISORL6DO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 55 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591593, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC5P3MKC4MK5IE5IJYQVLPS6EVSHMYUPOYWPS6AAQQ7FUEF32G3H4TRJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 67 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64555426, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC6NCYXDLUZ6KYJBVYJ6MSIHORZYGTL6T7B6GTLF4CCI6AJ6SBVF3NUQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 52 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553584, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC7PKCYZRRDRT6HBGPPON4NKQGHKNJJJQ7JN74TM5XBHFH7JBVI7LBR6" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 51 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64322664, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCB7TCOUJXKWM4SQIKD5C72G6Y4WPKFLILOGMR7FLKOHPO7SC65I5WNI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 13 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64584892, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCCZVSEE77TOK6QTPLUNUUFZ5JOHFQJNXJCN63FBW6VEVLQ676RW7UV3" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 62 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64563490, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCDD35WKILCDXEKL275OFVXPZBYN2DCTOEIXJZY5W4A2ODWEXK3CU7RH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 40 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613315, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCEE54NZQVKEPPYF5BUWJHMGRORKIRJIXQYW3IFIMHTJIYLSBWPYCZ5H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 81 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64381438, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCETB2HL6ZPYZPJAGKTB2STFYYUBTFCIMCUHYIW5F5I5PJY2UPY6KZCO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 31 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64336905, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCFZFN54GPXIVILU6XGGZXGA6UIKPAIUOQWVBEEX4RJHKSPEVKZ2P5QQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 19 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64313252, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCFZKKIYA4QFR2H2QZZ4QHRPZBUU7XRILEQHNYB2FTYRSP7XGP6F645Y" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 12 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599740, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCIR3QJXGKOTEDVBNFAJOG7WZ6CWI7NYAHWYT67F5CD7ARKXYWRF3LAD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 70 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64606654, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 73 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64611674, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCK7E564LET4I42RNS2CEERKHCIUAFJLM2HNKK7M44IQRH4RB2KFPJU5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 78 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64271512, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCKAXQ6XLXOJ366C3P3VVLXU24X2UQ3YERWL5VNX2C77E6U7C6KTAAVJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 6 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64278949, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCP6XZS6WEONXRC44RG2RFHGF35EJNWT3HBKF2FFNDOWCYAC653323N7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 7 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64388918, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCVRUOOSB53I2QNGBHMW4WMKPVULRKBYEIW3JPB56O64PMOJMCZGX5HI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 32 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64465329, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCWYCR2NNOZMITJBLXGNSFAWT3YQDHXOIPUPCONCQZPRAUZGWDNGNM7M" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 35 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323677, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 15 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64607938, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCZZV7L6SJY3KDPUCSXD5MQCXOYSZA22WTXYX62M3RBCRNXE7J4ZJHLV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 74 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64238973, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GD2KSWPRAFE24PS7ZRJ6JWTB4HA4HMPODUK62KTTTQTP6WWLA2N6AXZ7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 2 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609321, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GD2SOPA77HAN6FUAT7XXCTC6EVRL3WWN5OZ7VYNZY2WBZP4RKNQVV2IG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 75 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473451, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GD4UNF3UMYMI3NA4RZGPRYIDELND3RAS2LV6LTJKNKWHBAZVSI4GELOG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 36 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64344681, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GD6ZYOSMNEEZAIJYKCDN7MDA6H2MUHQKYKM6GIYEQ52JU5GI4SSGMWL6" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 21 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64306440, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDAHCRUEUXSLIGGYPCKBHQT2TWFTNEII62GAHGJETGOON5N4I6XPLFVA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 10 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64324047, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDATYNHFA7NFTK7NORYI2HENINM3LJ2MA2BEFGYK46POPG662WHB524H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 16 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613249, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDC7HWCF35MCND4IJBTSVBOAKR4BG2HI45R345ERWFQGML2HS7KGGDLQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 80 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64379345, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDCTZYDD3YXCXSA66WRLLBYYM5Z6IWITBSP3T3AYZOC4RUAIFS6GJNM7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 30 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64571749, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDE2M7YEYHQIJMR4I6HD2AHUVJEYPMRSHY6KLWM2C6CIJYVYHNQW5JJP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 59 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64521140, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDFZJIBTR7JFFH5MSTBWVXPI3ZB5VZAJQDYRHAZ3EHK6TCIMW4NPVHWV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 43 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64294465, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDGZXEANOXIJRO5CGHDUTWDARC43OBEFWZF2ORWCMGTMQD6OELJ5VQPF" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 9 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64256892, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDHEFAG7XPZ4UZXDT7OT342PYTCF7OQQ34LZJNOWK5CLRLTLXJAYENKI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 4 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64542112, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDJTYHSIWQG35TO6YFFJ6GB4RWFFJH4FMWQNG6BW7DGXHBIWESZXY66S" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 46 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490740, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDK2HMIISZ4B5RR5EEA726OJEVRQHHZJHDM7SVB2Y7K5XCRI33QIVU3H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 39 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64566539, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDKMSQYPV3M2ZOZ6ELXDVQF5YWYEZPJIQA2XODJOGHZ57PE2XAD3BD7O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 57 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64227353, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDNWNV2PBY54YRL45GVHRDHA737SEPL6BZMAKRI2IDRKUEP56GERIHDT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64589963, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDOLN2CLLI2KI6CVENF2NWCL36NBONRP64P5MVAIP5CPT5QWQCFYYWYV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 64 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64548617, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDP25U2QVO5LSHQRG36UEFV3EU2B7SGI5QSKBWHMGZILOYQM5T6ZLDFL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 47 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553203, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDQRHRIHCEFBBBGV25MVVV4CPOZKGC3L2WE2VEAJP5YU3MGYSXU472DT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 50 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64537806, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDRA4YPSRYDIG5QPAB2WISP3V5SGRCJVID2MZHI7UVCPCZGB3JWCZZAZ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 44 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64353050, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDRNFVUHSAEFPJ6RHROZNL4PZODJQAGOPUNDY7XHQKN7QGNFJZPNRJ6F" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 26 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64327810, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDT3QTEWTO6MY4UDP6OSQ3CBBAYA7LQLFAMS5SDIA4BZIUPISEJ4DVXA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 18 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64340114, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDUHWGNSL6WL4IIYKP7QMEC7H4CAOX5Q65QG7JGHCPBRRXALLSE6WBP4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 20 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64353004, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDWHA4JM3W57ZZMIZBZIQF4H7PZOACWVR2ZWOI34VJLBMFB6TCAH7KP4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 25 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64596126, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDZIGG5CNRL45CAWPFYTJ7K6JP4XJIS7DF6T3OIX4NVIU4F6C6E7JIH5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 69 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488075, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GA25YVWWZN4AME3HS3OTPSDEAHC7DQXEQXFLZHDLCKONARU66ZGCXMUE" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 33 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486556, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GA4DJDM66BZLZ54K7GLZFFPKGBNC44IPZSHMMZ6G7YY5TOQH3N5T5HAM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 25 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490635, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GA6UANZSAIOSKXKPYXEYLHAUNTQOJNKUIKCPGFNU6RVVTPJDJJNHOJYH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 49 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490193, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GA6WVPSKHSY5SYBSQLYRQILALJRYDJKCJ24GMZVA3SW2BI3CBGHDKEN3" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 46 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494875, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GADCI46FPSCQ4GWCJBXZYLPUTIIYV5OFR5JFRU7ABFMO4AH7W2ELUGAP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 72 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496861, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAHLSHD53JDVKMPIOZNB3GNKTQXYCLS6R6FYX2BGFEWDCBHV2JMHUCVK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 78 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492536, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAJGJRHG6ISSURFHTMSG7SI3PVS5XVME7OJHOAMP7BRHASSIZQHUOS6E" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 57 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485393, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAMH2GEVQXETLZGAFWMIU5RKXSRON5UFIMTWX3B7JMTJ7QG77C46RLNO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 19 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488724, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GANHXXHJWLACEFFSZJOQSTAZBBRV65F2G5CNS5J5YBOWROWIGUS4E3R3" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 36 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488310, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAOAE5MEJCCWMBAIKDGD64UBHUX73SE3EBVV7GW5UWJK6AHZSUWA6U6H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 35 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495638, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAPS5LQAH6LLBRSFX23COJV6NAN32T7SMX5Y3BRQZIIFMRZJCRWLOQWT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 75 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493955, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAR3M54VVNPAC7TKQZVZZQTW5LLXV6UL56VAD3P3GVM4FQNTJNEI6WPV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 66 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487180, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GARDPYJY3URSWQWU2CSOG4JQHBD3A2HK6EOQHUEPKDWYNNUPL4FDDWS7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 29 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64478167, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAUB4KOF5DQRW35B6Z6Q5ZBJNGCWZY5F55OFYDW5OD5A5FGPN5VPBEBJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 13 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486858, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAXWC6RGYLTDCLD52LLRUVTHW6RUE2QYTMSGGUMZMZBFAAZ4E4GTURSB" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 26 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485594, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBAKTZONDEPRZCAJVS3LPLCT33OUW2UV5ZSJFBWMIEZDZXLKLR6GH3TG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 20 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493834, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBBIXKRKYU4XVEWEZPQ6XE4HUIEDI26OOCANJC37AJCUKYGQANFMEVI7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 65 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489869, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBCQCUF56FZ34A4LIFBUMSGQ3PD2HONTADI7OZVDW2LQ5I2NPHXE56UK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 44 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476489, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBDVM5H2HUR2UJU4U62H3AO3B3QA7XXRPOMJQYWKBJ2UT4G7CKKCHXRS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 10 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490867, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBFEMXAVBW2JSNVFQQKHWAKOAO2COIMZOIIKMRE6OL63R74SMSWFIZLI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 50 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495134, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBH5L3YEZICNEZV4GXJ6LYNG5TIAXRELYWZYBKUOZI5LOFO6CLUT5GPY" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 74 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488941, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBI7MHCOBO56HPIOJ4WBDZIAZB2WB3YBJYBZRLAWIOMSEKOMJTKNBMBX" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 37 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476688, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBKJMLBPFWZTUVBJ5DFQJGJLDHR52JHJTAOO3JDPAILRTABKGR2A2UUY" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 11 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473715, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBLW2D4KJQTSPLMHBTQ3F7Q4W2KNJYPT7DUF5P3FVRIC63CZOQEHGPDQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 6 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489094, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBNAYCLP6TYGS3NLUCHUHWHCEKUNX3B5UQEMO3K5BH7ATG73JBV3XTXO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 38 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487829, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBNQO6SYESAPXFRZOOFJUMW7QQL2DSNAC3IQH2XWOGLPEE2S3SXSU77D" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 31 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492415, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBP2P4JAKP7ASHKSOQABFRSV624LYNS45NE57ZOMUJD2E2ONBHP66MRJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 56 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497309, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBPA53YAWB3I6CLSEPX6D6BG6SOTP6G7OJVSEPJ4QUTBHLTRWQC2YTEI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 84 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492337, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBT3QYFC2VJRKTWAW2JJ4ZGUSOSXJN4T4XHSLYCB7BSDRCQOA6YIATJG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 55 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485992, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBU5PAXAFBGLPYZRCWHUFFN77737DN6CVRSRQP67IBMTEX6ZP553UKON" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 21 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476163, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBVFPIPPCXIW2GCUEA7WTOYZJ32VUYNO7GUZSB6DCAYV4G2IJ7JWS43O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 9 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490048, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBVUU2XPZVGPNMOW7TDPI7CPJ2RL2EPD33AB2DZUZLIKGAVECTKIIFKV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 45 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494481, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBWGHKRNC7CAR4FBY7FQTTTKEJGTPL2L6RTS7RIXDEPCIEG2ZXCEVF5I" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 68 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496981, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBYXAGK76FXYNAD73E5W6O5UYD74MR4F6N74O5JHOSOMU7A5Q7Q2O6U4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 80 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473460, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBZFPXM2L6ENBLXBPUOXTVUIXLTI4TRAZ6N52NP2FNWRER7R5ZETVSCG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 5 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487023, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GC3BD233YVEL4NVYZHQ2IHWQNNYJQTVDQGY3R357A77PU3KAO2RH2AUF" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 27 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494593, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GC5DALRCGWSK4PZDOK7I47EGJGEENNGBZMTBNQAZMPMPQKFYOKQYLW56" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 69 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489511, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GC75TVZ4HGQF7PF4LEAT5Y7OONTTGUQ2I275A6AOR5ZHRXQHYCREZRTC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 41 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64479234, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GC7QUT5CLSK35R2C5JI4LP4P6W47K6RJJARZLPTLVLTJ34YVZIFRKLTY" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 14 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489307, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCE4LIJFKVHC7DCFHMTAURZFHXT2EWUVDOFMTKGA7WDGZ7VVRSQYNUER" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 40 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487063, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCFM2ROFIA7AGJ2UER2GVWIKTNWY6UZGYX46TP4FGX2CGJZZ643WVNJJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 28 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489532, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCIBOCOAT3JJJWEEGATGHLM4GFR75MDW5G66UXGLXKB27N5EOSKT3GFD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 42 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497100, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCIFU4XBA4JFJNR5CJNDACNTXMTUCW5LU2XTZ5V6PYIGQF7MIQEYGUDH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 81 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496002, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCIR3QJXGKOTEDVBNFAJOG7WZ6CWI7NYAHWYT67F5CD7ARKXYWRF3LAD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 77 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488251, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 34 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487659, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCN5RTDME54YCDS4LJYWDGX3ASD6MYURMVGAYPV24LWW6KYWYDMDZKWQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 30 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494600, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCPXZWNP7AD3MVOLQFKVCDMXITHI6ZX4LL5JYLS4XQNPEVTF7CCKXYMV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 70 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489189, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCQ5VQGWHOKPR5MRI52TJNLOGJMQGXHI34FICOV47G2Y4NIDHPVDFR7G" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 39 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494940, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCSYQ5IDWYTRFX36UAIUOLG6TNWPKTP5MJ73FLV5R4ETQ6BQORU6M4FI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 73 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494333, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCT5HH53MXGEX7OQCPRBM5VBYPWMXFTS7VFIAA77K2UDSOGXZONH35CK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 67 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495898, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCUKGEAU7QNUFG4CRDNJZYUA2XR3AETEVS6MDH3GF5DY5LOEYC6HDQTD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 76 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485104, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCUKUSWC6GI2UMBIGLS6IECS2BVDDCNBRVFR4QUHXSKMF47MYBYBMJ5V" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 16 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473380, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 4 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64471296, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCX3NIFZEBAVU6DHZ4O4ZVJYTEMVBFDXVHX6V6PV2N4EYPCRFBP7GW3X" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 2 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492879, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCX4YJNRMCNCXBH3DGZ7HWAXXLXFBRSJWU7BNNSEDMREYSGL35I2AN5H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 61 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488011, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCXEAJ7WYM5ZR5O56OHCMWGKCHRSGOJJVRGSCVNNLSENQXDAGIVPSU72" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 32 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485056, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCXQ7ZGE45A4SCBQYRNZS2OD3MZF4KSELDJNBEQOKGOR6RKTY6OGABUZ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 15 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492070, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCZ5BVJDG7OVI6GUEA3GPBGQLMJLSJVAFND7QWZUEC4KDYMB5HSA2SFB" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 53 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492232, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCZINFPZ33TOWAMT4A52UU7P5ZZURRYFQUHP2N3RSSKVGXHX6AWDWCOD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 54 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64478094, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCZJMNAUIQ2U577P4RA6JQNRX6LABXZGQWBCJAKERN46GU457K6C3GQW" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 12 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485370, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GD2KSWPRAFE24PS7ZRJ6JWTB4HA4HMPODUK62KTTTQTP6WWLA2N6AXZ7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 18 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472984, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GD4UNF3UMYMI3NA4RZGPRYIDELND3RAS2LV6LTJKNKWHBAZVSI4GELOG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 3 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494791, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GD5NEGKB7H2E74FQPY2ZVZRUGPHW6AVJIVUX4TVNZXVZATLWAJDU7XYP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 71 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64470394, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GD7X75IVSNG2O2KULMFUOFTXZEIGMRYSVIJRUNQ74RSVOPA6W6IRTZ3S" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493733, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDBY6AK3PTYQFDF6L3AV2RQE74V3KSKVJAT7GEV6TPCX3KQ7C6QCKPZD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 64 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496872, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDC7HWCF35MCND4IJBTSVBOAKR4BG2HI45R345ERWFQGML2HS7KGGDLQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 79 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497291, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDENLMKPPVI7HYVJWRJIB6Z2AAIQNUKT7VSG6VJW4WGR3VAC5MAY6IQL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 83 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492554, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDGNENZ4B2HIZOXO2LUVTI4MC3HIT6LWOX2LAMTMGSGQ57MSFE5ERJIT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 58 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64491027, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDGU3HWNHGZX3T7LERAOCP73TYESCPT6QYOXNBY7JPYWIM6WKJWHSFCI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 51 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497105, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDGVNX64C46N2RGQ7E7EW4RKBG6PZ54MPWSWSSOYZA2LVSLY3NXBSC6R" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 82 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489739, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDI3IFSW6CZNMF7XMBME6YYUDBE34UQ67QZR64PNRIJSZUR6YFH7UI5L" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 43 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486172, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDJTYHSIWQG35TO6YFFJ6GB4RWFFJH4FMWQNG6BW7DGXHBIWESZXY66S" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 23 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490237, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDK2HMIISZ4B5RR5EEA726OJEVRQHHZJHDM7SVB2Y7K5XCRI33QIVU3H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 47 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486073, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDKMSQYPV3M2ZOZ6ELXDVQF5YWYEZPJIQA2XODJOGHZ57PE2XAD3BD7O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 22 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490475, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDL7S4G5BGQECSBNGAVTLMZTICV5MSO5GNPRZBNJEWDXWR5NENHUEM3U" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 48 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475731, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDLVB47EHGB6DBTAZHC24N5VGC5B5JGAG6NTBJ3O23JXLONDWLIQVJVL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 8 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486466, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDMHMOM65BWYHVYJRXPYDCSXT4WPP2XMZC6OR5V3NFNJWUEXQR4YPUX7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 24 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475486, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDO3D2K3TFJSEB7GFKMUGXVCFFIEXRGNPXZTRJ27KQLYEZDDCOBUZV74" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 7 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493186, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDOJ3XPIAHCYG26SGBSJY6KJDIATCNHEIV7WGFVL7WAY5XX2KRDVA47Y" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 63 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64491521, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDOR4CPOMWGJIYUKLHUAWG6YKG5O54W6QXU4W6HSB5I7UIZ3GK3LFGDX" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 52 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492866, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDUYVERC6QT6QQZ3SCBIZYRAJH6E42JZQHUFG6F46Z4Y2OM27BK4WO53" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 60 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492651, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDWVOFFYGIYWYTRKPXMNUES7NHAJWEUKEUL423DE36R23TAJO5Z7Q6LT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 59 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493102, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDXURAFHE27EXW2L2HE4PQIWJEO7MXNROPZBSZ4XO2HQWTDNA4REUD4U" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 62 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485238, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSlot" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDYKGYYSOGYXBOIYOOO5MNZKVT537H3C2T35UIIXWKVXTZRLOKR7DTS5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 17 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64418243, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA224ZNNKZKU7AX3UOOLVDWMMSYRXDHDKESM2YS3KVO52URJDCNMLKFY" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574607, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA25XFBDROFS3V53RRGHGN5IY2LQFP3HO4IFSOZS2SAAQA4DEJ7JHWX4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426693, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA2CWWXT26Q4TNNRHRSV674ZF6OWCNDW5JAGEEJD2FB3CBDKXSEVLWNU" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425908, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA2MMWELTIH5IUJE7CWK6AW7EAMOZVGKY3F3GBNFVSQFYE5W52VBAFTD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64552997, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA3NAZYKIAQWJHXCUORX3FUXZCCMWRFIKJFEDMLEUFMCWELYD2LCDWON" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64560483, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA4DJDM66BZLZ54K7GLZFFPKGBNC44IPZSHMMZ6G7YY5TOQH3N5T5HAM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64255097, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA67HUSONXSYG553UG5IDDIQSBH5Q4F2BU7ZYAQSIZ7L2IX43JAUXWAJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426630, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA6QAJ6TMPTODF6DOMLU6XI7VD6XYYYM7JZA6PPAWNNQEF5454NQ2ELN" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64538460, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA6UANZSAIOSKXKPYXEYLHAUNTQOJNKUIKCPGFNU6RVVTPJDJJNHOJYH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263831, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA6X5ENKESTG2CXBYC3DUWFZ3LKHDWSESUT3YK3N5QOLBP5V2EUUKXLS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64595223, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA7VIS5CL6LXI23TADDI5TTKZORASCUQDJRH6EKF2TPLTNMXS5MJUFWF" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490351, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA7YDWNQYXXLAWBZG25MH3XI2QATNC5CVZZ7U3IKWEWCDEV4B6E54TLM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437805, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAAJ4XUODHJUC23YRMFVTS5M73S5ZZTQSZIDF2ZOSA5P2COKXJOTNUSN" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64435450, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAAKMCBKEHJHWVLYR6CSX77AYAFYMAITCUI4GM6EFO54V6OSCKA2KONZ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609996, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAAZEXTYFCDS2QNXAYKVCMAUJLUZACWVOQ2WVRUUEIXC6ZKSHC6GDU5O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64313085, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAB6Z7XBXJDS736GUA7RXUSXSHZCDC5X23BB2OSN6UAG7CNKE4SXQGIL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64586458, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GACELCRF3P7PBSFLSPHHLK2YIQ6WNEOZGBN3EJ6TMLCMJPSVDAZDXDDM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425809, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GACNFVACOQPBXJARGRKEJM2K5TD3RYJQM5RQV6Y3J3JH3BENWCI7J5YE" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64213362, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAD2PJIY4WZIZM3HIWB4STXDGQWQ4GFFDBQYIOEAEGVWIQST53PVU6B5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64568045, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GADGXEIP2NEIJ3723RFTFCSPVJIJVM42RTONINH4MRTMUV2KBDFBORF5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64539295, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GADR2KUYLHAZNUH7J4IPC4QOFKMJS2CHTXIUVMRFLI536VL3XPNTEUWZ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323207, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GADWDDKP4TKUVNZVSKXFNFN6FXSZYIAHL35R6GEQB4M3QK3FNEF225YS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64220186, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GADZJQYATX2GFX7FOEHHKB7K5XQCDHTZTG2SSJA3SKL7MRKEZBD5EVJV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64588135, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAEVYIB4QUSGU2GPEBBEOSS2B6ATCZLIQ4ZNF2IMIO2RAOJIEZDQY2YX" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426701, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAF6ML2FAQIT7GPP74FRUH4DDEOIMPJENDKBJLMAEHY37B7RTEBTIYOP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329860, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAFVBUV7COXHXLQWL6VWB63AP6VXHTKIIM7KA4S2DZEXCEZJKANJQLNV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264421, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAH4O6GYKLK2VZBSRWVKLLJ6K6XWWW3RPYG37BHA3J6SNW6WKW5MURKU" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574739, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAHCZAPDQH32PUCAUSIA6YUHRZP37C2RHNN3IHBW35JR2A4W6IQZEFKE" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64567913, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAHDDTSTE2P6JSTUBYIHZ566S2MT554CYJBJIU4W4Z3P3T7XKLGA2TIK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64587484, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAIR7XYIVOIEADFWYP3TNHDBXBIB2DVASZRSIYRJXBCTPCA7KQDJVANC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64229870, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAJA3EEWG5SJDV2OSC7NBAGQ4OFEC64DFO7GKTK5J6A6SXDEO4EQ4CRM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64449632, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAJJYKVGLTGP6A3ANITXSKM26FT5OWLOV6MLWQPGHMOLWGSXXPRNOAFM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495701, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAJOAYF7JRQNPAFECS7SDYAKPPZHEUVSDMHFHPKYWYWECIDAMTTFUBRW" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574787, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAJWVQLHXY6DFSC3CMWL6YZNJTQT7SRD4BOZHQOVEHHRLP535VJ6JH6O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64216058, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GALE3JTPDC3NR6KV3RWS42CCAQVFCO2IJYTMTBODAG6ET42P65WEY4CV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329967, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAMDZSTTRZ3FXHAIVZXSLYWZVRC57I4U4NRAWL5TLREOERRJOE6QPQI5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437610, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAMUGU5B43ZFG2BW2DRMEZZTQI2WPYU5BGOXTVJT6UA23DKKZLXGMSKN" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64239113, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAOMRKOZJOXUHI3PHRPRQUORZ4NXZVSCRZSHDJJYEYNFBWZIO5WMRZJ3" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329906, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GARBDCXQS4LEIJL3DYSCES34OGHBMDKMAIIKFNHB7SENYSFPWVKTQXLH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64532032, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GASEQUQAP7QMLZK4VMNQLMGKLZ2GR5XJ3MTO5C2RA22RKDKHEPRKKAHU" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64536146, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GASWMZPKDGCQCKDRYQCGVD7FF7D2NRWUOG7KSDDO4XGGN7XETX5OEE4L" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64221427, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GATJYZIXPTLOIK7F7XRM4PCHTTMVLWKHATECHLA4QOQUQ4LMCZOCGUKX" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64577956, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GATTCGMJ2MDHDT5TBQX4NGMSHSMTMCHXRVIKPBES6JM5VGZSHC45OGJC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367199, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAU2MGBQZKRFNAASGQSBQX7LY6Z6DXEV6DXV234U3XHDUP5HFZUOJQ67" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64322412, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAV4V6WZGMVPZM54DR2242NMUHV3JPVRLC7XDYIFSRU2WZIXLWQIKYO2" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264630, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAWI2SC7R3U6H7I4YCCDMBTACYICY4ZZ2OTXSSTZ3QZ4DSEFXY2IAVLF" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64436751, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAXFCHETKZD2SH45HJP4RCNGRDPPDSMFFSJX5P44V54XFHEDYXB4KKAS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574384, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAYNG64UV3AS4PK5CAAZE65HQYBVPYEAAGSK4YMSIW3DAT6GZY632N62" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610354, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GB2DG2EQGAUIW6VFQ5I62RMXJBWUBAKYBKCY77Z7UEJUCYHX4IPEGEOA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64498974, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GB2LBLRAJMXCNQ3R43GXJ7PLQBIPFDBAUEQO4ZKBTOHKNGCBHKMWKBIB" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64607693, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GB444W6G4PHTTCSUA7FR5JNVSN3GMXRE6SBJZ3VKMIVEEYAYFGEPHC3H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258552, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GB4A4YFSQTSKA46YNIDIDIRDOEKIXOCCME6RG45BRULD633KDQZABRJC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64316999, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GB4O24QI4GT65UXRBH2ZVXPKDCS3HF7UXSCW4ZBU4JUE52RAS7OS7GNH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64556955, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBAJXEV6RQSHLNXIWQJYUAVFZTOQOVN4AAN76EKUQFNX6YPTWEDTAWNJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64352867, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBBZ5ARLATIB362OH74BIYUJ7SKZBZG2Q3WRPW6USGNLXPRYMRCT52PV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425866, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBCI4C4GGIYM2C2MFRFOTULRATO46JM5DLO2WNBL42LQPOO3PEHXU3FH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64392921, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBCUPSMCHV6F5WGQ2F6GTVYW3A72O75U5ZBX2JI7UOD3L3EVAT2X2DBM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64547246, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBDVM5H2HUR2UJU4U62H3AO3B3QA7XXRPOMJQYWKBJ2UT4G7CKKCHXRS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223709, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBE22IVD5UZGE3BBGBPRIDYWZ25WUZ5XDTVVKXRYHLSD7KJK63QY3JNZ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437620, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBEYGVKWVZNB2MYLOBAQVGATNKGJ3ZK5SYHYS4JUXU6PKS5QHWPEDM6W" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64603497, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBF5JQPKGAH73ENUHNY57YNX4R2CDAGSRQW43LULFKNHP42DQR5XI53P" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426579, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBFRBYERVZWUK26QRHHMVSPMUG5N2Z5BZHTZL5QMHUIXLECF36L454LS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64542676, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBFW6RSAV6YPDKIL6QEYE5R6M3KROSQ6J7DYWFNQ2TT3FMT7POUPJCUL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64539240, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBGARGMSDMLW7I4ZPRD5HTGVAEOUJG73PPGBXZ7C7AP7DKXV6TK3QTRN" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64255126, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBHCXMJLEJAS7YIIQ7LM5MZZOZGWUTZOAJ65M6WUZTM6YCWKAL54RQLY" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264623, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBHMTQZDOI2VVZMBBDQ3KAXMRJR35N7GFYRYK4NDSXAII4GAUZQJVTIY" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612191, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBHSU3DNI6IZCVUTBHHYGJUUOVFYORPYKBOQFVBLQBCNOPGCKR4KB32U" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64363143, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBJ6A5DSSKOERUXDT2G2KNCJLRY32IJIT4QG5NQ644DHQHDDKDYAXQLU" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326731, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBJ7TIB5D7WQTE7DG7ZNVUJTD5AY663RPVCCRV5L2LQA3KUHUARAWJWT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264603, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBJEYD5ZZXMPXDZJZ5OAHHDCK56TZDBTZ5WIWCXFFVGAK4AMYJTYFD2O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64225307, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBKEV6LBMLRLWLIVYZMVH2DVO7CANWFNWHWZI6IPV6VSXNI2RTGGYXQL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367652, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBKKKVQR5YPXA6GERFMJYPSSMGJ43DUJPOPLYHUGEV3CMDNVAJDESFGX" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64232432, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBKOUX6KOXYS2PNX7U66OVTHWW4GW2JGQF2DFWHO64N3Y2M2BF5DEGBB" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64442653, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBKPM5RCXJDRYLHTDETCCXM3274GNJY6BTFDMNNESTMQI3NDSC6PRYGV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437625, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBKTPUI7K3X6556BEEKZW6TMPLPB6U3S2IP7SZOYPQWYELJHQIJ5F7VY" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64571213, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBL6Q3ZKJ6VIJ6KPWWS5O6MWNYQXPBIS3IFFL5NYNRCEGRXZDBGXDECS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64516565, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBLMKYSUMGNJB3CL5BYH6TJ7LPZCIHA47G56A4YQZTXV6PA23KPUPLT4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64271847, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBLVHWN3K6J4KPPYIV7BMVELFVUM4UV4CRHXLPUBQ4SGZUSCVNXVTW67" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64273044, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBNXYGYADZN3OFMXB5HUDKXTJ66MLZ2BGVR22VDEXILALZ26BO7BEUDQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64523880, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBPHQXYYQXNDI6O3LMKY5P4BISQH2NQRRI3GFDMD2UXVEDLBM6Z3SA6B" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64330022, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBPT2QI464Z4YGYVFWZ4HZ4JCOZAB4N5TMVC3C4JAVLJ7VZ5TEFC2FV2" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64505312, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBQ2D2PC5TGR6NBZXREJDBAQESEUQ3WWIJ62A5B7P2VEJ7NDT47QPI4S" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223246, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBQ5NADAG6PXWTOZR3KSOAJJ2PIRB4CETM6NBIEUW6JCE3W2D3YFIU2U" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64366183, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBQ6SEKS34TMVVIDJAS6U3BP26D2YB246ZP3W5JCZALI6DYJUUXPYKSJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64576609, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBRPYPLGP7KNWYRGWJYP2NSJ672ZU54UISVFKBXVRCHSRKEQBIX2YI2B" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612710, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBS3VO3ARGGIXRBHDSN5MZ3NTBB6HGQEMRUCE3E5PBPIEE7QCV4BZURI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425813, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBULATZ5EGBJ6R77RIRJVLHR4TEYRLMES4U7I7TVW4AOA3EDRMYKL2CD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64498916, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBVUU2XPZVGPNMOW7TDPI7CPJ2RL2EPD33AB2DZUZLIKGAVECTKIIFKV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64359737, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBWGVQRGKZJNJZP2SQMF6DDBCRST5J5O7HZMDS3HCWHJ7KZOIIYTPIM4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64587746, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBXV2EEM4ME3VBQNHSKBTEDEY4UGKT4PSRWNI4XB3ZHE43KVIFA66PSS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329961, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBYUOXGBUQ746GKXETUCY6TNE326DS2HM6CWBNXAPAEPBFI34IZL7RVK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264250, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBZAMWZSJXEJZQJWOOHBM4U74OQQGQFFQWID5F4QOWUWHLPE7RI5CI3M" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64311091, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBZIEOJ4VXBSNSLQQ73ZXLACAOU7PNR3JIOMT33PYE46UTB47PLIYIPC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64347630, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBZN72COCY4J4755G4KGSCYH4XN353JWVIUD2OL6UYEAZ5VI2PZGRLXH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64227086, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBZNFITNWK2KBCHUERLOBCS6XBQC4LFKEEURYWM7G3AT55LWS3YHOWRL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329989, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBZYZX3UDSZBK5N7QS4B3BJDGEE3BITVZWXFFQMRWT6HIDGK53FTESAP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263536, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC2XWR6TCACRQXGLJKBW4LFOS7ZHGEFC5QX6GIQPNCLAOK554BE4NVDW" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258432, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC35DGZ4HDRMI622LUTETV7W6MJH6GO5KM7FH4LNYMQ57VM3YRMBPC4L" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613764, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC3NRR7ZZLRZAZL4WMLJMUXPXD2HXLYVWKTQOUDLLJP4U2LL7CTWTWJ6" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64558145, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC3OLVPNJYDH26LFK4B4PNVFRGDJYUCMSGJVDJQ3UN76FMLJE77VTX6S" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553087, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC3Q4CJXKLYESHLL4C34CT3ENOT4TXDO3W4PRIQ3C7TC4FHTRAQ5S37J" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64588823, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC5P3MKC4MK5IE5IJYQVLPS6EVSHMYUPOYWPS6AAQQ7FUEF32G3H4TRJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64328421, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC6AMJ46H25FQJ4Y2F7VITAWKUEJCUKQWJDEM2OP6SWEH2WQJM4QTQEY" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258515, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC6C6HXLFESMAVPIOG5ILS7WFQOD6TIWC7M4ASVNJRGTJXYZSAM634GC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64298306, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC6Z7QLRJDCAMTP4DIJO77I3MBH7WHW444FYP7E6YJNACR4W7XACDQOX" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437615, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC7J5RFWAERY3PJD4SFTS5UKS7R4BCA3LFOG5I5GS2IKYJSAWEKXWXQO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263932, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC7MQXJZ7FWEK42QSYTVEIKGBSO77EED5CKTILBWROPZ3J7LASINK7AI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553592, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC7PKCYZRRDRT6HBGPPON4NKQGHKNJJJQ7JN74TM5XBHFH7JBVI7LBR6" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591141, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCAR2MD5F3ALAUZM6XJP7JKKGAPA73DQ6NNUDBBBPSO6GP3SFUKDUBSJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329985, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCBLDIFSZZLQV2Y7XZ7UMY3B4UGBGQQRX636JW5GVCV3CFFMLFDJFC6H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64330000, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCCKOGI4JF3PODDOKPICCGFIMWHGCRCEBAM6JW5ZBOCH3M5B6HC5HM76" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64525312, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCCPDM7HRDZIVHIYK3JEPBQEBYNXLXM5CXCYT2QPBMMS3QZQOAO3MTXK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64302336, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCCRAS23I66EM4AYUUEFVLMQYO6OQMPFXZWLCPWJYLPZW2RETQ324BRR" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64556514, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCCZVSEE77TOK6QTPLUNUUFZ5JOHFQJNXJCN63FBW6VEVLQ676RW7UV3" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490396, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCDD35WKILCDXEKL275OFVXPZBYN2DCTOEIXJZY5W4A2ODWEXK3CU7RH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610671, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCE4LIJFKVHC7DCFHMTAURZFHXT2EWUVDOFMTKGA7WDGZ7VVRSQYNUER" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64559449, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCEE54NZQVKEPPYF5BUWJHMGRORKIRJIXQYW3IFIMHTJIYLSBWPYCZ5H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437808, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCEL3ZJPOL4KGX5AQ2V7D6DTV7XIJNSN3CLFDDBZUMGCPL3E7LCFWJXS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64380432, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCETB2HL6ZPYZPJAGKTB2STFYYUBTFCIMCUHYIW5F5I5PJY2UPY6KZCO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223579, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCFCMBKVHECP3TLBPCC6QRHZJ3AVJDFZM2JGZDHJBW3NVVUV7TJYDLKB" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64271155, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCFN7SN46VC6E766HPZRMBWISI5HVRMGWFFMWPDGDKM5EVPXSLZ6T34Z" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64300087, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCFZKKIYA4QFR2H2QZZ4QHRPZBUU7XRILEQHNYB2FTYRSP7XGP6F645Y" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64596816, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCHYROHFWJWBNFR2T5DXVCORNFEWFPGX3LBOQEIZRTOVE7SBBJEQLCGM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599726, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCIR3QJXGKOTEDVBNFAJOG7WZ6CWI7NYAHWYT67F5CD7ARKXYWRF3LAD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264594, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCIYSZBHHDAD4HFTZKEBV2UC2XTAN76SXZMHWQFS2SRGUKGLBSQ6VFQN" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64236526, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610948, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCK7E564LET4I42RNS2CEERKHCIUAFJLM2HNKK7M44IQRH4RB2KFPJU5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437631, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCKDWMET5N7PWM6DOCSLPLFN37CAD3DQYEBGEPNWREBCHCNYQZWOWQFS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64322546, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCLTZEUNUK6KSTI6OKMZCXUXQ44VIS2NTSR7RWFU2UMDZSF2M3WPKBB2" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64587186, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCMYZU6UFGB2MWTCCGNOAUQWAM4JUWDQDBS4GVB7HZBDDYOUGGBSKXRW" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612255, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCNVUL4E4KBP3S6P7DMLHL7G5DFTIOEIMWXWITBGY3ZIDZQJKOFGDYWO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64388955, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCOHSWSJ75CEEHNRLYTK6R4ALEDJWFY535UOIFVCFHNSJSSIPKXB3NML" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64359800, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCP6XZS6WEONXRC44RG2RFHGF35EJNWT3HBKF2FFNDOWCYAC653323N7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64567990, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCPBFZPPLKE6OYQE74UYFWGTS32UHACB62TO5TJU2VG6NXY4VXBYWLD6" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223250, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCPT5TY7QL3G64O6LEDCJXULHXESZ6AAVGA5EUKKHGJSKODX4PBWSGFJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426679, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCQDJQXVVAF7NRWSPV7BFSIJX7JQP7XVPGBVMXMZW5LBSBJV4F4EA6NG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329992, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCQKGG22LREYEVUF4QAIMXT32SKGETGIWQZDKMYG2W6GZO4KJNGCVWXA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264643, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCQMZAECNSAIMOVZWB7OFLJ6BF3JEL35KR42FG5WE6DIVT5TRLXFWXGG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64541590, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCQQRPKZQAE542XOF53KM7KESYPDWK6LA4EEX2FNUQAG43CL66DQUXHG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426644, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCR6F3I3ZNQXNC5GADLO6EOAKDWWSJV63VS6WXVRISAOV6OPMFAIA4IA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612810, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCTLMEFWQJ4F4VPJKKEAO4FZB5BQ354MGMB7TBNOWV63D6KN7ER34MHM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64509369, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCUKUSWC6GI2UMBIGLS6IECS2BVDDCNBRVFR4QUHXSKMF47MYBYBMJ5V" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472895, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCUOHOGGKIGOYZAIN7GI62E47UPPJJK2J6BJYIM6YUEBVTRRE6NKABDL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64312369, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCVRUOOSB53I2QNGBHMW4WMKPVULRKBYEIW3JPB56O64PMOJMCZGX5HI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64606259, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCW7KCKK4T3KZBP4X2TT2UKYOZPJH52TPFDZWNUXUIW2PDVRDNZJUPGE" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64226096, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCWCR3TKBCT6BH6YNTEONYLRLX57TOVWWANPY4S5ZEVS3PJQQXVQIDS3" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64464805, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCWYCR2NNOZMITJBLXGNSFAWT3YQDHXOIPUPCONCQZPRAUZGWDNGNM7M" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323557, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64302368, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCYNTQNZYQLRF4ND3FAWGYFFYN3XSAGZF6WW6IGBTVRQXPIQYP5WRU2X" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64608026, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCZZV7L6SJY3KDPUCSXD5MQCXOYSZA22WTXYX62M3RBCRNXE7J4ZJHLV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613958, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD2DEIBYTR4H6ME44J53Z7XQOGDDZEF3ZT2SGKXIQXTW46QFNMUT6B3D" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64522751, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD2NW7INAHXPCY2CGXA7K74QVA3GOB7M6KP7DJNDAIEHVSK4CROWYNIA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64593505, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD2SOPA77HAN6FUAT7XXCTC6EVRL3WWN5OZ7VYNZY2WBZP4RKNQVV2IG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329548, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD44P5UZ4XJJJI2KSHGYXHYR2R44Y4KLKPH3DQDKPBSJD65PSWQKPXCI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426637, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD4ZUBMN7HPBN3YQPIFNL5JQICVFXZFXIQ7Y2T7MRIDHXMOLBBGD2HWS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264020, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD5AVPHJ26B4NBSLDUAUB7HI3XBFKUKLNOHKKK6EKYHB5ILTNA263PDB" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264567, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD5B6W6W7DA5EJQN2OX7CJAVZW6EODGUUSGHBNFA7DSBNDY7KFDPLWFC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64522796, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD5PABD6RFOAKVAH47H2RNQDPS5HWGDYXM5N7LPEMZ4N34CH7QZOW7HL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425801, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD6L5SNMVT5SXUG5OGXLGWQDBNVGY3OQFXPEZHA53PNEE5DAXOX4CDH4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64314189, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD6UB3JOFRLJ4DJAWJ53GFG5FXBJSZITL3LG3PGSQRLXGWRTMQJNQA7B" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437612, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD7R4BI47Q5R4EUYN3AZ5EV4ZMMN2DRUG5DOSQS2ZRCYQLD2OICI3CLT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64324058, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDATYNHFA7NFTK7NORYI2HENINM3LJ2MA2BEFGYK46POPG662WHB524H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426669, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDBTK4QJ22WZC7CD2I5KOBNVN5AIRU3DD2EX3YZBLV7M46Y6RYUNCDLR" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64588734, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDC25VYWGWCK265BS6MKGYAUCBSV3LVQS4LUY33PUOT6S5NUNOEPVRVD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591257, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDC7HWCF35MCND4IJBTSVBOAKR4BG2HI45R345ERWFQGML2HS7KGGDLQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223819, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDCM56BZLWE46BDAXPZFSASAXWW3YQLPZY2AKF4FILXNDPREOVJMSONX" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64379324, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDCTZYDD3YXCXSA66WRLLBYYM5Z6IWITBSP3T3AYZOC4RUAIFS6GJNM7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64245406, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDEHJYBPFQLVO4YIOG6USXYIZYHSBLLTIH5XAXX7ZARLNHTXPC6RQUQG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64431410, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDENLMKPPVI7HYVJWRJIB6Z2AAIQNUKT7VSG6VJW4WGR3VAC5MAY6IQL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425894, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDEUNFH2WAXZC5VPHTULLKE5I6VJMRWZHDN5ZGL3DAGLHMGSCBHPJCPC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64521008, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDFZJIBTR7JFFH5MSTBWVXPI3ZB5VZAJQDYRHAZ3EHK6TCIMW4NPVHWV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426651, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDGH345DWYQUQJT3LFED4SVRVTGYYBP7MWTWXDAJTBDBQA6HG2E3KRD5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426710, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDGR7CBKULHMNJNCWPSS3TMNAOWK57PRKRQESDKZCR6LX4FU5ABFDUBR" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64282057, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDGZXEANOXIJRO5CGHDUTWDARC43OBEFWZF2ORWCMGTMQD6OELJ5VQPF" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64400760, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDH3X6UEA7BDMXY4HNQOM4RYAYSJNUT4TFSFWMF2F3ODG6FE7MZ5IMZK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64238032, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDI3IFSW6CZNMF7XMBME6YYUDBE34UQ67QZR64PNRIJSZUR6YFH7UI5L" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64563752, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDIFMYOSTTEWCFFRQS53JEQ7MFXGHG77I7ACVJKU4Y72QBWP5HRI5XF3" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367206, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDIWDJGCMGXXYGG6HPLNQHQV3KFOYXRKBSCKJZZNTMXELIFBS4D4ZSDK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367139, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDJ4K2KHJTAM3MH47NXOOPCRPKCKRVS5VLVGIBEK7BHVB6NPJNIOQLGF" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64511501, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDJ4W5TOTWIUWSKKGWGT4UXEZNHVEGEU5JHSASXUYT7ZSZV3ZY7HE3VC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64541870, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDJTYHSIWQG35TO6YFFJ6GB4RWFFJH4FMWQNG6BW7DGXHBIWESZXY66S" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64288319, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDJUY3N2IVMYWPWL5CHEIGQHSMBQROELUHF4QTIMC56GVO27FLKDEPUS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64516786, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDKMSQYPV3M2ZOZ6ELXDVQF5YWYEZPJIQA2XODJOGHZ57PE2XAD3BD7O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425903, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDKSGHVOWEEVLKW7WFNR62N5DRVTLYVSMODJ4ZSKB4EFR5K4LGOIGSUJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64447174, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDLKJIHOV4BOBWWKZAKVVHYGULR6NNGTR2SB5OYTROGMSGODVJIZ4BH2" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64596313, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDMBA5ZEC45HNJEO4R6HV6X53LDALAV4PBI22KGJL4X3WVFKBWGAPFUM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64315542, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDMGYNO4UIGSZP46GRSUFR6IZANBMAK4XECGYCI5N5UIWQCTRVKOJWW7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425817, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDNC6UMPK62ZGHRT6PUY7LRLIJUZ7SWGLTF7XPDOYHZWC3VKDMT4ZNFM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64226564, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDNWNV2PBY54YRL45GVHRDHA737SEPL6BZMAKRI2IDRKUEP56GERIHDT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264638, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDOAQK5AK4Z3TAFIMU4WMVJSVZECLK2NEVPRGG4CSO54ZWHFHBE6IDMI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64330672, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDOIC3LPD34KTKRTFOAMB6CKAYZNOIGV5V7H5YESTNMFSQ5JG5PMFS3P" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475193, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDOR4CPOMWGJIYUKLHUAWG6YKG5O54W6QXU4W6HSB5I7UIZ3GK3LFGDX" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64239430, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDP25U2QVO5LSHQRG36UEFV3EU2B7SGI5QSKBWHMGZILOYQM5T6ZLDFL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553198, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDQRHRIHCEFBBBGV25MVVV4CPOZKGC3L2WE2VEAJP5YU3MGYSXU472DT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64567961, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDQRMSPPL36367H7GTGY737ZCMERZIODQYBUSSKQZ2KKJQXVP4J3KICR" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64353138, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDRNFVUHSAEFPJ6RHROZNL4PZODJQAGOPUNDY7XHQKN7QGNFJZPNRJ6F" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425886, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDRZ3DFYOVBOOONOM6UWYINJLRE4BUSOXCEJCKWXOVU2WOC7XT6F7MXR" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64327772, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDT3QTEWTO6MY4UDP6OSQ3CBBAYA7LQLFAMS5SDIA4BZIUPISEJ4DVXA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64240080, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDTEKTRGDPHBT5UTUHYTJR3JDZDPAJ4ZNKFOUROFSDZI72POQJM3RBXK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425823, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDTRBLSF6K3MI2MVS6DSLEHWRKHWUE74ZF6SE57VHFSL463TY2L6QX7O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64313529, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDUHWGNSL6WL4IIYKP7QMEC7H4CAOX5Q65QG7JGHCPBRRXALLSE6WBP4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264614, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDVGNWW3GMZE7TNCBCZKB5UZJMECGGLG4XB3FJGG5NFNHICRXWQF3AAQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64318734, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDWHA4JM3W57ZZMIZBZIQF4H7PZOACWVR2ZWOI34VJLBMFB6TCAH7KP4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64318577, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDXURAFHE27EXW2L2HE4PQIWJEO7MXNROPZBSZ4XO2HQWTDNA4REUD4U" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64255162, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDYEUWPLNHSIZ3YC5B2WTFF2EFRVCHLEAE3BN4IMY2PIVU5OW6BTYXTS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64325738, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDZ2HV576TOUH6MXE5NR3NOSZHELDXRQ2ULBZS3IKNFANRMTU4FTMIUG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64590233, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GA25XFBDROFS3V53RRGHGN5IY2LQFP3HO4IFSOZS2SAAQA4DEJ7JHWX4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553015, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GA3NAZYKIAQWJHXCUORX3FUXZCCMWRFIKJFEDMLEUFMCWELYD2LCDWON" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64580320, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GA4DJDM66BZLZ54K7GLZFFPKGBNC44IPZSHMMZ6G7YY5TOQH3N5T5HAM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64569908, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GA6UANZSAIOSKXKPYXEYLHAUNTQOJNKUIKCPGFNU6RVVTPJDJJNHOJYH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490683, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GA7YDWNQYXXLAWBZG25MH3XI2QATNC5CVZZ7U3IKWEWCDEV4B6E54TLM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591764, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAAZEXTYFCDS2QNXAYKVCMAUJLUZACWVOQ2WVRUUEIXC6ZKSHC6GDU5O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64430417, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAB6Z7XBXJDS736GUA7RXUSXSHZCDC5X23BB2OSN6UAG7CNKE4SXQGIL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64585929, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GADGXEIP2NEIJ3723RFTFCSPVJIJVM42RTONINH4MRTMUV2KBDFBORF5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323357, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GADWDDKP4TKUVNZVSKXFNFN6FXSZYIAHL35R6GEQB4M3QK3FNEF225YS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264369, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAH4O6GYKLK2VZBSRWVKLLJ6K6XWWW3RPYG37BHA3J6SNW6WKW5MURKU" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64605246, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAHCZAPDQH32PUCAUSIA6YUHRZP37C2RHNN3IHBW35JR2A4W6IQZEFKE" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64540449, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAJJYKVGLTGP6A3ANITXSKM26FT5OWLOV6MLWQPGHMOLWGSXXPRNOAFM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64565075, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAJOAYF7JRQNPAFECS7SDYAKPPZHEUVSDMHFHPKYWYWECIDAMTTFUBRW" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64444489, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAPFD4AVZGSXJGZ6SQBM4VOVNAVCZHGQT7UXALJSNDZAN45DCBFNVFZP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64502295, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GATRUJAWQWVWSSXYGUDDXPDQG4EGHNIQBMYCBYWX7HVZJQYYAMPYAHKL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609894, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAW4DTRCC6JEBXQN53RYX6D2TZZ3Y2EUBF54HC35RR6TOYCHCCUQZVI2" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64590322, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAYNG64UV3AS4PK5CAAZE65HQYBVPYEAAGSK4YMSIW3DAT6GZY632N62" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610273, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GB2DG2EQGAUIW6VFQ5I62RMXJBWUBAKYBKCY77Z7UEJUCYHX4IPEGEOA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612244, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GB3EXLNQXLMQIHHIRT2RRMSUJVZGCDSJ5K2GSIQ6H7CQZBDXCMWLD4XQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64349191, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBAYJECW5TX6VC5BVHMHC3CXNGOCH7SMKEB7HY7PY3FA74ITFV6EHRKU" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64352852, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBBZ5ARLATIB362OH74BIYUJ7SKZBZG2Q3WRPW6USGNLXPRYMRCT52PV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64603479, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBF5JQPKGAH73ENUHNY57YNX4R2CDAGSRQW43LULFKNHP42DQR5XI53P" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613953, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBISWUA6YYUXWP5LZ6HEQSUSAGYLSIQPMVJOOPELXNLJNFSAI67DAYK5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326454, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBJ7TIB5D7WQTE7DG7ZNVUJTD5AY663RPVCCRV5L2LQA3KUHUARAWJWT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64582917, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBKOUX6KOXYS2PNX7U66OVTHWW4GW2JGQF2DFWHO64N3Y2M2BF5DEGBB" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64511100, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBMFSMT3OK6T7LOWJBINEAGN7W26GLOCAFOV5GQU2ORSHI6Z2SBFP3OM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64376176, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBNKYCX5V47NRSXU6JVHZNUUG37GXVEM2VACRURJMES7NPKPG64A2Z5E" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490197, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBSXTAYAIUG74OCSFQQ5W4CME2WLMQMQBTPSPZDG47XALAL42D6IULES" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613924, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBTCII43YUWJ4Y6KUZR46SP6BJLWLJWUYVHVRGMANY2XR5RG35FXRR3S" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64359714, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBWGVQRGKZJNJZP2SQMF6DDBCRST5J5O7HZMDS3HCWHJ7KZOIIYTPIM4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64311868, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBZIEOJ4VXBSNSLQQ73ZXLACAOU7PNR3JIOMT33PYE46UTB47PLIYIPC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64241515, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBZNFITNWK2KBCHUERLOBCS6XBQC4LFKEEURYWM7G3AT55LWS3YHOWRL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64559193, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC2ZO2H7SYITX7AXBGOJNQHRGVWSTABIKHROFFE3ZDBYUOGGBDJ5ASHK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64349920, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC33RPJWTEV5ND6DQ25SLT3GYDDPBZBQ3T3CT7R6QDY45YKJLLSTIJBZ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64290462, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC35DGZ4HDRMI622LUTETV7W6MJH6GO5KM7FH4LNYMQ57VM3YRMBPC4L" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64361042, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC3KL2WTNWWK4C2KZFLKKMECF6JZVDXKHGATDIWQ7OJU3OHZSVUBK2Y5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64558230, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC3OLVPNJYDH26LFK4B4PNVFRGDJYUCMSGJVDJQ3UN76FMLJE77VTX6S" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553080, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC3Q4CJXKLYESHLL4C34CT3ENOT4TXDO3W4PRIQ3C7TC4FHTRAQ5S37J" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64563924, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC4ZC6F65CYSIN2TT6XO5BZ4GNYZ2TCQIVGBRMCHUI2QMPOQISORL6DO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591595, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC5P3MKC4MK5IE5IJYQVLPS6EVSHMYUPOYWPS6AAQQ7FUEF32G3H4TRJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64555428, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC6NCYXDLUZ6KYJBVYJ6MSIHORZYGTL6T7B6GTLF4CCI6AJ6SBVF3NUQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553586, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC7PKCYZRRDRT6HBGPPON4NKQGHKNJJJQ7JN74TM5XBHFH7JBVI7LBR6" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64584895, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCCZVSEE77TOK6QTPLUNUUFZ5JOHFQJNXJCN63FBW6VEVLQ676RW7UV3" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64562758, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCDD35WKILCDXEKL275OFVXPZBYN2DCTOEIXJZY5W4A2ODWEXK3CU7RH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613318, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCEE54NZQVKEPPYF5BUWJHMGRORKIRJIXQYW3IFIMHTJIYLSBWPYCZ5H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64381440, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCETB2HL6ZPYZPJAGKTB2STFYYUBTFCIMCUHYIW5F5I5PJY2UPY6KZCO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64336907, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCFZFN54GPXIVILU6XGGZXGA6UIKPAIUOQWVBEEX4RJHKSPEVKZ2P5QQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64313255, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCFZKKIYA4QFR2H2QZZ4QHRPZBUU7XRILEQHNYB2FTYRSP7XGP6F645Y" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599743, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCIR3QJXGKOTEDVBNFAJOG7WZ6CWI7NYAHWYT67F5CD7ARKXYWRF3LAD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64606656, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64611676, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCK7E564LET4I42RNS2CEERKHCIUAFJLM2HNKK7M44IQRH4RB2KFPJU5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64271513, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCKAXQ6XLXOJ366C3P3VVLXU24X2UQ3YERWL5VNX2C77E6U7C6KTAAVJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64278951, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCP6XZS6WEONXRC44RG2RFHGF35EJNWT3HBKF2FFNDOWCYAC653323N7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64388920, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCVRUOOSB53I2QNGBHMW4WMKPVULRKBYEIW3JPB56O64PMOJMCZGX5HI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64465331, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCWYCR2NNOZMITJBLXGNSFAWT3YQDHXOIPUPCONCQZPRAUZGWDNGNM7M" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323680, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64607941, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCZZV7L6SJY3KDPUCSXD5MQCXOYSZA22WTXYX62M3RBCRNXE7J4ZJHLV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609323, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GD2SOPA77HAN6FUAT7XXCTC6EVRL3WWN5OZ7VYNZY2WBZP4RKNQVV2IG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473454, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GD4UNF3UMYMI3NA4RZGPRYIDELND3RAS2LV6LTJKNKWHBAZVSI4GELOG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64344684, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GD6ZYOSMNEEZAIJYKCDN7MDA6H2MUHQKYKM6GIYEQ52JU5GI4SSGMWL6" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64306443, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDAHCRUEUXSLIGGYPCKBHQT2TWFTNEII62GAHGJETGOON5N4I6XPLFVA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64324049, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDATYNHFA7NFTK7NORYI2HENINM3LJ2MA2BEFGYK46POPG662WHB524H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613252, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDC7HWCF35MCND4IJBTSVBOAKR4BG2HI45R345ERWFQGML2HS7KGGDLQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64379347, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDCTZYDD3YXCXSA66WRLLBYYM5Z6IWITBSP3T3AYZOC4RUAIFS6GJNM7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64571752, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDE2M7YEYHQIJMR4I6HD2AHUVJEYPMRSHY6KLWM2C6CIJYVYHNQW5JJP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64521142, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDFZJIBTR7JFFH5MSTBWVXPI3ZB5VZAJQDYRHAZ3EHK6TCIMW4NPVHWV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64294467, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDGZXEANOXIJRO5CGHDUTWDARC43OBEFWZF2ORWCMGTMQD6OELJ5VQPF" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64256894, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDHEFAG7XPZ4UZXDT7OT342PYTCF7OQQ34LZJNOWK5CLRLTLXJAYENKI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64542114, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDJTYHSIWQG35TO6YFFJ6GB4RWFFJH4FMWQNG6BW7DGXHBIWESZXY66S" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490742, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDK2HMIISZ4B5RR5EEA726OJEVRQHHZJHDM7SVB2Y7K5XCRI33QIVU3H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64566542, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDKMSQYPV3M2ZOZ6ELXDVQF5YWYEZPJIQA2XODJOGHZ57PE2XAD3BD7O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64227355, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDNWNV2PBY54YRL45GVHRDHA737SEPL6BZMAKRI2IDRKUEP56GERIHDT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64589966, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDOLN2CLLI2KI6CVENF2NWCL36NBONRP64P5MVAIP5CPT5QWQCFYYWYV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64548620, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDP25U2QVO5LSHQRG36UEFV3EU2B7SGI5QSKBWHMGZILOYQM5T6ZLDFL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553206, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDQRHRIHCEFBBBGV25MVVV4CPOZKGC3L2WE2VEAJP5YU3MGYSXU472DT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64537809, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDRA4YPSRYDIG5QPAB2WISP3V5SGRCJVID2MZHI7UVCPCZGB3JWCZZAZ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64353052, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDRNFVUHSAEFPJ6RHROZNL4PZODJQAGOPUNDY7XHQKN7QGNFJZPNRJ6F" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64327812, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDT3QTEWTO6MY4UDP6OSQ3CBBAYA7LQLFAMS5SDIA4BZIUPISEJ4DVXA" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64340116, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDUHWGNSL6WL4IIYKP7QMEC7H4CAOX5Q65QG7JGHCPBRRXALLSE6WBP4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64353005, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDWHA4JM3W57ZZMIZBZIQF4H7PZOACWVR2ZWOI34VJLBMFB6TCAH7KP4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64596129, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDZIGG5CNRL45CAWPFYTJ7K6JP4XJIS7DF6T3OIX4NVIU4F6C6E7JIH5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488077, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GA25YVWWZN4AME3HS3OTPSDEAHC7DQXEQXFLZHDLCKONARU66ZGCXMUE" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486558, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GA4DJDM66BZLZ54K7GLZFFPKGBNC44IPZSHMMZ6G7YY5TOQH3N5T5HAM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490637, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GA6UANZSAIOSKXKPYXEYLHAUNTQOJNKUIKCPGFNU6RVVTPJDJJNHOJYH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490196, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GA6WVPSKHSY5SYBSQLYRQILALJRYDJKCJ24GMZVA3SW2BI3CBGHDKEN3" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494878, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GADCI46FPSCQ4GWCJBXZYLPUTIIYV5OFR5JFRU7ABFMO4AH7W2ELUGAP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496863, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAHLSHD53JDVKMPIOZNB3GNKTQXYCLS6R6FYX2BGFEWDCBHV2JMHUCVK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492538, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAJGJRHG6ISSURFHTMSG7SI3PVS5XVME7OJHOAMP7BRHASSIZQHUOS6E" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485395, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAMH2GEVQXETLZGAFWMIU5RKXSRON5UFIMTWX3B7JMTJ7QG77C46RLNO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488726, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GANHXXHJWLACEFFSZJOQSTAZBBRV65F2G5CNS5J5YBOWROWIGUS4E3R3" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488312, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAOAE5MEJCCWMBAIKDGD64UBHUX73SE3EBVV7GW5UWJK6AHZSUWA6U6H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493957, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAR3M54VVNPAC7TKQZVZZQTW5LLXV6UL56VAD3P3GVM4FQNTJNEI6WPV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487181, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GARDPYJY3URSWQWU2CSOG4JQHBD3A2HK6EOQHUEPKDWYNNUPL4FDDWS7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486032, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAUB4KOF5DQRW35B6Z6Q5ZBJNGCWZY5F55OFYDW5OD5A5FGPN5VPBEBJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486860, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAXWC6RGYLTDCLD52LLRUVTHW6RUE2QYTMSGGUMZMZBFAAZ4E4GTURSB" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493836, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBBIXKRKYU4XVEWEZPQ6XE4HUIEDI26OOCANJC37AJCUKYGQANFMEVI7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489872, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBCQCUF56FZ34A4LIFBUMSGQ3PD2HONTADI7OZVDW2LQ5I2NPHXE56UK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476491, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBDVM5H2HUR2UJU4U62H3AO3B3QA7XXRPOMJQYWKBJ2UT4G7CKKCHXRS" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490869, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBFEMXAVBW2JSNVFQQKHWAKOAO2COIMZOIIKMRE6OL63R74SMSWFIZLI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495135, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBH5L3YEZICNEZV4GXJ6LYNG5TIAXRELYWZYBKUOZI5LOFO6CLUT5GPY" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488943, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBI7MHCOBO56HPIOJ4WBDZIAZB2WB3YBJYBZRLAWIOMSEKOMJTKNBMBX" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476690, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBKJMLBPFWZTUVBJ5DFQJGJLDHR52JHJTAOO3JDPAILRTABKGR2A2UUY" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473717, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBLW2D4KJQTSPLMHBTQ3F7Q4W2KNJYPT7DUF5P3FVRIC63CZOQEHGPDQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489097, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBNAYCLP6TYGS3NLUCHUHWHCEKUNX3B5UQEMO3K5BH7ATG73JBV3XTXO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487831, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBNQO6SYESAPXFRZOOFJUMW7QQL2DSNAC3IQH2XWOGLPEE2S3SXSU77D" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492418, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBP2P4JAKP7ASHKSOQABFRSV624LYNS45NE57ZOMUJD2E2ONBHP66MRJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497312, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBPA53YAWB3I6CLSEPX6D6BG6SOTP6G7OJVSEPJ4QUTBHLTRWQC2YTEI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492339, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBT3QYFC2VJRKTWAW2JJ4ZGUSOSXJN4T4XHSLYCB7BSDRCQOA6YIATJG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486015, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBU5PAXAFBGLPYZRCWHUFFN77737DN6CVRSRQP67IBMTEX6ZP553UKON" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476165, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBVFPIPPCXIW2GCUEA7WTOYZJ32VUYNO7GUZSB6DCAYV4G2IJ7JWS43O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490051, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBVUU2XPZVGPNMOW7TDPI7CPJ2RL2EPD33AB2DZUZLIKGAVECTKIIFKV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494483, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBWGHKRNC7CAR4FBY7FQTTTKEJGTPL2L6RTS7RIXDEPCIEG2ZXCEVF5I" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496983, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBYXAGK76FXYNAD73E5W6O5UYD74MR4F6N74O5JHOSOMU7A5Q7Q2O6U4" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473462, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBZFPXM2L6ENBLXBPUOXTVUIXLTI4TRAZ6N52NP2FNWRER7R5ZETVSCG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487025, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GC3BD233YVEL4NVYZHQ2IHWQNNYJQTVDQGY3R357A77PU3KAO2RH2AUF" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494595, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GC5DALRCGWSK4PZDOK7I47EGJGEENNGBZMTBNQAZMPMPQKFYOKQYLW56" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489514, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GC75TVZ4HGQF7PF4LEAT5Y7OONTTGUQ2I275A6AOR5ZHRXQHYCREZRTC" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485434, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GC7QUT5CLSK35R2C5JI4LP4P6W47K6RJJARZLPTLVLTJ34YVZIFRKLTY" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489309, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCE4LIJFKVHC7DCFHMTAURZFHXT2EWUVDOFMTKGA7WDGZ7VVRSQYNUER" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487065, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCFM2ROFIA7AGJ2UER2GVWIKTNWY6UZGYX46TP4FGX2CGJZZ643WVNJJ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489534, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCIBOCOAT3JJJWEEGATGHLM4GFR75MDW5G66UXGLXKB27N5EOSKT3GFD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497102, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCIFU4XBA4JFJNR5CJNDACNTXMTUCW5LU2XTZ5V6PYIGQF7MIQEYGUDH" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496005, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCIR3QJXGKOTEDVBNFAJOG7WZ6CWI7NYAHWYT67F5CD7ARKXYWRF3LAD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488254, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487661, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCN5RTDME54YCDS4LJYWDGX3ASD6MYURMVGAYPV24LWW6KYWYDMDZKWQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494603, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCPXZWNP7AD3MVOLQFKVCDMXITHI6ZX4LL5JYLS4XQNPEVTF7CCKXYMV" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490914, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCQ5VQGWHOKPR5MRI52TJNLOGJMQGXHI34FICOV47G2Y4NIDHPVDFR7G" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494941, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCSYQ5IDWYTRFX36UAIUOLG6TNWPKTP5MJ73FLV5R4ETQ6BQORU6M4FI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494335, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCT5HH53MXGEX7OQCPRBM5VBYPWMXFTS7VFIAA77K2UDSOGXZONH35CK" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495900, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCUKGEAU7QNUFG4CRDNJZYUA2XR3AETEVS6MDH3GF5DY5LOEYC6HDQTD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473381, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64471299, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCX3NIFZEBAVU6DHZ4O4ZVJYTEMVBFDXVHX6V6PV2N4EYPCRFBP7GW3X" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492881, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCX4YJNRMCNCXBH3DGZ7HWAXXLXFBRSJWU7BNNSEDMREYSGL35I2AN5H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488014, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCXEAJ7WYM5ZR5O56OHCMWGKCHRSGOJJVRGSCVNNLSENQXDAGIVPSU72" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492073, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCZ5BVJDG7OVI6GUEA3GPBGQLMJLSJVAFND7QWZUEC4KDYMB5HSA2SFB" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492234, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCZINFPZ33TOWAMT4A52UU7P5ZZURRYFQUHP2N3RSSKVGXHX6AWDWCOD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64478096, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCZJMNAUIQ2U577P4RA6JQNRX6LABXZGQWBCJAKERN46GU457K6C3GQW" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472987, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GD4UNF3UMYMI3NA4RZGPRYIDELND3RAS2LV6LTJKNKWHBAZVSI4GELOG" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493736, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDBY6AK3PTYQFDF6L3AV2RQE74V3KSKVJAT7GEV6TPCX3KQ7C6QCKPZD" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496873, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDC7HWCF35MCND4IJBTSVBOAKR4BG2HI45R345ERWFQGML2HS7KGGDLQ" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497293, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDENLMKPPVI7HYVJWRJIB6Z2AAIQNUKT7VSG6VJW4WGR3VAC5MAY6IQL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492556, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDGNENZ4B2HIZOXO2LUVTI4MC3HIT6LWOX2LAMTMGSGQ57MSFE5ERJIT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64491030, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDGU3HWNHGZX3T7LERAOCP73TYESCPT6QYOXNBY7JPYWIM6WKJWHSFCI" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497108, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDGVNX64C46N2RGQ7E7EW4RKBG6PZ54MPWSWSSOYZA2LVSLY3NXBSC6R" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489740, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDI3IFSW6CZNMF7XMBME6YYUDBE34UQ67QZR64PNRIJSZUR6YFH7UI5L" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486173, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDJTYHSIWQG35TO6YFFJ6GB4RWFFJH4FMWQNG6BW7DGXHBIWESZXY66S" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490239, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDK2HMIISZ4B5RR5EEA726OJEVRQHHZJHDM7SVB2Y7K5XCRI33QIVU3H" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486074, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDKMSQYPV3M2ZOZ6ELXDVQF5YWYEZPJIQA2XODJOGHZ57PE2XAD3BD7O" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490478, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDL7S4G5BGQECSBNGAVTLMZTICV5MSO5GNPRZBNJEWDXWR5NENHUEM3U" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475733, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDLVB47EHGB6DBTAZHC24N5VGC5B5JGAG6NTBJ3O23JXLONDWLIQVJVL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486469, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDMHMOM65BWYHVYJRXPYDCSXT4WPP2XMZC6OR5V3NFNJWUEXQR4YPUX7" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475488, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDO3D2K3TFJSEB7GFKMUGXVCFFIEXRGNPXZTRJ27KQLYEZDDCOBUZV74" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDOJ3XPIAHCYG26SGBSJY6KJDIATCNHEIV7WGFVL7WAY5XX2KRDVA47Y" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64491524, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDOR4CPOMWGJIYUKLHUAWG6YKG5O54W6QXU4W6HSB5I7UIZ3GK3LFGDX" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492868, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDUYVERC6QT6QQZ3SCBIZYRAJH6E42JZQHUFG6F46Z4Y2OM27BK4WO53" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492654, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDWVOFFYGIYWYTRKPXMNUES7NHAJWEUKEUL423DE36R23TAJO5Z7Q6LT" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493104, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDXURAFHE27EXW2L2HE4PQIWJEO7MXNROPZBSZ4XO2HQWTDNA4REUD4U" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485241, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventApplicantSubmissionCount" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDYKGYYSOGYXBOIYOOO5MNZKVT537H3C2T35UIIXWKVXTZRLOKR7DTS5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64457347, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventManager" + }, + { + "u64": "271539957145796615" + } + ] + }, + "durability": "persistent", + "val": { + "address": "GACS7T5ZHYDMZZCPC6KXPOSDWMFAYW6TORL4JJHBXB437XPEYS2YMOFG" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64744258, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventOwedTotal" + }, + { + "u64": "271539957145796612" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64725863, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventOwedTotal" + }, + { + "u64": "271539957145796613" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "0" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64440680, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventOwedTotal" + }, + { + "u64": "271539957145796614" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "0" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599980, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventOwedTotal" + }, + { + "u64": "271539957145796615" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "0" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609068, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventOwedTotal" + }, + { + "u64": "271539957145796616" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "0" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63717877, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796609" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GCPX5J4CXKA7KFIJEGUIR63SR6CKQIEGBFSAALMFLE5IURDHXJ66KFKL" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 50 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63840900, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796610" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GBKA233FZEZ3QIZVY4BH5IO3UZMZQV7UHPCJVXB4FYCMEYBUSPRYB3DA" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 50 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63840900, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796610" + }, + { + "u32": 2 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GCFRGHJSLBUIN536Y2K4Q5KGKE2AXSZPQZW37ZH62VCYD2XSEWBNZWNO" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 25 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 10 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 9 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GDGZXEANOXIJRO5CGHDUTWDARC43OBEFWZF2ORWCMGTMQD6OELJ5VQPF" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 5 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 11 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 10 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GCFZKKIYA4QFR2H2QZZ4QHRPZBUU7XRILEQHNYB2FTYRSP7XGP6F645Y" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 5 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 12 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 11 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GC3Q4CJXKLYESHLL4C34CT3ENOT4TXDO3W4PRIQ3C7TC4FHTRAQ5S37J" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 5 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GDJUY3N2IVMYWPWL5CHEIGQHSMBQROELUHF4QTIMC56GVO27FLKDEPUS" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 50 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 2 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GAF6ML2FAQIT7GPP74FRUH4DDEOIMPJENDKBJLMAEHY37B7RTEBTIYOP" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 25 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 3 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GC7PKCYZRRDRT6HBGPPON4NKQGHKNJJJQ7JN74TM5XBHFH7JBVI7LBR6" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 10 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 4 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GB4O24QI4GT65UXRBH2ZVXPKDCS3HF7UXSCW4ZBU4JUE52RAS7OS7GNH" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 5 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 5 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GDNWNV2PBY54YRL45GVHRDHA737SEPL6BZMAKRI2IDRKUEP56GERIHDT" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 5 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 6 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 5 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 7 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 6 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GA3NAZYKIAQWJHXCUORX3FUXZCCMWRFIKJFEDMLEUFMCWELYD2LCDWON" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 5 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 8 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GDQRHRIHCEFBBBGV25MVVV4CPOZKGC3L2WE2VEAJP5YU3MGYSXU472DT" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 5 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 9 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 8 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GAJOAYF7JRQNPAFECS7SDYAKPPZHEUVSDMHFHPKYWYWECIDAMTTFUBRW" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 5 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716191, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GDHEFAG7XPZ4UZXDT7OT342PYTCF7OQQ34LZJNOWK5CLRLTLXJAYENKI" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 50 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716191, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 2 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GB2DG2EQGAUIW6VFQ5I62RMXJBWUBAKYBKCY77Z7UEJUCYHX4IPEGEOA" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 25 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716191, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 3 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GBZIEOJ4VXBSNSLQQ73ZXLACAOU7PNR3JIOMT33PYE46UTB47PLIYIPC" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 10 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716191, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 4 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GBMFSMT3OK6T7LOWJBINEAGN7W26GLOCAFOV5GQU2ORSHI6Z2SBFP3OM" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 5 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599965, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796615" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GD4N2RWP2GD6I22O2MVUGTSEBGVLFR2XIRC5OHIQ7K6EDPOJRSHAZRXM" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 50 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599965, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796615" + }, + { + "u32": 2 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GDUW2GJIT56XTAEF4ACXDO7PFUXE37JDZXS5OOMO73UEUZD7BXALKZ2K" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 25 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599965, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796615" + }, + { + "u32": 3 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GC5P3MKC4MK5IE5IJYQVLPS6EVSHMYUPOYWPS6AAQQ7FUEF32G3H4TRJ" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 10 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599439, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GC5DALRCGWSK4PZDOK7I47EGJGEENNGBZMTBNQAZMPMPQKFYOKQYLW56" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 50 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599439, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 2 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GCE4LIJFKVHC7DCFHMTAURZFHXT2EWUVDOFMTKGA7WDGZ7VVRSQYNUER" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 25 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599439, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 3 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GCN5RTDME54YCDS4LJYWDGX3ASD6MYURMVGAYPV24LWW6KYWYDMDZKWQ" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 10 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599439, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeAward" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 4 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "anchor_idx" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + }, + { + "key": { + "symbol": "reputation_bump" + }, + "val": { + "u32": 5 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63717877, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeBaseEscrow" + }, + { + "u64": "271539957145796609" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63840900, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeBaseEscrow" + }, + { + "u64": "271539957145796610" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "1000000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63717877, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeClaimExpiry" + }, + { + "u64": "271539957145796609" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "1793188884" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63840900, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeClaimExpiry" + }, + { + "u64": "271539957145796610" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "1793879981" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeClaimExpiry" + }, + { + "u64": "271539957145796612" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "1798642722" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716191, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeClaimExpiry" + }, + { + "u64": "271539957145796613" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "1798642737" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599965, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeClaimExpiry" + }, + { + "u64": "271539957145796615" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "1798061604" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599439, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventPrizeClaimExpiry" + }, + { + "u64": "271539957145796616" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "1798058974" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63716828, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmission" + }, + { + "u64": "271539957145796609" + }, + { + "address": "GCPX5J4CXKA7KFIJEGUIR63SR6CKQIEGBFSAALMFLE5IURDHXJ66KFKL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCPX5J4CXKA7KFIJEGUIR63SR6CKQIEGBFSAALMFLE5IURDHXJ66KFKL" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://www.linkedin.com/in/nnaji-benjamin/" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1785407018" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63817351, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmission" + }, + { + "u64": "271539957145796610" + }, + { + "address": "GAMYN5NNVOY2O4E6PTTAUWFSVA2TYKHFJX2Y4N3XW4MX6KSH6WXJJQRU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAMYN5NNVOY2O4E6PTTAUWFSVA2TYKHFJX2Y4N3XW4MX6KSH6WXJJQRU" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://vt.tiktok.com/ZS49BLRUU" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1785971376" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63829525, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmission" + }, + { + "u64": "271539957145796610" + }, + { + "address": "GBKA233FZEZ3QIZVY4BH5IO3UZMZQV7UHPCJVXB4FYCMEYBUSPRYB3DA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBKA233FZEZ3QIZVY4BH5IO3UZMZQV7UHPCJVXB4FYCMEYBUSPRYB3DA" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/i/status/2085407358319018340" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1786039929" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63806526, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmission" + }, + { + "u64": "271539957145796610" + }, + { + "address": "GCFRGHJSLBUIN536Y2K4Q5KGKE2AXSZPQZW37ZH62VCYD2XSEWBNZWNO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCFRGHJSLBUIN536Y2K4Q5KGKE2AXSZPQZW37ZH62VCYD2XSEWBNZWNO" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://www.instagram.com/reel/DboerwdAnem/?igsh=MW5zNGtjZzZiejMxZw==" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1785910494" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63799237, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmission" + }, + { + "u64": "271539957145796610" + }, + { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://vt.tiktok.com/ZS4aQJoXT/" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1785869521" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63829803, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmission" + }, + { + "u64": "271539957145796610" + }, + { + "address": "GDRZCJDIVZTOLCQRQWTVCB5UUIJOGD3P4SUZ3PAABWXQJL63O2OFJ3XL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDRZCJDIVZTOLCQRQWTVCB5UUIJOGD3P4SUZ3PAABWXQJL63O2OFJ3XL" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/SovereignGrce/status/2085433783629631621" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1786041498" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63716828, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionCount" + }, + { + "u64": "271539957145796609" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63829803, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionCount" + }, + { + "u64": "271539957145796610" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 5 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613958, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionCount" + }, + { + "u64": "271539957145796612" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 206 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613953, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionCount" + }, + { + "u64": "271539957145796613" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 81 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497312, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionCount" + }, + { + "u64": "271539957145796616" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 77 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64418243, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA224ZNNKZKU7AX3UOOLVDWMMSYRXDHDKESM2YS3KVO52URJDCNMLKFY" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA224ZNNKZKU7AX3UOOLVDWMMSYRXDHDKESM2YS3KVO52URJDCNMLKFY" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/IslahOd" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789353029" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574607, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA25XFBDROFS3V53RRGHGN5IY2LQFP3HO4IFSOZS2SAAQA4DEJ7JHWX4" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA25XFBDROFS3V53RRGHGN5IY2LQFP3HO4IFSOZS2SAAQA4DEJ7JHWX4" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ashish_0903" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790158813" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426693, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA2CWWXT26Q4TNNRHRSV674ZF6OWCNDW5JAGEEJD2FB3CBDKXSEVLWNU" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA2CWWXT26Q4TNNRHRSV674ZF6OWCNDW5JAGEEJD2FB3CBDKXSEVLWNU" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Sniper_LEG" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789400334" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425908, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA2MMWELTIH5IUJE7CWK6AW7EAMOZVGKY3F3GBNFVSQFYE5W52VBAFTD" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA2MMWELTIH5IUJE7CWK6AW7EAMOZVGKY3F3GBNFVSQFYE5W52VBAFTD" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Jonathan_BNB" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789395934" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64552997, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA3NAZYKIAQWJHXCUORX3FUXZCCMWRFIKJFEDMLEUFMCWELYD2LCDWON" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA3NAZYKIAQWJHXCUORX3FUXZCCMWRFIKJFEDMLEUFMCWELYD2LCDWON" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Smoky8668/status/2095912471961981204" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790050763" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64560483, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA4DJDM66BZLZ54K7GLZFFPKGBNC44IPZSHMMZ6G7YY5TOQH3N5T5HAM" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA4DJDM66BZLZ54K7GLZFFPKGBNC44IPZSHMMZ6G7YY5TOQH3N5T5HAM" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Prof4477" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790088193" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64255097, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA67HUSONXSYG553UG5IDDIQSBH5Q4F2BU7ZYAQSIZ7L2IX43JAUXWAJ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA67HUSONXSYG553UG5IDDIQSBH5Q4F2BU7ZYAQSIZ7L2IX43JAUXWAJ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/RupamGhosh2006" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788442486" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426630, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA6QAJ6TMPTODF6DOMLU6XI7VD6XYYYM7JZA6PPAWNNQEF5454NQ2ELN" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA6QAJ6TMPTODF6DOMLU6XI7VD6XYYYM7JZA6PPAWNNQEF5454NQ2ELN" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ratat_chef" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789399981" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64538460, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA6UANZSAIOSKXKPYXEYLHAUNTQOJNKUIKCPGFNU6RVVTPJDJJNHOJYH" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA6UANZSAIOSKXKPYXEYLHAUNTQOJNKUIKCPGFNU6RVVTPJDJJNHOJYH" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/NoniRichies29/status/2101946078199177548" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789978078" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263831, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA6X5ENKESTG2CXBYC3DUWFZ3LKHDWSESUT3YK3N5QOLBP5V2EUUKXLS" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA6X5ENKESTG2CXBYC3DUWFZ3LKHDWSESUT3YK3N5QOLBP5V2EUUKXLS" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VN_Stellar/status/2094473527638557090?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788491865" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64595223, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA7VIS5CL6LXI23TADDI5TTKZORASCUQDJRH6EKF2TPLTNMXS5MJUFWF" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA7VIS5CL6LXI23TADDI5TTKZORASCUQDJRH6EKF2TPLTNMXS5MJUFWF" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/JayPaul1647264/status/2102563939410206969?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790261894" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490351, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GA7YDWNQYXXLAWBZG25MH3XI2QATNC5CVZZ7U3IKWEWCDEV4B6E54TLM" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA7YDWNQYXXLAWBZG25MH3XI2QATNC5CVZZ7U3IKWEWCDEV4B6E54TLM" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ob78230/status/2100937175692976442" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789737533" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437805, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAAJ4XUODHJUC23YRMFVTS5M73S5ZZTQSZIDF2ZOSA5P2COKXJOTNUSN" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAAJ4XUODHJUC23YRMFVTS5M73S5ZZTQSZIDF2ZOSA5P2COKXJOTNUSN" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/smurfs_walker" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789462520" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64435450, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAAKMCBKEHJHWVLYR6CSX77AYAFYMAITCUI4GM6EFO54V6OSCKA2KONZ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAAKMCBKEHJHWVLYR6CSX77AYAFYMAITCUI4GM6EFO54V6OSCKA2KONZ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/boundless_fi/status/2094728986538471608" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789449361" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609996, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAAZEXTYFCDS2QNXAYKVCMAUJLUZACWVOQ2WVRUUEIXC6ZKSHC6GDU5O" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAAZEXTYFCDS2QNXAYKVCMAUJLUZACWVOQ2WVRUUEIXC6ZKSHC6GDU5O" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/RosieeDrafts" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790335759" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64313085, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAB6Z7XBXJDS736GUA7RXUSXSHZCDC5X23BB2OSN6UAG7CNKE4SXQGIL" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAB6Z7XBXJDS736GUA7RXUSXSHZCDC5X23BB2OSN6UAG7CNKE4SXQGIL" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/vicanorous/status/2096860732465795529" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788766855" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64586458, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GACELCRF3P7PBSFLSPHHLK2YIQ6WNEOZGBN3EJ6TMLCMJPSVDAZDXDDM" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GACELCRF3P7PBSFLSPHHLK2YIQ6WNEOZGBN3EJ6TMLCMJPSVDAZDXDDM" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/favak819" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790218068" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425809, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GACNFVACOQPBXJARGRKEJM2K5TD3RYJQM5RQV6Y3J3JH3BENWCI7J5YE" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GACNFVACOQPBXJARGRKEJM2K5TD3RYJQM5RQV6Y3J3JH3BENWCI7J5YE" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/sakuraonpl" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789395379" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64213362, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAD2PJIY4WZIZM3HIWB4STXDGQWQ4GFFDBQYIOEAEGVWIQST53PVU6B5" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAD2PJIY4WZIZM3HIWB4STXDGQWQ4GFFDBQYIOEAEGVWIQST53PVU6B5" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Xebec_wou" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788204714" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64568045, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GADGXEIP2NEIJ3723RFTFCSPVJIJVM42RTONINH4MRTMUV2KBDFBORF5" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GADGXEIP2NEIJ3723RFTFCSPVJIJVM42RTONINH4MRTMUV2KBDFBORF5" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/__Official__1/status/2102566746775237007?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790126003" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64539295, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GADR2KUYLHAZNUH7J4IPC4QOFKMJS2CHTXIUVMRFLI536VL3XPNTEUWZ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GADR2KUYLHAZNUH7J4IPC4QOFKMJS2CHTXIUVMRFLI536VL3XPNTEUWZ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/hagden12" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789982253" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323207, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GADWDDKP4TKUVNZVSKXFNFN6FXSZYIAHL35R6GEQB4M3QK3FNEF225YS" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GADWDDKP4TKUVNZVSKXFNFN6FXSZYIAHL35R6GEQB4M3QK3FNEF225YS" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/LNH2005_/status/2097101877771210866" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788823405" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64220186, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GADZJQYATX2GFX7FOEHHKB7K5XQCDHTZTG2SSJA3SKL7MRKEZBD5EVJV" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GADZJQYATX2GFX7FOEHHKB7K5XQCDHTZTG2SSJA3SKL7MRKEZBD5EVJV" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/sendijohn01/status/2094670964722205092?s=46" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788243530" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64588135, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAEVYIB4QUSGU2GPEBBEOSS2B6ATCZLIQ4ZNF2IMIO2RAOJIEZDQY2YX" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAEVYIB4QUSGU2GPEBBEOSS2B6ATCZLIQ4ZNF2IMIO2RAOJIEZDQY2YX" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/SaranyaSa39084?t=zDBX-HDkTJFp6PcB9LCh6g&s=09" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790226453" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426701, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAF6ML2FAQIT7GPP74FRUH4DDEOIMPJENDKBJLMAEHY37B7RTEBTIYOP" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAF6ML2FAQIT7GPP74FRUH4DDEOIMPJENDKBJLMAEHY37B7RTEBTIYOP" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/zaynarde" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789400378" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329860, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAFVBUV7COXHXLQWL6VWB63AP6VXHTKIIM7KA4S2DZEXCEZJKANJQLNV" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAFVBUV7COXHXLQWL6VWB63AP6VXHTKIIM7KA4S2DZEXCEZJKANJQLNV" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Trio_Phan" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788860490" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264421, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAH4O6GYKLK2VZBSRWVKLLJ6K6XWWW3RPYG37BHA3J6SNW6WKW5MURKU" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAH4O6GYKLK2VZBSRWVKLLJ6K6XWWW3RPYG37BHA3J6SNW6WKW5MURKU" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/DGroup_Official" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788495141" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574739, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAHCZAPDQH32PUCAUSIA6YUHRZP37C2RHNN3IHBW35JR2A4W6IQZEFKE" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAHCZAPDQH32PUCAUSIA6YUHRZP37C2RHNN3IHBW35JR2A4W6IQZEFKE" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Tomisinweb3" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790159473" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64567913, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAHDDTSTE2P6JSTUBYIHZ566S2MT554CYJBJIU4W4Z3P3T7XKLGA2TIK" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAHDDTSTE2P6JSTUBYIHZ566S2MT554CYJBJIU4W4Z3P3T7XKLGA2TIK" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/JayPaul1647264/status/2102563939410206969?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790125343" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64587484, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAIR7XYIVOIEADFWYP3TNHDBXBIB2DVASZRSIYRJXBCTPCA7KQDJVANC" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAIR7XYIVOIEADFWYP3TNHDBXBIB2DVASZRSIYRJXBCTPCA7KQDJVANC" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Liluchubpy" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790223198" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64229870, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAJA3EEWG5SJDV2OSC7NBAGQ4OFEC64DFO7GKTK5J6A6SXDEO4EQ4CRM" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAJA3EEWG5SJDV2OSC7NBAGQ4OFEC64DFO7GKTK5J6A6SXDEO4EQ4CRM" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/web3pips/status/2094901648434897160?s=46&t=qJgEVd3oIzRG1RG61DCfCw" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788298555" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64449632, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAJJYKVGLTGP6A3ANITXSKM26FT5OWLOV6MLWQPGHMOLWGSXXPRNOAFM" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAJJYKVGLTGP6A3ANITXSKM26FT5OWLOV6MLWQPGHMOLWGSXXPRNOAFM" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/0xWarri_san" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789528758" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495701, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAJOAYF7JRQNPAFECS7SDYAKPPZHEUVSDMHFHPKYWYWECIDAMTTFUBRW" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAJOAYF7JRQNPAFECS7SDYAKPPZHEUVSDMHFHPKYWYWECIDAMTTFUBRW" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/dexterofweb3/status/2100981747869487397" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789764283" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574787, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAJWVQLHXY6DFSC3CMWL6YZNJTQT7SRD4BOZHQOVEHHRLP535VJ6JH6O" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAJWVQLHXY6DFSC3CMWL6YZNJTQT7SRD4BOZHQOVEHHRLP535VJ6JH6O" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/RahulDasb1" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790159713" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64216058, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GALE3JTPDC3NR6KV3RWS42CCAQVFCO2IJYTMTBODAG6ET42P65WEY4CV" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GALE3JTPDC3NR6KV3RWS42CCAQVFCO2IJYTMTBODAG6ET42P65WEY4CV" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Izero_313" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788220078" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329967, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAMDZSTTRZ3FXHAIVZXSLYWZVRC57I4U4NRAWL5TLREOERRJOE6QPQI5" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAMDZSTTRZ3FXHAIVZXSLYWZVRC57I4U4NRAWL5TLREOERRJOE6QPQI5" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/sokulaman" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788861086" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437610, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAMUGU5B43ZFG2BW2DRMEZZTQI2WPYU5BGOXTVJT6UA23DKKZLXGMSKN" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAMUGU5B43ZFG2BW2DRMEZZTQI2WPYU5BGOXTVJT6UA23DKKZLXGMSKN" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/dienthicos" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789461431" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64239113, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAOMRKOZJOXUHI3PHRPRQUORZ4NXZVSCRZSHDJJYEYNFBWZIO5WMRZJ3" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAOMRKOZJOXUHI3PHRPRQUORZ4NXZVSCRZSHDJJYEYNFBWZIO5WMRZJ3" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Blessingti43874/status/2095120884700754372" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788351313" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329906, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GARBDCXQS4LEIJL3DYSCES34OGHBMDKMAIIKFNHB7SENYSFPWVKTQXLH" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GARBDCXQS4LEIJL3DYSCES34OGHBMDKMAIIKFNHB7SENYSFPWVKTQXLH" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Byte_blade" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788860749" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64532032, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GASEQUQAP7QMLZK4VMNQLMGKLZ2GR5XJ3MTO5C2RA22RKDKHEPRKKAHU" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GASEQUQAP7QMLZK4VMNQLMGKLZ2GR5XJ3MTO5C2RA22RKDKHEPRKKAHU" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Christol4x/status/2101811381611675750" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789945938" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64536146, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GASWMZPKDGCQCKDRYQCGVD7FF7D2NRWUOG7KSDDO4XGGN7XETX5OEE4L" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GASWMZPKDGCQCKDRYQCGVD7FF7D2NRWUOG7KSDDO4XGGN7XETX5OEE4L" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ShashiVerm78310" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789966508" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64221427, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GATJYZIXPTLOIK7F7XRM4PCHTTMVLWKHATECHLA4QOQUQ4LMCZOCGUKX" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GATJYZIXPTLOIK7F7XRM4PCHTTMVLWKHATECHLA4QOQUQ4LMCZOCGUKX" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VN_Stellar/status/2094473527638557090" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788250579" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64577956, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GATTCGMJ2MDHDT5TBQX4NGMSHSMTMCHXRVIKPBES6JM5VGZSHC45OGJC" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GATTCGMJ2MDHDT5TBQX4NGMSHSMTMCHXRVIKPBES6JM5VGZSHC45OGJC" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Harsh22603" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790175558" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367199, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAU2MGBQZKRFNAASGQSBQX7LY6Z6DXEV6DXV234U3XHDUP5HFZUOJQ67" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAU2MGBQZKRFNAASGQSBQX7LY6Z6DXEV6DXV234U3XHDUP5HFZUOJQ67" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/King_0f_God/reposts" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789068729" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64322412, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAV4V6WZGMVPZM54DR2242NMUHV3JPVRLC7XDYIFSRU2WZIXLWQIKYO2" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAV4V6WZGMVPZM54DR2242NMUHV3JPVRLC7XDYIFSRU2WZIXLWQIKYO2" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Token77_/status/2097083122512691219?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788818960" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264630, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAWI2SC7R3U6H7I4YCCDMBTACYICY4ZZ2OTXSSTZ3QZ4DSEFXY2IAVLF" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAWI2SC7R3U6H7I4YCCDMBTACYICY4ZZ2OTXSSTZ3QZ4DSEFXY2IAVLF" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/NevisJunco" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788496336" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64436751, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAXFCHETKZD2SH45HJP4RCNGRDPPDSMFFSJX5P44V54XFHEDYXB4KKAS" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAXFCHETKZD2SH45HJP4RCNGRDPPDSMFFSJX5P44V54XFHEDYXB4KKAS" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VN_Stellar/status/2094473527638557090" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789456627" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574384, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GAYNG64UV3AS4PK5CAAZE65HQYBVPYEAAGSK4YMSIW3DAT6GZY632N62" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAYNG64UV3AS4PK5CAAZE65HQYBVPYEAAGSK4YMSIW3DAT6GZY632N62" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/AshishChau25910" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790157698" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610354, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GB2DG2EQGAUIW6VFQ5I62RMXJBWUBAKYBKCY77Z7UEJUCYHX4IPEGEOA" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GB2DG2EQGAUIW6VFQ5I62RMXJBWUBAKYBKCY77Z7UEJUCYHX4IPEGEOA" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/4LizX_Web" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790337549" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64498974, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GB2LBLRAJMXCNQ3R43GXJ7PLQBIPFDBAUEQO4ZKBTOHKNGCBHKMWKBIB" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GB2LBLRAJMXCNQ3R43GXJ7PLQBIPFDBAUEQO4ZKBTOHKNGCBHKMWKBIB" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/web3seer_x" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789780648" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64607693, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GB444W6G4PHTTCSUA7FR5JNVSN3GMXRE6SBJZ3VKMIVEEYAYFGEPHC3H" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GB444W6G4PHTTCSUA7FR5JNVSN3GMXRE6SBJZ3VKMIVEEYAYFGEPHC3H" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VN_Stellar/status/2094473527638557090?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790324244" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258552, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GB4A4YFSQTSKA46YNIDIDIRDOEKIXOCCME6RG45BRULD633KDQZABRJC" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GB4A4YFSQTSKA46YNIDIDIRDOEKIXOCCME6RG45BRULD633KDQZABRJC" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VN_Stellar/status/2094473527638557090?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788462130" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64316999, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GB4O24QI4GT65UXRBH2ZVXPKDCS3HF7UXSCW4ZBU4JUE52RAS7OS7GNH" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GB4O24QI4GT65UXRBH2ZVXPKDCS3HF7UXSCW4ZBU4JUE52RAS7OS7GNH" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/JIN_N369" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788788656" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64556955, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBAJXEV6RQSHLNXIWQJYUAVFZTOQOVN4AAN76EKUQFNX6YPTWEDTAWNJ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBAJXEV6RQSHLNXIWQJYUAVFZTOQOVN4AAN76EKUQFNX6YPTWEDTAWNJ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ajolkaj88/status/2102334275932836191?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790070553" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64352867, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBBZ5ARLATIB362OH74BIYUJ7SKZBZG2Q3WRPW6USGNLXPRYMRCT52PV" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBBZ5ARLATIB362OH74BIYUJ7SKZBZG2Q3WRPW6USGNLXPRYMRCT52PV" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/afeesyusuf95409?s=11" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788988996" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425866, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBCI4C4GGIYM2C2MFRFOTULRATO46JM5DLO2WNBL42LQPOO3PEHXU3FH" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBCI4C4GGIYM2C2MFRFOTULRATO46JM5DLO2WNBL42LQPOO3PEHXU3FH" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/SandBoxIQ" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789395698" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64392921, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBCUPSMCHV6F5WGQ2F6GTVYW3A72O75U5ZBX2JI7UOD3L3EVAT2X2DBM" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBCUPSMCHV6F5WGQ2F6GTVYW3A72O75U5ZBX2JI7UOD3L3EVAT2X2DBM" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Muhmdasheer" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789211963" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64547246, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBDVM5H2HUR2UJU4U62H3AO3B3QA7XXRPOMJQYWKBJ2UT4G7CKKCHXRS" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBDVM5H2HUR2UJU4U62H3AO3B3QA7XXRPOMJQYWKBJ2UT4G7CKKCHXRS" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Seeemus/status/2102130553944211921" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790022008" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223709, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBE22IVD5UZGE3BBGBPRIDYWZ25WUZ5XDTVVKXRYHLSD7KJK63QY3JNZ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBE22IVD5UZGE3BBGBPRIDYWZ25WUZ5XDTVVKXRYHLSD7KJK63QY3JNZ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/NaphtaliNa20241/status/2094752812156453280?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788263546" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437620, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBEYGVKWVZNB2MYLOBAQVGATNKGJ3ZK5SYHYS4JUXU6PKS5QHWPEDM6W" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBEYGVKWVZNB2MYLOBAQVGATNKGJ3ZK5SYHYS4JUXU6PKS5QHWPEDM6W" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/nguyen_shrimp" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789461487" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64603497, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBF5JQPKGAH73ENUHNY57YNX4R2CDAGSRQW43LULFKNHP42DQR5XI53P" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBF5JQPKGAH73ENUHNY57YNX4R2CDAGSRQW43LULFKNHP42DQR5XI53P" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Web3tabbie/status/2101946231823991026" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790303264" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426579, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBFRBYERVZWUK26QRHHMVSPMUG5N2Z5BZHTZL5QMHUIXLECF36L454LS" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBFRBYERVZWUK26QRHHMVSPMUG5N2Z5BZHTZL5QMHUIXLECF36L454LS" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/KOTHVN" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789399697" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64542676, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBFW6RSAV6YPDKIL6QEYE5R6M3KROSQ6J7DYWFNQ2TT3FMT7POUPJCUL" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBFW6RSAV6YPDKIL6QEYE5R6M3KROSQ6J7DYWFNQ2TT3FMT7POUPJCUL" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/MenecesAlan/status/2102033831108702717?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789999158" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64539240, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBGARGMSDMLW7I4ZPRD5HTGVAEOUJG73PPGBXZ7C7AP7DKXV6TK3QTRN" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBGARGMSDMLW7I4ZPRD5HTGVAEOUJG73PPGBXZ7C7AP7DKXV6TK3QTRN" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/lasvenim31" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789981978" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64255126, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBHCXMJLEJAS7YIIQ7LM5MZZOZGWUTZOAJ65M6WUZTM6YCWKAL54RQLY" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBHCXMJLEJAS7YIIQ7LM5MZZOZGWUTZOAJ65M6WUZTM6YCWKAL54RQLY" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/vtuann_13205" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788442651" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264623, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBHMTQZDOI2VVZMBBDQ3KAXMRJR35N7GFYRYK4NDSXAII4GAUZQJVTIY" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBHMTQZDOI2VVZMBBDQ3KAXMRJR35N7GFYRYK4NDSXAII4GAUZQJVTIY" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Oppa_Hay" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788496297" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612191, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBHSU3DNI6IZCVUTBHHYGJUUOVFYORPYKBOQFVBLQBCNOPGCKR4KB32U" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBHSU3DNI6IZCVUTBHHYGJUUOVFYORPYKBOQFVBLQBCNOPGCKR4KB32U" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/georgebuilding2/status/2103484609950367828" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790346734" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64363143, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBJ6A5DSSKOERUXDT2G2KNCJLRY32IJIT4QG5NQ644DHQHDDKDYAXQLU" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBJ6A5DSSKOERUXDT2G2KNCJLRY32IJIT4QG5NQ644DHQHDDKDYAXQLU" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Qiro_lux https://drive.google.com/drive/folders/1MKCtAYIKrnkZVJnnr9GTQvFXGI9TOJOJ" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789046221" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326731, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBJ7TIB5D7WQTE7DG7ZNVUJTD5AY663RPVCCRV5L2LQA3KUHUARAWJWT" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBJ7TIB5D7WQTE7DG7ZNVUJTD5AY663RPVCCRV5L2LQA3KUHUARAWJWT" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Salopi001" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788843049" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264603, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBJEYD5ZZXMPXDZJZ5OAHHDCK56TZDBTZ5WIWCXFFVGAK4AMYJTYFD2O" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBJEYD5ZZXMPXDZJZ5OAHHDCK56TZDBTZ5WIWCXFFVGAK4AMYJTYFD2O" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/nhat0quang" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788496187" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64225307, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBKEV6LBMLRLWLIVYZMVH2DVO7CANWFNWHWZI6IPV6VSXNI2RTGGYXQL" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBKEV6LBMLRLWLIVYZMVH2DVO7CANWFNWHWZI6IPV6VSXNI2RTGGYXQL" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/iamEdoama/status/2094793202851008999" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788272680" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367652, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBKKKVQR5YPXA6GERFMJYPSSMGJ43DUJPOPLYHUGEV3CMDNVAJDESFGX" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBKKKVQR5YPXA6GERFMJYPSSMGJ43DUJPOPLYHUGEV3CMDNVAJDESFGX" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ARakshe34041" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789071243" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64232432, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBKOUX6KOXYS2PNX7U66OVTHWW4GW2JGQF2DFWHO64N3Y2M2BF5DEGBB" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBKOUX6KOXYS2PNX7U66OVTHWW4GW2JGQF2DFWHO64N3Y2M2BF5DEGBB" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Ella_Jacee" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788313144" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64442653, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBKPM5RCXJDRYLHTDETCCXM3274GNJY6BTFDMNNESTMQI3NDSC6PRYGV" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBKPM5RCXJDRYLHTDETCCXM3274GNJY6BTFDMNNESTMQI3NDSC6PRYGV" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VN_Stellar/status/2094473527638557090" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789489681" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437625, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBKTPUI7K3X6556BEEKZW6TMPLPB6U3S2IP7SZOYPQWYELJHQIJ5F7VY" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBKTPUI7K3X6556BEEKZW6TMPLPB6U3S2IP7SZOYPQWYELJHQIJ5F7VY" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/pudgyfun" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789461516" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64571213, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBL6Q3ZKJ6VIJ6KPWWS5O6MWNYQXPBIS3IFFL5NYNRCEGRXZDBGXDECS" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBL6Q3ZKJ6VIJ6KPWWS5O6MWNYQXPBIS3IFFL5NYNRCEGRXZDBGXDECS" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Justincul" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790141843" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64516565, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBLMKYSUMGNJB3CL5BYH6TJ7LPZCIHA47G56A4YQZTXV6PA23KPUPLT4" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBLMKYSUMGNJB3CL5BYH6TJ7LPZCIHA47G56A4YQZTXV6PA23KPUPLT4" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/moneyLord299519" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789868603" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64271847, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBLVHWN3K6J4KPPYIV7BMVELFVUM4UV4CRHXLPUBQ4SGZUSCVNXVTW67" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBLVHWN3K6J4KPPYIV7BMVELFVUM4UV4CRHXLPUBQ4SGZUSCVNXVTW67" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/_thekhay?s=11" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788537256" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64273044, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBNXYGYADZN3OFMXB5HUDKXTJ66MLZ2BGVR22VDEXILALZ26BO7BEUDQ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBNXYGYADZN3OFMXB5HUDKXTJ66MLZ2BGVR22VDEXILALZ26BO7BEUDQ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ArthurKixine/status/2095926938779156906?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788544017" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64523880, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBPHQXYYQXNDI6O3LMKY5P4BISQH2NQRRI3GFDMD2UXVEDLBM6Z3SA6B" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBPHQXYYQXNDI6O3LMKY5P4BISQH2NQRRI3GFDMD2UXVEDLBM6Z3SA6B" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/lapsopc" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789905178" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64330022, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBPT2QI464Z4YGYVFWZ4HZ4JCOZAB4N5TMVC3C4JAVLJ7VZ5TEFC2FV2" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBPT2QI464Z4YGYVFWZ4HZ4JCOZAB4N5TMVC3C4JAVLJ7VZ5TEFC2FV2" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/oceanwave_me" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788861394" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64505312, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBQ2D2PC5TGR6NBZXREJDBAQESEUQ3WWIJ62A5B7P2VEJ7NDT47QPI4S" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBQ2D2PC5TGR6NBZXREJDBAQESEUQ3WWIJ62A5B7P2VEJ7NDT47QPI4S" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Swagnik_Ganguly" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789812338" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223246, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBQ5NADAG6PXWTOZR3KSOAJJ2PIRB4CETM6NBIEUW6JCE3W2D3YFIU2U" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBQ5NADAG6PXWTOZR3KSOAJJ2PIRB4CETM6NBIEUW6JCE3W2D3YFIU2U" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VN_Stellar/status/2094473527638557090?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788260915" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64366183, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBQ6SEKS34TMVVIDJAS6U3BP26D2YB246ZP3W5JCZALI6DYJUUXPYKSJ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBQ6SEKS34TMVVIDJAS6U3BP26D2YB246ZP3W5JCZALI6DYJUUXPYKSJ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/walia_vyom/status/2098107722399162466?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789063091" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64576609, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBRPYPLGP7KNWYRGWJYP2NSJ672ZU54UISVFKBXVRCHSRKEQBIX2YI2B" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBRPYPLGP7KNWYRGWJYP2NSJ672ZU54UISVFKBXVRCHSRKEQBIX2YI2B" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VN_Stellar/status/2094473527638557090?t=ZFMXcssmyqFnBZ2E1fE3wg&s=19" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790168823" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612710, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBS3VO3ARGGIXRBHDSN5MZ3NTBB6HGQEMRUCE3E5PBPIEE7QCV4BZURI" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBS3VO3ARGGIXRBHDSN5MZ3NTBB6HGQEMRUCE3E5PBPIEE7QCV4BZURI" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/yenifferbrooke/status/2103503421278183904?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790349329" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425813, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBULATZ5EGBJ6R77RIRJVLHR4TEYRLMES4U7I7TVW4AOA3EDRMYKL2CD" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBULATZ5EGBJ6R77RIRJVLHR4TEYRLMES4U7I7TVW4AOA3EDRMYKL2CD" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Cassano0x" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789395401" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64498916, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBVUU2XPZVGPNMOW7TDPI7CPJ2RL2EPD33AB2DZUZLIKGAVECTKIIFKV" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBVUU2XPZVGPNMOW7TDPI7CPJ2RL2EPD33AB2DZUZLIKGAVECTKIIFKV" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/DeGodman10" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789780358" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64359737, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBWGVQRGKZJNJZP2SQMF6DDBCRST5J5O7HZMDS3HCWHJ7KZOIIYTPIM4" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBWGVQRGKZJNJZP2SQMF6DDBCRST5J5O7HZMDS3HCWHJ7KZOIIYTPIM4" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ChainFolk_" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789027289" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64587746, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBXV2EEM4ME3VBQNHSKBTEDEY4UGKT4PSRWNI4XB3ZHE43KVIFA66PSS" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBXV2EEM4ME3VBQNHSKBTEDEY4UGKT4PSRWNI4XB3ZHE43KVIFA66PSS" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ChanchalCh9i" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790224508" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329961, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBYUOXGBUQ746GKXETUCY6TNE326DS2HM6CWBNXAPAEPBFI34IZL7RVK" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBYUOXGBUQ746GKXETUCY6TNE326DS2HM6CWBNXAPAEPBFI34IZL7RVK" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/RNDRFAN" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788861053" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264250, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBZAMWZSJXEJZQJWOOHBM4U74OQQGQFFQWID5F4QOWUWHLPE7RI5CI3M" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBZAMWZSJXEJZQJWOOHBM4U74OQQGQFFQWID5F4QOWUWHLPE7RI5CI3M" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Juan91742521" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788494193" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64311091, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBZIEOJ4VXBSNSLQQ73ZXLACAOU7PNR3JIOMT33PYE46UTB47PLIYIPC" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBZIEOJ4VXBSNSLQQ73ZXLACAOU7PNR3JIOMT33PYE46UTB47PLIYIPC" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/vuntqn91/status/2096819536200921581" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788755736" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64347630, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBZN72COCY4J4755G4KGSCYH4XN353JWVIUD2OL6UYEAZ5VI2PZGRLXH" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBZN72COCY4J4755G4KGSCYH4XN353JWVIUD2OL6UYEAZ5VI2PZGRLXH" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/vananguyen12825" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788959667" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64227086, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBZNFITNWK2KBCHUERLOBCS6XBQC4LFKEEURYWM7G3AT55LWS3YHOWRL" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBZNFITNWK2KBCHUERLOBCS6XBQC4LFKEEURYWM7G3AT55LWS3YHOWRL" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/nzegbui?s=11" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788282789" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329989, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GBZYZX3UDSZBK5N7QS4B3BJDGEE3BITVZWXFFQMRWT6HIDGK53FTESAP" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBZYZX3UDSZBK5N7QS4B3BJDGEE3BITVZWXFFQMRWT6HIDGK53FTESAP" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/nguoibinhduoo" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788861209" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263536, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC2XWR6TCACRQXGLJKBW4LFOS7ZHGEFC5QX6GIQPNCLAOK554BE4NVDW" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC2XWR6TCACRQXGLJKBW4LFOS7ZHGEFC5QX6GIQPNCLAOK554BE4NVDW" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Gojo_0x" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788490224" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258432, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC35DGZ4HDRMI622LUTETV7W6MJH6GO5KM7FH4LNYMQ57VM3YRMBPC4L" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC35DGZ4HDRMI622LUTETV7W6MJH6GO5KM7FH4LNYMQ57VM3YRMBPC4L" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/OKAYINTERRUPT" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788461439" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613764, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC3NRR7ZZLRZAZL4WMLJMUXPXD2HXLYVWKTQOUDLLJP4U2LL7CTWTWJ6" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC3NRR7ZZLRZAZL4WMLJMUXPXD2HXLYVWKTQOUDLLJP4U2LL7CTWTWJ6" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/CandiRisa7" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790354599" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64558145, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC3OLVPNJYDH26LFK4B4PNVFRGDJYUCMSGJVDJQ3UN76FMLJE77VTX6S" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC3OLVPNJYDH26LFK4B4PNVFRGDJYUCMSGJVDJQ3UN76FMLJE77VTX6S" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/vietbang2204" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790076503" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553087, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC3Q4CJXKLYESHLL4C34CT3ENOT4TXDO3W4PRIQ3C7TC4FHTRAQ5S37J" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC3Q4CJXKLYESHLL4C34CT3ENOT4TXDO3W4PRIQ3C7TC4FHTRAQ5S37J" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/zero2i_official/status/2096141371564609731" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790051213" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64588823, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC5P3MKC4MK5IE5IJYQVLPS6EVSHMYUPOYWPS6AAQQ7FUEF32G3H4TRJ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC5P3MKC4MK5IE5IJYQVLPS6EVSHMYUPOYWPS6AAQQ7FUEF32G3H4TRJ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VN_Stellar/status/2094473527638557090" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790229893" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64328421, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC6AMJ46H25FQJ4Y2F7VITAWKUEJCUKQWJDEM2OP6SWEH2WQJM4QTQEY" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC6AMJ46H25FQJ4Y2F7VITAWKUEJCUKQWJDEM2OP6SWEH2WQJM4QTQEY" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/i/status/2094473527638557090" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788852475" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258515, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC6C6HXLFESMAVPIOG5ILS7WFQOD6TIWC7M4ASVNJRGTJXYZSAM634GC" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC6C6HXLFESMAVPIOG5ILS7WFQOD6TIWC7M4ASVNJRGTJXYZSAM634GC" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VN_Stellar/status/2094473527638557090?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788461915" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64298306, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC6Z7QLRJDCAMTP4DIJO77I3MBH7WHW444FYP7E6YJNACR4W7XACDQOX" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC6Z7QLRJDCAMTP4DIJO77I3MBH7WHW444FYP7E6YJNACR4W7XACDQOX" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/monkeyPblack/status/2096519178153029724?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788684452" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437615, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC7J5RFWAERY3PJD4SFTS5UKS7R4BCA3LFOG5I5GS2IKYJSAWEKXWXQO" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC7J5RFWAERY3PJD4SFTS5UKS7R4BCA3LFOG5I5GS2IKYJSAWEKXWXQO" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/legoncalvess" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789461459" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263932, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC7MQXJZ7FWEK42QSYTVEIKGBSO77EED5CKTILBWROPZ3J7LASINK7AI" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC7MQXJZ7FWEK42QSYTVEIKGBSO77EED5CKTILBWROPZ3J7LASINK7AI" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/vn_stellar/status/2094473527638557090?s=46" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788492418" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553592, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GC7PKCYZRRDRT6HBGPPON4NKQGHKNJJJQ7JN74TM5XBHFH7JBVI7LBR6" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC7PKCYZRRDRT6HBGPPON4NKQGHKNJJJQ7JN74TM5XBHFH7JBVI7LBR6" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/kelvin_bach/status/2102259886776336559" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790053738" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591141, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCAR2MD5F3ALAUZM6XJP7JKKGAPA73DQ6NNUDBBBPSO6GP3SFUKDUBSJ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCAR2MD5F3ALAUZM6XJP7JKKGAPA73DQ6NNUDBBBPSO6GP3SFUKDUBSJ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/justiceprint?s=21" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790241483" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329985, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCBLDIFSZZLQV2Y7XZ7UMY3B4UGBGQQRX636JW5GVCV3CFFMLFDJFC6H" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCBLDIFSZZLQV2Y7XZ7UMY3B4UGBGQQRX636JW5GVCV3CFFMLFDJFC6H" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/DepinChibi" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788861187" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64330000, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCCKOGI4JF3PODDOKPICCGFIMWHGCRCEBAM6JW5ZBOCH3M5B6HC5HM76" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCCKOGI4JF3PODDOKPICCGFIMWHGCRCEBAM6JW5ZBOCH3M5B6HC5HM76" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/bestcatdriver" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788861270" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64525312, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCCPDM7HRDZIVHIYK3JEPBQEBYNXLXM5CXCYT2QPBMMS3QZQOAO3MTXK" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCCPDM7HRDZIVHIYK3JEPBQEBYNXLXM5CXCYT2QPBMMS3QZQOAO3MTXK" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Stevekenif/status/2101670271119716360?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789912338" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64302336, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCCRAS23I66EM4AYUUEFVLMQYO6OQMPFXZWLCPWJYLPZW2RETQ324BRR" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCCRAS23I66EM4AYUUEFVLMQYO6OQMPFXZWLCPWJYLPZW2RETQ324BRR" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Duyan130805/status/2095807945326096419?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788706935" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64556514, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCCZVSEE77TOK6QTPLUNUUFZ5JOHFQJNXJCN63FBW6VEVLQ676RW7UV3" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCCZVSEE77TOK6QTPLUNUUFZ5JOHFQJNXJCN63FBW6VEVLQ676RW7UV3" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/keytranmtp/status/2102308166247629282?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790068348" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490396, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCDD35WKILCDXEKL275OFVXPZBYN2DCTOEIXJZY5W4A2ODWEXK3CU7RH" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCDD35WKILCDXEKL275OFVXPZBYN2DCTOEIXJZY5W4A2ODWEXK3CU7RH" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/0xmillysmith" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789737758" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610671, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCE4LIJFKVHC7DCFHMTAURZFHXT2EWUVDOFMTKGA7WDGZ7VVRSQYNUER" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCE4LIJFKVHC7DCFHMTAURZFHXT2EWUVDOFMTKGA7WDGZ7VVRSQYNUER" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/faizal_web/status/2103458530611318815" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790339134" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64559449, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCEE54NZQVKEPPYF5BUWJHMGRORKIRJIXQYW3IFIMHTJIYLSBWPYCZ5H" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCEE54NZQVKEPPYF5BUWJHMGRORKIRJIXQYW3IFIMHTJIYLSBWPYCZ5H" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/jokerrrrr02?s=11" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790083023" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437808, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCEL3ZJPOL4KGX5AQ2V7D6DTV7XIJNSN3CLFDDBZUMGCPL3E7LCFWJXS" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCEL3ZJPOL4KGX5AQ2V7D6DTV7XIJNSN3CLFDDBZUMGCPL3E7LCFWJXS" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/coffin_danci" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789462537" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64380432, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCETB2HL6ZPYZPJAGKTB2STFYYUBTFCIMCUHYIW5F5I5PJY2UPY6KZCO" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCETB2HL6ZPYZPJAGKTB2STFYYUBTFCIMCUHYIW5F5I5PJY2UPY6KZCO" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/zhouzhounhat" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789142320" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223579, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCFCMBKVHECP3TLBPCC6QRHZJ3AVJDFZM2JGZDHJBW3NVVUV7TJYDLKB" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCFCMBKVHECP3TLBPCC6QRHZJ3AVJDFZM2JGZDHJBW3NVVUV7TJYDLKB" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Ugasutun/status/2094747638729961715?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788262803" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64271155, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCFN7SN46VC6E766HPZRMBWISI5HVRMGWFFMWPDGDKM5EVPXSLZ6T34Z" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCFN7SN46VC6E766HPZRMBWISI5HVRMGWFFMWPDGDKM5EVPXSLZ6T34Z" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/zatgaai/status/2095885503333556480" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788533309" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64300087, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCFZKKIYA4QFR2H2QZZ4QHRPZBUU7XRILEQHNYB2FTYRSP7XGP6F645Y" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCFZKKIYA4QFR2H2QZZ4QHRPZBUU7XRILEQHNYB2FTYRSP7XGP6F645Y" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/dmKhanh31/status/2095878498162532815" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788694370" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64596816, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCHYROHFWJWBNFR2T5DXVCORNFEWFPGX3LBOQEIZRTOVE7SBBJEQLCGM" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCHYROHFWJWBNFR2T5DXVCORNFEWFPGX3LBOQEIZRTOVE7SBBJEQLCGM" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Vishwanath0uz" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790269859" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599726, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCIR3QJXGKOTEDVBNFAJOG7WZ6CWI7NYAHWYT67F5CD7ARKXYWRF3LAD" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCIR3QJXGKOTEDVBNFAJOG7WZ6CWI7NYAHWYT67F5CD7ARKXYWRF3LAD" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/LexanderOfX/status/2103172947758170227" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790284409" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264594, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCIYSZBHHDAD4HFTZKEBV2UC2XTAN76SXZMHWQFS2SRGUKGLBSQ6VFQN" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCIYSZBHHDAD4HFTZKEBV2UC2XTAN76SXZMHWQFS2SRGUKGLBSQ6VFQN" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Masshall_69" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788496135" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64236526, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Augustina__egbo/status/2095060920388952156" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788336522" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610948, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCK7E564LET4I42RNS2CEERKHCIUAFJLM2HNKK7M44IQRH4RB2KFPJU5" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCK7E564LET4I42RNS2CEERKHCIUAFJLM2HNKK7M44IQRH4RB2KFPJU5" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/e_mnaas" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790340519" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437631, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCKDWMET5N7PWM6DOCSLPLFN37CAD3DQYEBGEPNWREBCHCNYQZWOWQFS" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCKDWMET5N7PWM6DOCSLPLFN37CAD3DQYEBGEPNWREBCHCNYQZWOWQFS" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/mithitchien" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789461549" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64322546, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCLTZEUNUK6KSTI6OKMZCXUXQ44VIS2NTSR7RWFU2UMDZSF2M3WPKBB2" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCLTZEUNUK6KSTI6OKMZCXUXQ44VIS2NTSR7RWFU2UMDZSF2M3WPKBB2" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VN_Stellar/status/2094473527638557090" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788819709" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64587186, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCMYZU6UFGB2MWTCCGNOAUQWAM4JUWDQDBS4GVB7HZBDDYOUGGBSKXRW" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCMYZU6UFGB2MWTCCGNOAUQWAM4JUWDQDBS4GVB7HZBDDYOUGGBSKXRW" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Juno81707007" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790221708" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612255, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCNVUL4E4KBP3S6P7DMLHL7G5DFTIOEIMWXWITBGY3ZIDZQJKOFGDYWO" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCNVUL4E4KBP3S6P7DMLHL7G5DFTIOEIMWXWITBGY3ZIDZQJKOFGDYWO" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VictorObis79278/status/2103493894461903014?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790347054" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64388955, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCOHSWSJ75CEEHNRLYTK6R4ALEDJWFY535UOIFVCFHNSJSSIPKXB3NML" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCOHSWSJ75CEEHNRLYTK6R4ALEDJWFY535UOIFVCFHNSJSSIPKXB3NML" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/zaimeng721" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789189855" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64359800, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCP6XZS6WEONXRC44RG2RFHGF35EJNWT3HBKF2FFNDOWCYAC653323N7" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCP6XZS6WEONXRC44RG2RFHGF35EJNWT3HBKF2FFNDOWCYAC653323N7" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/MS_Capitall" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789027637" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64567990, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCPBFZPPLKE6OYQE74UYFWGTS32UHACB62TO5TJU2VG6NXY4VXBYWLD6" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCPBFZPPLKE6OYQE74UYFWGTS32UHACB62TO5TJU2VG6NXY4VXBYWLD6" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/JayPaul1647264/status/2102563939410206969?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790125728" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223250, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCPT5TY7QL3G64O6LEDCJXULHXESZ6AAVGA5EUKKHGJSKODX4PBWSGFJ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCPT5TY7QL3G64O6LEDCJXULHXESZ6AAVGA5EUKKHGJSKODX4PBWSGFJ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/codeX_james/status/2094743126585848207?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788260937" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426679, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCQDJQXVVAF7NRWSPV7BFSIJX7JQP7XVPGBVMXMZW5LBSBJV4F4EA6NG" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCQDJQXVVAF7NRWSPV7BFSIJX7JQP7XVPGBVMXMZW5LBSBJV4F4EA6NG" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Golden_Dack" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789400255" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329992, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCQKGG22LREYEVUF4QAIMXT32SKGETGIWQZDKMYG2W6GZO4KJNGCVWXA" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCQKGG22LREYEVUF4QAIMXT32SKGETGIWQZDKMYG2W6GZO4KJNGCVWXA" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/phus_io" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788861226" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264643, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCQMZAECNSAIMOVZWB7OFLJ6BF3JEL35KR42FG5WE6DIVT5TRLXFWXGG" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCQMZAECNSAIMOVZWB7OFLJ6BF3JEL35KR42FG5WE6DIVT5TRLXFWXGG" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/frogoftheyear" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788496408" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64541590, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCQQRPKZQAE542XOF53KM7KESYPDWK6LA4EEX2FNUQAG43CL66DQUXHG" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCQQRPKZQAE542XOF53KM7KESYPDWK6LA4EEX2FNUQAG43CL66DQUXHG" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Lihdegan8" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789993728" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426644, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCR6F3I3ZNQXNC5GADLO6EOAKDWWSJV63VS6WXVRISAOV6OPMFAIA4IA" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCR6F3I3ZNQXNC5GADLO6EOAKDWWSJV63VS6WXVRISAOV6OPMFAIA4IA" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/AlexVoltaris" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789400058" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612810, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCTLMEFWQJ4F4VPJKKEAO4FZB5BQ354MGMB7TBNOWV63D6KN7ER34MHM" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCTLMEFWQJ4F4VPJKKEAO4FZB5BQ354MGMB7TBNOWV63D6KN7ER34MHM" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/solcrypt3" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790349829" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64509369, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCUKUSWC6GI2UMBIGLS6IECS2BVDDCNBRVFR4QUHXSKMF47MYBYBMJ5V" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCUKUSWC6GI2UMBIGLS6IECS2BVDDCNBRVFR4QUHXSKMF47MYBYBMJ5V" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/nechewrites333/status/2100820038357799133" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789832623" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472895, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCUOHOGGKIGOYZAIN7GI62E47UPPJJK2J6BJYIM6YUEBVTRRE6NKABDL" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCUOHOGGKIGOYZAIN7GI62E47UPPJJK2J6BJYIM6YUEBVTRRE6NKABDL" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Lonydigitals/status/2100569736501186968?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789650253" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64312369, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCVRUOOSB53I2QNGBHMW4WMKPVULRKBYEIW3JPB56O64PMOJMCZGX5HI" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCVRUOOSB53I2QNGBHMW4WMKPVULRKBYEIW3JPB56O64PMOJMCZGX5HI" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VN_Stellar/status/2094473527638557090?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788762864" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64606259, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCW7KCKK4T3KZBP4X2TT2UKYOZPJH52TPFDZWNUXUIW2PDVRDNZJUPGE" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCW7KCKK4T3KZBP4X2TT2UKYOZPJH52TPFDZWNUXUIW2PDVRDNZJUPGE" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/AyushYadav5x" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790317074" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64226096, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCWCR3TKBCT6BH6YNTEONYLRLX57TOVWWANPY4S5ZEVS3PJQQXVQIDS3" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCWCR3TKBCT6BH6YNTEONYLRLX57TOVWWANPY4S5ZEVS3PJQQXVQIDS3" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/legend4tech/status/2094812154247413776" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788277163" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64464805, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCWYCR2NNOZMITJBLXGNSFAWT3YQDHXOIPUPCONCQZPRAUZGWDNGNM7M" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCWYCR2NNOZMITJBLXGNSFAWT3YQDHXOIPUPCONCQZPRAUZGWDNGNM7M" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/luodemian118" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789609803" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323557, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/malvinsdev" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788825353" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64302368, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCYNTQNZYQLRF4ND3FAWGYFFYN3XSAGZF6WW6IGBTVRQXPIQYP5WRU2X" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCYNTQNZYQLRF4ND3FAWGYFFYN3XSAGZF6WW6IGBTVRQXPIQYP5WRU2X" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/HuyNguyen29629/status/2095886497547501960?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788707115" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64608026, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GCZZV7L6SJY3KDPUCSXD5MQCXOYSZA22WTXYX62M3RBCRNXE7J4ZJHLV" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCZZV7L6SJY3KDPUCSXD5MQCXOYSZA22WTXYX62M3RBCRNXE7J4ZJHLV" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/TheAnthonCrypto/status/2103402077695189412?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790325909" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613958, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD2DEIBYTR4H6ME44J53Z7XQOGDDZEF3ZT2SGKXIQXTW46QFNMUT6B3D" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GD2DEIBYTR4H6ME44J53Z7XQOGDDZEF3ZT2SGKXIQXTW46QFNMUT6B3D" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/codm_george41" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790355569" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64522751, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD2NW7INAHXPCY2CGXA7K74QVA3GOB7M6KP7DJNDAIEHVSK4CROWYNIA" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GD2NW7INAHXPCY2CGXA7K74QVA3GOB7M6KP7DJNDAIEHVSK4CROWYNIA" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/valenti_rissa" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789899533" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64593505, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD2SOPA77HAN6FUAT7XXCTC6EVRL3WWN5OZ7VYNZY2WBZP4RKNQVV2IG" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GD2SOPA77HAN6FUAT7XXCTC6EVRL3WWN5OZ7VYNZY2WBZP4RKNQVV2IG" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/boundless_fi/status/2094728986538471608" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790253303" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329548, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD44P5UZ4XJJJI2KSHGYXHYR2R44Y4KLKPH3DQDKPBSJD65PSWQKPXCI" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GD44P5UZ4XJJJI2KSHGYXHYR2R44Y4KLKPH3DQDKPBSJD65PSWQKPXCI" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/unknxbt" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788858754" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426637, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD4ZUBMN7HPBN3YQPIFNL5JQICVFXZFXIQ7Y2T7MRIDHXMOLBBGD2HWS" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GD4ZUBMN7HPBN3YQPIFNL5JQICVFXZFXIQ7Y2T7MRIDHXMOLBBGD2HWS" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/YOSZ2" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789400019" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264020, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD5AVPHJ26B4NBSLDUAUB7HI3XBFKUKLNOHKKK6EKYHB5ILTNA263PDB" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GD5AVPHJ26B4NBSLDUAUB7HI3XBFKUKLNOHKKK6EKYHB5ILTNA263PDB" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/huyzow155" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788492910" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264567, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD5B6W6W7DA5EJQN2OX7CJAVZW6EODGUUSGHBNFA7DSBNDY7KFDPLWFC" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GD5B6W6W7DA5EJQN2OX7CJAVZW6EODGUUSGHBNFA7DSBNDY7KFDPLWFC" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/KaitoLOK" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788495972" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64522796, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD5PABD6RFOAKVAH47H2RNQDPS5HWGDYXM5N7LPEMZ4N34CH7QZOW7HL" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GD5PABD6RFOAKVAH47H2RNQDPS5HWGDYXM5N7LPEMZ4N34CH7QZOW7HL" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/akansim9" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789899758" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425801, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD6L5SNMVT5SXUG5OGXLGWQDBNVGY3OQFXPEZHA53PNEE5DAXOX4CDH4" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GD6L5SNMVT5SXUG5OGXLGWQDBNVGY3OQFXPEZHA53PNEE5DAXOX4CDH4" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/anhvu_x" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789395333" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64314189, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD6UB3JOFRLJ4DJAWJ53GFG5FXBJSZITL3LG3PGSQRLXGWRTMQJNQA7B" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GD6UB3JOFRLJ4DJAWJ53GFG5FXBJSZITL3LG3PGSQRLXGWRTMQJNQA7B" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/boundless_fi/status/2094728986538471608" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788773000" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437612, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GD7R4BI47Q5R4EUYN3AZ5EV4ZMMN2DRUG5DOSQS2ZRCYQLD2OICI3CLT" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GD7R4BI47Q5R4EUYN3AZ5EV4ZMMN2DRUG5DOSQS2ZRCYQLD2OICI3CLT" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/smallhanami" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789461442" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64324058, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDATYNHFA7NFTK7NORYI2HENINM3LJ2MA2BEFGYK46POPG662WHB524H" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDATYNHFA7NFTK7NORYI2HENINM3LJ2MA2BEFGYK46POPG662WHB524H" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Xerexx4/status/2097122998289629542" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788828153" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426669, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDBTK4QJ22WZC7CD2I5KOBNVN5AIRU3DD2EX3YZBLV7M46Y6RYUNCDLR" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDBTK4QJ22WZC7CD2I5KOBNVN5AIRU3DD2EX3YZBLV7M46Y6RYUNCDLR" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/DumAndPum" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789400200" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64588734, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDC25VYWGWCK265BS6MKGYAUCBSV3LVQS4LUY33PUOT6S5NUNOEPVRVD" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDC25VYWGWCK265BS6MKGYAUCBSV3LVQS4LUY33PUOT6S5NUNOEPVRVD" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/AnirudhAgapj" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790229448" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591257, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDC7HWCF35MCND4IJBTSVBOAKR4BG2HI45R345ERWFQGML2HS7KGGDLQ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDC7HWCF35MCND4IJBTSVBOAKR4BG2HI45R345ERWFQGML2HS7KGGDLQ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/iampreshie22" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790242063" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223819, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDCM56BZLWE46BDAXPZFSASAXWW3YQLPZY2AKF4FILXNDPREOVJMSONX" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDCM56BZLWE46BDAXPZFSASAXWW3YQLPZY2AKF4FILXNDPREOVJMSONX" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Icedollarr" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788264168" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64379324, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDCTZYDD3YXCXSA66WRLLBYYM5Z6IWITBSP3T3AYZOC4RUAIFS6GJNM7" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDCTZYDD3YXCXSA66WRLLBYYM5Z6IWITBSP3T3AYZOC4RUAIFS6GJNM7" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/lord10x_/status/2097301605523607656?s=46" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789136140" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64245406, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDEHJYBPFQLVO4YIOG6USXYIZYHSBLLTIH5XAXX7ZARLNHTXPC6RQUQG" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDEHJYBPFQLVO4YIOG6USXYIZYHSBLLTIH5XAXX7ZARLNHTXPC6RQUQG" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/kwechirionGod1" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788387218" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64431410, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDENLMKPPVI7HYVJWRJIB6Z2AAIQNUKT7VSG6VJW4WGR3VAC5MAY6IQL" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDENLMKPPVI7HYVJWRJIB6Z2AAIQNUKT7VSG6VJW4WGR3VAC5MAY6IQL" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VN_Stellar/status/2094473527638557090" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789426758" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425894, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDEUNFH2WAXZC5VPHTULLKE5I6VJMRWZHDN5ZGL3DAGLHMGSCBHPJCPC" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDEUNFH2WAXZC5VPHTULLKE5I6VJMRWZHDN5ZGL3DAGLHMGSCBHPJCPC" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/zaydalf" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789395854" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64521008, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDFZJIBTR7JFFH5MSTBWVXPI3ZB5VZAJQDYRHAZ3EHK6TCIMW4NPVHWV" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDFZJIBTR7JFFH5MSTBWVXPI3ZB5VZAJQDYRHAZ3EHK6TCIMW4NPVHWV" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/BoTrai9/status/2096794221609099637" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789890818" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426651, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDGH345DWYQUQJT3LFED4SVRVTGYYBP7MWTWXDAJTBDBQA6HG2E3KRD5" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDGH345DWYQUQJT3LFED4SVRVTGYYBP7MWTWXDAJTBDBQA6HG2E3KRD5" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/allain_fps" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789400098" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426710, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDGR7CBKULHMNJNCWPSS3TMNAOWK57PRKRQESDKZCR6LX4FU5ABFDUBR" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDGR7CBKULHMNJNCWPSS3TMNAOWK57PRKRQESDKZCR6LX4FU5ABFDUBR" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/justinnghien" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789400429" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64282057, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDGZXEANOXIJRO5CGHDUTWDARC43OBEFWZF2ORWCMGTMQD6OELJ5VQPF" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDGZXEANOXIJRO5CGHDUTWDARC43OBEFWZF2ORWCMGTMQD6OELJ5VQPF" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/sitinh76qn/status/2096140202700140690?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788593941" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64400760, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDH3X6UEA7BDMXY4HNQOM4RYAYSJNUT4TFSFWMF2F3ODG6FE7MZ5IMZK" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDH3X6UEA7BDMXY4HNQOM4RYAYSJNUT4TFSFWMF2F3ODG6FE7MZ5IMZK" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/haywhy_lambo" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789255702" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64238032, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDI3IFSW6CZNMF7XMBME6YYUDBE34UQ67QZR64PNRIJSZUR6YFH7UI5L" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDI3IFSW6CZNMF7XMBME6YYUDBE34UQ67QZR64PNRIJSZUR6YFH7UI5L" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Alagbax" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788345152" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64563752, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDIFMYOSTTEWCFFRQS53JEQ7MFXGHG77I7ACVJKU4Y72QBWP5HRI5XF3" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDIFMYOSTTEWCFFRQS53JEQ7MFXGHG77I7ACVJKU4Y72QBWP5HRI5XF3" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/kingzedox0/status/2102476671773262088" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790104538" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367206, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDIWDJGCMGXXYGG6HPLNQHQV3KFOYXRKBSCKJZZNTMXELIFBS4D4ZSDK" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDIWDJGCMGXXYGG6HPLNQHQV3KFOYXRKBSCKJZZNTMXELIFBS4D4ZSDK" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VackOU666/reposts" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789068767" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367139, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDJ4K2KHJTAM3MH47NXOOPCRPKCKRVS5VLVGIBEK7BHVB6NPJNIOQLGF" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDJ4K2KHJTAM3MH47NXOOPCRPKCKRVS5VLVGIBEK7BHVB6NPJNIOQLGF" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/NTNghia1712/reposts" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789068398" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64511501, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDJ4W5TOTWIUWSKKGWGT4UXEZNHVEGEU5JHSASXUYT7ZSZV3ZY7HE3VC" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDJ4W5TOTWIUWSKKGWGT4UXEZNHVEGEU5JHSASXUYT7ZSZV3ZY7HE3VC" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/devZeyys" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789843283" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64541870, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDJTYHSIWQG35TO6YFFJ6GB4RWFFJH4FMWQNG6BW7DGXHBIWESZXY66S" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDJTYHSIWQG35TO6YFFJ6GB4RWFFJH4FMWQNG6BW7DGXHBIWESZXY66S" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/mavrix006/status/2102016747469406426," + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789995128" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64288319, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDJUY3N2IVMYWPWL5CHEIGQHSMBQROELUHF4QTIMC56GVO27FLKDEPUS" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDJUY3N2IVMYWPWL5CHEIGQHSMBQROELUHF4QTIMC56GVO27FLKDEPUS" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Kikachukwu9/status/2096286588795855230?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788628790" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64516786, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDKMSQYPV3M2ZOZ6ELXDVQF5YWYEZPJIQA2XODJOGHZ57PE2XAD3BD7O" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDKMSQYPV3M2ZOZ6ELXDVQF5YWYEZPJIQA2XODJOGHZ57PE2XAD3BD7O" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/victorben001/status/2089830296585720175" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789869708" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425903, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDKSGHVOWEEVLKW7WFNR62N5DRVTLYVSMODJ4ZSKB4EFR5K4LGOIGSUJ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDKSGHVOWEEVLKW7WFNR62N5DRVTLYVSMODJ4ZSKB4EFR5K4LGOIGSUJ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Clash_Haloo" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789395905" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64447174, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDLKJIHOV4BOBWWKZAKVVHYGULR6NNGTR2SB5OYTROGMSGODVJIZ4BH2" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDLKJIHOV4BOBWWKZAKVVHYGULR6NNGTR2SB5OYTROGMSGODVJIZ4BH2" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/vn_stellar/status/2094473527638557090?s=46" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789515015" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64596313, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDMBA5ZEC45HNJEO4R6HV6X53LDALAV4PBI22KGJL4X3WVFKBWGAPFUM" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDMBA5ZEC45HNJEO4R6HV6X53LDALAV4PBI22KGJL4X3WVFKBWGAPFUM" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/sanjukta_xoxo" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790267344" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64315542, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDMGYNO4UIGSZP46GRSUFR6IZANBMAK4XECGYCI5N5UIWQCTRVKOJWW7" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDMGYNO4UIGSZP46GRSUFR6IZANBMAK4XECGYCI5N5UIWQCTRVKOJWW7" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/i/status/2094728986538471608" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788780532" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425817, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDNC6UMPK62ZGHRT6PUY7LRLIJUZ7SWGLTF7XPDOYHZWC3VKDMT4ZNFM" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDNC6UMPK62ZGHRT6PUY7LRLIJUZ7SWGLTF7XPDOYHZWC3VKDMT4ZNFM" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/hoishock" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789395423" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64226564, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDNWNV2PBY54YRL45GVHRDHA737SEPL6BZMAKRI2IDRKUEP56GERIHDT" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDNWNV2PBY54YRL45GVHRDHA737SEPL6BZMAKRI2IDRKUEP56GERIHDT" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/UyennH147/status/2094820476602486972?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788279813" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264638, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDOAQK5AK4Z3TAFIMU4WMVJSVZECLK2NEVPRGG4CSO54ZWHFHBE6IDMI" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDOAQK5AK4Z3TAFIMU4WMVJSVZECLK2NEVPRGG4CSO54ZWHFHBE6IDMI" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/jackson0xN" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788496380" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64330672, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDOIC3LPD34KTKRTFOAMB6CKAYZNOIGV5V7H5YESTNMFSQ5JG5PMFS3P" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDOIC3LPD34KTKRTFOAMB6CKAYZNOIGV5V7H5YESTNMFSQ5JG5PMFS3P" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/vikramkoli707" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788865027" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475193, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDOR4CPOMWGJIYUKLHUAWG6YKG5O54W6QXU4W6HSB5I7UIZ3GK3LFGDX" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDOR4CPOMWGJIYUKLHUAWG6YKG5O54W6QXU4W6HSB5I7UIZ3GK3LFGDX" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/haideedotxyz" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789661743" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64239430, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDP25U2QVO5LSHQRG36UEFV3EU2B7SGI5QSKBWHMGZILOYQM5T6ZLDFL" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDP25U2QVO5LSHQRG36UEFV3EU2B7SGI5QSKBWHMGZILOYQM5T6ZLDFL" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/philosofaprime" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788353112" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553198, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDQRHRIHCEFBBBGV25MVVV4CPOZKGC3L2WE2VEAJP5YU3MGYSXU472DT" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDQRHRIHCEFBBBGV25MVVV4CPOZKGC3L2WE2VEAJP5YU3MGYSXU472DT" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/DoanQuynhTien1/status/2102254693254877679" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790051768" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64567961, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDQRMSPPL36367H7GTGY737ZCMERZIODQYBUSSKQZ2KKJQXVP4J3KICR" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDQRMSPPL36367H7GTGY737ZCMERZIODQYBUSSKQZ2KKJQXVP4J3KICR" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/JayPaul1647264/status/2102563939410206969" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790125583" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64353138, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDRNFVUHSAEFPJ6RHROZNL4PZODJQAGOPUNDY7XHQKN7QGNFJZPNRJ6F" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDRNFVUHSAEFPJ6RHROZNL4PZODJQAGOPUNDY7XHQKN7QGNFJZPNRJ6F" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/cypher__josh/status/2097803637158227974" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788990517" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425886, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDRZ3DFYOVBOOONOM6UWYINJLRE4BUSOXCEJCKWXOVU2WOC7XT6F7MXR" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDRZ3DFYOVBOOONOM6UWYINJLRE4BUSOXCEJCKWXOVU2WOC7XT6F7MXR" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Hawk_Hey" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789395809" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64327772, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDT3QTEWTO6MY4UDP6OSQ3CBBAYA7LQLFAMS5SDIA4BZIUPISEJ4DVXA" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDT3QTEWTO6MY4UDP6OSQ3CBBAYA7LQLFAMS5SDIA4BZIUPISEJ4DVXA" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Judeobii/status/2097208550221062515" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788848863" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64240080, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDTEKTRGDPHBT5UTUHYTJR3JDZDPAJ4ZNKFOUROFSDZI72POQJM3RBXK" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDTEKTRGDPHBT5UTUHYTJR3JDZDPAJ4ZNKFOUROFSDZI72POQJM3RBXK" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/jennyt_eth/status/2095115079230365920?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788356814" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425823, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDTRBLSF6K3MI2MVS6DSLEHWRKHWUE74ZF6SE57VHFSL463TY2L6QX7O" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDTRBLSF6K3MI2MVS6DSLEHWRKHWUE74ZF6SE57VHFSL463TY2L6QX7O" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ethernetexp" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789395456" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64313529, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDUHWGNSL6WL4IIYKP7QMEC7H4CAOX5Q65QG7JGHCPBRRXALLSE6WBP4" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDUHWGNSL6WL4IIYKP7QMEC7H4CAOX5Q65QG7JGHCPBRRXALLSE6WBP4" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Tungthuocno" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788769333" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264614, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDVGNWW3GMZE7TNCBCZKB5UZJMECGGLG4XB3FJGG5NFNHICRXWQF3AAQ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDVGNWW3GMZE7TNCBCZKB5UZJMECGGLG4XB3FJGG5NFNHICRXWQF3AAQ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/tuhao_vn" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788496247" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64318734, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDWHA4JM3W57ZZMIZBZIQF4H7PZOACWVR2ZWOI34VJLBMFB6TCAH7KP4" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDWHA4JM3W57ZZMIZBZIQF4H7PZOACWVR2ZWOI34VJLBMFB6TCAH7KP4" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/SteveChainBuzz" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788798369" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64318577, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDXURAFHE27EXW2L2HE4PQIWJEO7MXNROPZBSZ4XO2HQWTDNA4REUD4U" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDXURAFHE27EXW2L2HE4PQIWJEO7MXNROPZBSZ4XO2HQWTDNA4REUD4U" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/LindaCBlanding" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788797491" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64255162, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDYEUWPLNHSIZ3YC5B2WTFF2EFRVCHLEAE3BN4IMY2PIVU5OW6BTYXTS" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDYEUWPLNHSIZ3YC5B2WTFF2EFRVCHLEAE3BN4IMY2PIVU5OW6BTYXTS" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/TuanAR205" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788442855" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64325738, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796612" + }, + { + "address": "GDZ2HV576TOUH6MXE5NR3NOSZHELDXRQ2ULBZS3IKNFANRMTU4FTMIUG" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDZ2HV576TOUH6MXE5NR3NOSZHELDXRQ2ULBZS3IKNFANRMTU4FTMIUG" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/lynneaf_" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788837529" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64590233, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GA25XFBDROFS3V53RRGHGN5IY2LQFP3HO4IFSOZS2SAAQA4DEJ7JHWX4" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA25XFBDROFS3V53RRGHGN5IY2LQFP3HO4IFSOZS2SAAQA4DEJ7JHWX4" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ashish_0903" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790236943" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553015, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GA3NAZYKIAQWJHXCUORX3FUXZCCMWRFIKJFEDMLEUFMCWELYD2LCDWON" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA3NAZYKIAQWJHXCUORX3FUXZCCMWRFIKJFEDMLEUFMCWELYD2LCDWON" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Smoky8668/status/2095912471961981204" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790050853" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64580320, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GA4DJDM66BZLZ54K7GLZFFPKGBNC44IPZSHMMZ6G7YY5TOQH3N5T5HAM" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA4DJDM66BZLZ54K7GLZFFPKGBNC44IPZSHMMZ6G7YY5TOQH3N5T5HAM" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Prof4477/status/2102551458516263019" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790187378" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64569908, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GA6UANZSAIOSKXKPYXEYLHAUNTQOJNKUIKCPGFNU6RVVTPJDJJNHOJYH" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA6UANZSAIOSKXKPYXEYLHAUNTQOJNKUIKCPGFNU6RVVTPJDJJNHOJYH" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/NoniRichies29/status/2102293143223689342" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790135318" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490683, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GA7YDWNQYXXLAWBZG25MH3XI2QATNC5CVZZ7U3IKWEWCDEV4B6E54TLM" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA7YDWNQYXXLAWBZG25MH3XI2QATNC5CVZZ7U3IKWEWCDEV4B6E54TLM" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VN_Stellar/status/2090734566478909861?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789739193" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591764, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAAZEXTYFCDS2QNXAYKVCMAUJLUZACWVOQ2WVRUUEIXC6ZKSHC6GDU5O" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAAZEXTYFCDS2QNXAYKVCMAUJLUZACWVOQ2WVRUUEIXC6ZKSHC6GDU5O" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/RosieeDrafts/status/2103017518302368081" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790244598" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64430417, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAB6Z7XBXJDS736GUA7RXUSXSHZCDC5X23BB2OSN6UAG7CNKE4SXQGIL" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAB6Z7XBXJDS736GUA7RXUSXSHZCDC5X23BB2OSN6UAG7CNKE4SXQGIL" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/vicanorous/status/2098644762773332061" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789421196" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64585929, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GADGXEIP2NEIJ3723RFTFCSPVJIJVM42RTONINH4MRTMUV2KBDFBORF5" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GADGXEIP2NEIJ3723RFTFCSPVJIJVM42RTONINH4MRTMUV2KBDFBORF5" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://app.notion.com/p/The-Vietnam-Flywheel-3e590b57690280599face4e1f1f12697?source=copy_link" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790215423" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323357, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GADWDDKP4TKUVNZVSKXFNFN6FXSZYIAHL35R6GEQB4M3QK3FNEF225YS" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GADWDDKP4TKUVNZVSKXFNFN6FXSZYIAHL35R6GEQB4M3QK3FNEF225YS" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/LNH2005_/status/2097101877771210866" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788824240" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264369, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAH4O6GYKLK2VZBSRWVKLLJ6K6XWWW3RPYG37BHA3J6SNW6WKW5MURKU" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAH4O6GYKLK2VZBSRWVKLLJ6K6XWWW3RPYG37BHA3J6SNW6WKW5MURKU" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/DGroup_Official/status/2095701735864197294" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788494855" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64605246, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAHCZAPDQH32PUCAUSIA6YUHRZP37C2RHNN3IHBW35JR2A4W6IQZEFKE" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAHCZAPDQH32PUCAUSIA6YUHRZP37C2RHNN3IHBW35JR2A4W6IQZEFKE" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Tomisinweb3/status/2103346312691298344?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790312009" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64540449, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAJJYKVGLTGP6A3ANITXSKM26FT5OWLOV6MLWQPGHMOLWGSXXPRNOAFM" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAJJYKVGLTGP6A3ANITXSKM26FT5OWLOV6MLWQPGHMOLWGSXXPRNOAFM" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/0xWarri_san/status/2101952142273642734" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789988023" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64565075, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAJOAYF7JRQNPAFECS7SDYAKPPZHEUVSDMHFHPKYWYWECIDAMTTFUBRW" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAJOAYF7JRQNPAFECS7SDYAKPPZHEUVSDMHFHPKYWYWECIDAMTTFUBRW" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/dexterofweb3/status/2102366922335567978" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790111153" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64444489, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAPFD4AVZGSXJGZ6SQBM4VOVNAVCZHGQT7UXALJSNDZAN45DCBFNVFZP" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAPFD4AVZGSXJGZ6SQBM4VOVNAVCZHGQT7UXALJSNDZAN45DCBFNVFZP" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/fessaco/status/2095065747223453702" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789500003" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64502295, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GATRUJAWQWVWSSXYGUDDXPDQG4EGHNIQBMYCBYWX7HVZJQYYAMPYAHKL" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GATRUJAWQWVWSSXYGUDDXPDQG4EGHNIQBMYCBYWX7HVZJQYYAMPYAHKL" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/shelleymaeph/status/2100955099686162902" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789797253" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609894, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAW4DTRCC6JEBXQN53RYX6D2TZZ3Y2EUBF54HC35RR6TOYCHCCUQZVI2" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAW4DTRCC6JEBXQN53RYX6D2TZZ3Y2EUBF54HC35RR6TOYCHCCUQZVI2" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Deecryptt_/status/2103183069339611448?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790335249" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64590322, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GAYNG64UV3AS4PK5CAAZE65HQYBVPYEAAGSK4YMSIW3DAT6GZY632N62" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAYNG64UV3AS4PK5CAAZE65HQYBVPYEAAGSK4YMSIW3DAT6GZY632N62" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/AshishChau25910" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790237388" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610273, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GB2DG2EQGAUIW6VFQ5I62RMXJBWUBAKYBKCY77Z7UEJUCYHX4IPEGEOA" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GB2DG2EQGAUIW6VFQ5I62RMXJBWUBAKYBKCY77Z7UEJUCYHX4IPEGEOA" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/4LizX_Web/status/2103451932954333408" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790337144" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612244, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GB3EXLNQXLMQIHHIRT2RRMSUJVZGCDSJ5K2GSIQ6H7CQZBDXCMWLD4XQ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GB3EXLNQXLMQIHHIRT2RRMSUJVZGCDSJ5K2GSIQ6H7CQZBDXCMWLD4XQ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/cosycelina/status/2103491914385469461?s=46" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790346999" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64349191, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBAYJECW5TX6VC5BVHMHC3CXNGOCH7SMKEB7HY7PY3FA74ITFV6EHRKU" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBAYJECW5TX6VC5BVHMHC3CXNGOCH7SMKEB7HY7PY3FA74ITFV6EHRKU" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/IamVirginT/status/2097075077607264583" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788968423" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64352852, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBBZ5ARLATIB362OH74BIYUJ7SKZBZG2Q3WRPW6USGNLXPRYMRCT52PV" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBBZ5ARLATIB362OH74BIYUJ7SKZBZG2Q3WRPW6USGNLXPRYMRCT52PV" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/afeesyusuf95409/status/2097795934671548859?s=46" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788988910" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64603479, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBF5JQPKGAH73ENUHNY57YNX4R2CDAGSRQW43LULFKNHP42DQR5XI53P" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBF5JQPKGAH73ENUHNY57YNX4R2CDAGSRQW43LULFKNHP42DQR5XI53P" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Web3tabbie/status/2101946231823991026" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790303174" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613953, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBISWUA6YYUXWP5LZ6HEQSUSAGYLSIQPMVJOOPELXNLJNFSAI67DAYK5" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBISWUA6YYUXWP5LZ6HEQSUSAGYLSIQPMVJOOPELXNLJNFSAI67DAYK5" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/imblackf/status/2103529484792242661?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790355544" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326454, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBJ7TIB5D7WQTE7DG7ZNVUJTD5AY663RPVCCRV5L2LQA3KUHUARAWJWT" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBJ7TIB5D7WQTE7DG7ZNVUJTD5AY663RPVCCRV5L2LQA3KUHUARAWJWT" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Salopi001/status/2097095301504876964" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788841511" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64582917, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBKOUX6KOXYS2PNX7U66OVTHWW4GW2JGQF2DFWHO64N3Y2M2BF5DEGBB" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBKOUX6KOXYS2PNX7U66OVTHWW4GW2JGQF2DFWHO64N3Y2M2BF5DEGBB" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Ella_Jacee/status/2102810416346804252" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790200363" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64511100, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBMFSMT3OK6T7LOWJBINEAGN7W26GLOCAFOV5GQU2ORSHI6Z2SBFP3OM" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBMFSMT3OK6T7LOWJBINEAGN7W26GLOCAFOV5GQU2ORSHI6Z2SBFP3OM" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ej_onx/status/2100822062507929841" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789841278" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64376176, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBNKYCX5V47NRSXU6JVHZNUUG37GXVEM2VACRURJMES7NPKPG64A2Z5E" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBNKYCX5V47NRSXU6JVHZNUUG37GXVEM2VACRURJMES7NPKPG64A2Z5E" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/pooshofficial_/status/2098340870600658979" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789118580" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490197, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBSXTAYAIUG74OCSFQQ5W4CME2WLMQMQBTPSPZDG47XALAL42D6IULES" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBSXTAYAIUG74OCSFQQ5W4CME2WLMQMQBTPSPZDG47XALAL42D6IULES" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/NFTKINGIII/status/2100804452445831660" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789736763" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613924, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBTCII43YUWJ4Y6KUZR46SP6BJLWLJWUYVHVRGMANY2XR5RG35FXRR3S" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBTCII43YUWJ4Y6KUZR46SP6BJLWLJWUYVHVRGMANY2XR5RG35FXRR3S" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/0xK3llyy/status/2103527665538105359" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790355399" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64359714, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBWGVQRGKZJNJZP2SQMF6DDBCRST5J5O7HZMDS3HCWHJ7KZOIIYTPIM4" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBWGVQRGKZJNJZP2SQMF6DDBCRST5J5O7HZMDS3HCWHJ7KZOIIYTPIM4" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ChainFolk_/status/2097909063472628125" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789027161" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64311868, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBZIEOJ4VXBSNSLQQ73ZXLACAOU7PNR3JIOMT33PYE46UTB47PLIYIPC" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBZIEOJ4VXBSNSLQQ73ZXLACAOU7PNR3JIOMT33PYE46UTB47PLIYIPC" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/vuntqn91/status/2096837522227863989" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788760080" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64241515, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GBZNFITNWK2KBCHUERLOBCS6XBQC4LFKEEURYWM7G3AT55LWS3YHOWRL" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBZNFITNWK2KBCHUERLOBCS6XBQC4LFKEEURYWM7G3AT55LWS3YHOWRL" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/nzegbui?s=11" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788365035" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64559193, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC2ZO2H7SYITX7AXBGOJNQHRGVWSTABIKHROFFE3ZDBYUOGGBDJ5ASHK" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC2ZO2H7SYITX7AXBGOJNQHRGVWSTABIKHROFFE3ZDBYUOGGBDJ5ASHK" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Willie_web3/status/2102380285757153663" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790081743" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64349920, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC33RPJWTEV5ND6DQ25SLT3GYDDPBZBQ3T3CT7R6QDY45YKJLLSTIJBZ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC33RPJWTEV5ND6DQ25SLT3GYDDPBZBQ3T3CT7R6QDY45YKJLLSTIJBZ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://drive.google.com/drive/folders/1uAiRhylaburxua8GUCilRg81mgyfzlyu" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788972484" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64290462, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC35DGZ4HDRMI622LUTETV7W6MJH6GO5KM7FH4LNYMQ57VM3YRMBPC4L" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC35DGZ4HDRMI622LUTETV7W6MJH6GO5KM7FH4LNYMQ57VM3YRMBPC4L" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://drive.google.com/drive/folders/1i2t_Zfle6Qzn5lqYUlDmA8vE5bLvRwe5?usp=drive_link" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788640751" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64361042, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC3KL2WTNWWK4C2KZFLKKMECF6JZVDXKHGATDIWQ7OJU3OHZSVUBK2Y5" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC3KL2WTNWWK4C2KZFLKKMECF6JZVDXKHGATDIWQ7OJU3OHZSVUBK2Y5" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/mizu2403v/status/2097987215498576114?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789034536" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64558230, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC3OLVPNJYDH26LFK4B4PNVFRGDJYUCMSGJVDJQ3UN76FMLJE77VTX6S" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC3OLVPNJYDH26LFK4B4PNVFRGDJYUCMSGJVDJQ3UN76FMLJE77VTX6S" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/vietbang2204/status/2102360902809096246" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790076928" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553080, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC3Q4CJXKLYESHLL4C34CT3ENOT4TXDO3W4PRIQ3C7TC4FHTRAQ5S37J" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC3Q4CJXKLYESHLL4C34CT3ENOT4TXDO3W4PRIQ3C7TC4FHTRAQ5S37J" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/zero2i_official/status/2096141371564609731" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790051178" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64563924, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC4ZC6F65CYSIN2TT6XO5BZ4GNYZ2TCQIVGBRMCHUI2QMPOQISORL6DO" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC4ZC6F65CYSIN2TT6XO5BZ4GNYZ2TCQIVGBRMCHUI2QMPOQISORL6DO" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Timmysuns1/status/2093686958119649371" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790105398" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591595, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC5P3MKC4MK5IE5IJYQVLPS6EVSHMYUPOYWPS6AAQQ7FUEF32G3H4TRJ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC5P3MKC4MK5IE5IJYQVLPS6EVSHMYUPOYWPS6AAQQ7FUEF32G3H4TRJ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/thesithunyein/status/2103060073715257597" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790243753" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64555428, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC6NCYXDLUZ6KYJBVYJ6MSIHORZYGTL6T7B6GTLF4CCI6AJ6SBVF3NUQ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC6NCYXDLUZ6KYJBVYJ6MSIHORZYGTL6T7B6GTLF4CCI6AJ6SBVF3NUQ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Jemmie09/status/2102193875334910022" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790062918" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553586, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GC7PKCYZRRDRT6HBGPPON4NKQGHKNJJJQ7JN74TM5XBHFH7JBVI7LBR6" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC7PKCYZRRDRT6HBGPPON4NKQGHKNJJJQ7JN74TM5XBHFH7JBVI7LBR6" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/kelvin_bach/status/2102259886776336559" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790053708" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64584895, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCCZVSEE77TOK6QTPLUNUUFZ5JOHFQJNXJCN63FBW6VEVLQ676RW7UV3" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCCZVSEE77TOK6QTPLUNUUFZ5JOHFQJNXJCN63FBW6VEVLQ676RW7UV3" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/keytranmtp/status/2102699495410811204?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790210253" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64562758, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCDD35WKILCDXEKL275OFVXPZBYN2DCTOEIXJZY5W4A2ODWEXK3CU7RH" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCDD35WKILCDXEKL275OFVXPZBYN2DCTOEIXJZY5W4A2ODWEXK3CU7RH" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/0xmillysmith/status/2102453623259103367" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790099568" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613318, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCEE54NZQVKEPPYF5BUWJHMGRORKIRJIXQYW3IFIMHTJIYLSBWPYCZ5H" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCEE54NZQVKEPPYF5BUWJHMGRORKIRJIXQYW3IFIMHTJIYLSBWPYCZ5H" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/jokerrrrr02/status/2103514679347716101?s=46" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790352369" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64381440, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCETB2HL6ZPYZPJAGKTB2STFYYUBTFCIMCUHYIW5F5I5PJY2UPY6KZCO" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCETB2HL6ZPYZPJAGKTB2STFYYUBTFCIMCUHYIW5F5I5PJY2UPY6KZCO" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/zhouzhounhat/status/2098460408717918701" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789147934" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64336907, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCFZFN54GPXIVILU6XGGZXGA6UIKPAIUOQWVBEEX4RJHKSPEVKZ2P5QQ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCFZFN54GPXIVILU6XGGZXGA6UIKPAIUOQWVBEEX4RJHKSPEVKZ2P5QQ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/whizaburia11/status/2097423912049029261" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788899866" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64313255, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCFZKKIYA4QFR2H2QZZ4QHRPZBUU7XRILEQHNYB2FTYRSP7XGP6F645Y" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCFZKKIYA4QFR2H2QZZ4QHRPZBUU7XRILEQHNYB2FTYRSP7XGP6F645Y" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/dmKhanh31/status/2096863422831095980" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788767807" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599743, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCIR3QJXGKOTEDVBNFAJOG7WZ6CWI7NYAHWYT67F5CD7ARKXYWRF3LAD" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCIR3QJXGKOTEDVBNFAJOG7WZ6CWI7NYAHWYT67F5CD7ARKXYWRF3LAD" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/LexanderOfX/status/2103172947758170227" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790284494" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64606656, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Augustina__egbo/status/2103356026246299669" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790319059" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64611676, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCK7E564LET4I42RNS2CEERKHCIUAFJLM2HNKK7M44IQRH4RB2KFPJU5" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCK7E564LET4I42RNS2CEERKHCIUAFJLM2HNKK7M44IQRH4RB2KFPJU5" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/e_mnaas/status/2103481628790005805?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790344159" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64271513, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCKAXQ6XLXOJ366C3P3VVLXU24X2UQ3YERWL5VNX2C77E6U7C6KTAAVJ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCKAXQ6XLXOJ366C3P3VVLXU24X2UQ3YERWL5VNX2C77E6U7C6KTAAVJ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://drive.google.com/drive/folders/1M-3lxsLeUjGIHP2qSHMHdE4MsjJwb-oL?usp=drive_link" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788535359" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64278951, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCP6XZS6WEONXRC44RG2RFHGF35EJNWT3HBKF2FFNDOWCYAC653323N7" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCP6XZS6WEONXRC44RG2RFHGF35EJNWT3HBKF2FFNDOWCYAC653323N7" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/MS_Capitall/status/2096039471947079974" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788576732" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64388920, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCVRUOOSB53I2QNGBHMW4WMKPVULRKBYEIW3JPB56O64PMOJMCZGX5HI" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCVRUOOSB53I2QNGBHMW4WMKPVULRKBYEIW3JPB56O64PMOJMCZGX5HI" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://drive.google.com/drive/folders/1pL1kd2LQoPLa5lr3g8TvHN2KkKlgUKCF?usp=sharing" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789189660" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64465331, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCWYCR2NNOZMITJBLXGNSFAWT3YQDHXOIPUPCONCQZPRAUZGWDNGNM7M" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCWYCR2NNOZMITJBLXGNSFAWT3YQDHXOIPUPCONCQZPRAUZGWDNGNM7M" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/luodemian118/status/2100410930832237035" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789612433" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323680, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/malvinsdev/status/2097114040480731646" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788826040" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64607941, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GCZZV7L6SJY3KDPUCSXD5MQCXOYSZA22WTXYX62M3RBCRNXE7J4ZJHLV" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCZZV7L6SJY3KDPUCSXD5MQCXOYSZA22WTXYX62M3RBCRNXE7J4ZJHLV" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/TheAnthonCrypto/status/2103402077695189412?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790325484" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609323, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GD2SOPA77HAN6FUAT7XXCTC6EVRL3WWN5OZ7VYNZY2WBZP4RKNQVV2IG" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GD2SOPA77HAN6FUAT7XXCTC6EVRL3WWN5OZ7VYNZY2WBZP4RKNQVV2IG" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/heist_writes/status/2103413074292072684" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790332394" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473454, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GD4UNF3UMYMI3NA4RZGPRYIDELND3RAS2LV6LTJKNKWHBAZVSI4GELOG" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GD4UNF3UMYMI3NA4RZGPRYIDELND3RAS2LV6LTJKNKWHBAZVSI4GELOG" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ngozi_miss/status/2100580655092379740" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789653048" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64344684, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GD6ZYOSMNEEZAIJYKCDN7MDA6H2MUHQKYKM6GIYEQ52JU5GI4SSGMWL6" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GD6ZYOSMNEEZAIJYKCDN7MDA6H2MUHQKYKM6GIYEQ52JU5GI4SSGMWL6" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Jasper4Art/status/2097576429651099936?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788943247" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64306443, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDAHCRUEUXSLIGGYPCKBHQT2TWFTNEII62GAHGJETGOON5N4I6XPLFVA" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDAHCRUEUXSLIGGYPCKBHQT2TWFTNEII62GAHGJETGOON5N4I6XPLFVA" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/immaculateboss0/status/2096710329359364426" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788729837" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64324049, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDATYNHFA7NFTK7NORYI2HENINM3LJ2MA2BEFGYK46POPG662WHB524H" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDATYNHFA7NFTK7NORYI2HENINM3LJ2MA2BEFGYK46POPG662WHB524H" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Xerexx4/status/2097122998289629542" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788828104" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613252, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDC7HWCF35MCND4IJBTSVBOAKR4BG2HI45R345ERWFQGML2HS7KGGDLQ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDC7HWCF35MCND4IJBTSVBOAKR4BG2HI45R345ERWFQGML2HS7KGGDLQ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/iampreshie22/status/2103509596111339650" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790352039" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64379347, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDCTZYDD3YXCXSA66WRLLBYYM5Z6IWITBSP3T3AYZOC4RUAIFS6GJNM7" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDCTZYDD3YXCXSA66WRLLBYYM5Z6IWITBSP3T3AYZOC4RUAIFS6GJNM7" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/lord10x_/status/2097301605523607656?s=46" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789136268" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64571752, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDE2M7YEYHQIJMR4I6HD2AHUVJEYPMRSHY6KLWM2C6CIJYVYHNQW5JJP" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDE2M7YEYHQIJMR4I6HD2AHUVJEYPMRSHY6KLWM2C6CIJYVYHNQW5JJP" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Hewrites_/status/2102562736634790114" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790144538" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64521142, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDFZJIBTR7JFFH5MSTBWVXPI3ZB5VZAJQDYRHAZ3EHK6TCIMW4NPVHWV" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDFZJIBTR7JFFH5MSTBWVXPI3ZB5VZAJQDYRHAZ3EHK6TCIMW4NPVHWV" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/BoTrai9/status/2101583019136176274" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789891488" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64294467, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDGZXEANOXIJRO5CGHDUTWDARC43OBEFWZF2ORWCMGTMQD6OELJ5VQPF" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDGZXEANOXIJRO5CGHDUTWDARC43OBEFWZF2ORWCMGTMQD6OELJ5VQPF" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/sitinh76qn/status/2096430307595715062?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788663081" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64256894, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDHEFAG7XPZ4UZXDT7OT342PYTCF7OQQ34LZJNOWK5CLRLTLXJAYENKI" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDHEFAG7XPZ4UZXDT7OT342PYTCF7OQQ34LZJNOWK5CLRLTLXJAYENKI" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/thebu11runner/status/2095518060719251601?s=46" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788452697" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64542114, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDJTYHSIWQG35TO6YFFJ6GB4RWFFJH4FMWQNG6BW7DGXHBIWESZXY66S" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDJTYHSIWQG35TO6YFFJ6GB4RWFFJH4FMWQNG6BW7DGXHBIWESZXY66S" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://docs.google.com/document/d/1wMNT0InePb4R8Wh5ctdWfbX6jy_JJtBe/edit?usp=drivesdk&ouid=112097195349587193381&rtpof=true&sd=true" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789996348" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490742, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDK2HMIISZ4B5RR5EEA726OJEVRQHHZJHDM7SVB2Y7K5XCRI33QIVU3H" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDK2HMIISZ4B5RR5EEA726OJEVRQHHZJHDM7SVB2Y7K5XCRI33QIVU3H" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/INvioneL8B8/status/2100944640518316295" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789739488" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64566542, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDKMSQYPV3M2ZOZ6ELXDVQF5YWYEZPJIQA2XODJOGHZ57PE2XAD3BD7O" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDKMSQYPV3M2ZOZ6ELXDVQF5YWYEZPJIQA2XODJOGHZ57PE2XAD3BD7O" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/VictorBen001/status/2102465954655375684" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790118488" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64227355, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDNWNV2PBY54YRL45GVHRDHA737SEPL6BZMAKRI2IDRKUEP56GERIHDT" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDNWNV2PBY54YRL45GVHRDHA737SEPL6BZMAKRI2IDRKUEP56GERIHDT" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/UyennH147/status/2094820476602486972?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788284324" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64589966, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDOLN2CLLI2KI6CVENF2NWCL36NBONRP64P5MVAIP5CPT5QWQCFYYWYV" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDOLN2CLLI2KI6CVENF2NWCL36NBONRP64P5MVAIP5CPT5QWQCFYYWYV" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/satheghishere/status/2103021898787438611?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790235608" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64548620, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDP25U2QVO5LSHQRG36UEFV3EU2B7SGI5QSKBWHMGZILOYQM5T6ZLDFL" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDP25U2QVO5LSHQRG36UEFV3EU2B7SGI5QSKBWHMGZILOYQM5T6ZLDFL" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/philosofaprime/status/2097620658628727163" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790028878" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553206, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDQRHRIHCEFBBBGV25MVVV4CPOZKGC3L2WE2VEAJP5YU3MGYSXU472DT" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDQRHRIHCEFBBBGV25MVVV4CPOZKGC3L2WE2VEAJP5YU3MGYSXU472DT" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/DoanQuynhTien1/status/2102254693254877679" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790051808" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64537809, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDRA4YPSRYDIG5QPAB2WISP3V5SGRCJVID2MZHI7UVCPCZGB3JWCZZAZ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDRA4YPSRYDIG5QPAB2WISP3V5SGRCJVID2MZHI7UVCPCZGB3JWCZZAZ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/phaze_001/status/2101890188876067061?s=46&t=WBO0_bEb2wkn3end4Y84xg" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789974823" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64353052, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDRNFVUHSAEFPJ6RHROZNL4PZODJQAGOPUNDY7XHQKN7QGNFJZPNRJ6F" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDRNFVUHSAEFPJ6RHROZNL4PZODJQAGOPUNDY7XHQKN7QGNFJZPNRJ6F" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/cypher__josh/status/2097585601402769435" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788990034" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64327812, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDT3QTEWTO6MY4UDP6OSQ3CBBAYA7LQLFAMS5SDIA4BZIUPISEJ4DVXA" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDT3QTEWTO6MY4UDP6OSQ3CBBAYA7LQLFAMS5SDIA4BZIUPISEJ4DVXA" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Judeobii/status/2097208550221062515" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788849089" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64340116, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDUHWGNSL6WL4IIYKP7QMEC7H4CAOX5Q65QG7JGHCPBRRXALLSE6WBP4" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDUHWGNSL6WL4IIYKP7QMEC7H4CAOX5Q65QG7JGHCPBRRXALLSE6WBP4" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Tungthuocno/status/2097487652240994476?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788917771" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64353005, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDWHA4JM3W57ZZMIZBZIQF4H7PZOACWVR2ZWOI34VJLBMFB6TCAH7KP4" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDWHA4JM3W57ZZMIZBZIQF4H7PZOACWVR2ZWOI34VJLBMFB6TCAH7KP4" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/SteveChainBuzz/status/2097596515799711796" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1788989770" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64596129, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796613" + }, + { + "address": "GDZIGG5CNRL45CAWPFYTJ7K6JP4XJIS7DF6T3OIX4NVIU4F6C6E7JIH5" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDZIGG5CNRL45CAWPFYTJ7K6JP4XJIS7DF6T3OIX4NVIU4F6C6E7JIH5" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Big_Vihkie" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1790266424" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488077, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GA25YVWWZN4AME3HS3OTPSDEAHC7DQXEQXFLZHDLCKONARU66ZGCXMUE" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA25YVWWZN4AME3HS3OTPSDEAHC7DQXEQXFLZHDLCKONARU66ZGCXMUE" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/DheTech_man/status/2100777511583961554" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789726163" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486558, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GA4DJDM66BZLZ54K7GLZFFPKGBNC44IPZSHMMZ6G7YY5TOQH3N5T5HAM" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA4DJDM66BZLZ54K7GLZFFPKGBNC44IPZSHMMZ6G7YY5TOQH3N5T5HAM" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Prof4477/status/2100853532995858540" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789718568" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490637, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GA6UANZSAIOSKXKPYXEYLHAUNTQOJNKUIKCPGFNU6RVVTPJDJJNHOJYH" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA6UANZSAIOSKXKPYXEYLHAUNTQOJNKUIKCPGFNU6RVVTPJDJJNHOJYH" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/NoniRichies29/status/2100922405573066838" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789738963" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490196, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GA6WVPSKHSY5SYBSQLYRQILALJRYDJKCJ24GMZVA3SW2BI3CBGHDKEN3" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GA6WVPSKHSY5SYBSQLYRQILALJRYDJKCJ24GMZVA3SW2BI3CBGHDKEN3" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/AndyonChain_/status/2100932254478340510" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789736758" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494878, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GADCI46FPSCQ4GWCJBXZYLPUTIIYV5OFR5JFRU7ABFMO4AH7W2ELUGAP" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GADCI46FPSCQ4GWCJBXZYLPUTIIYV5OFR5JFRU7ABFMO4AH7W2ELUGAP" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/De_crypto_proff/status/2101028956254429269" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789760168" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496863, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAHLSHD53JDVKMPIOZNB3GNKTQXYCLS6R6FYX2BGFEWDCBHV2JMHUCVK" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAHLSHD53JDVKMPIOZNB3GNKTQXYCLS6R6FYX2BGFEWDCBHV2JMHUCVK" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Web3banji/status/2100717656806433268" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789770093" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492538, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAJGJRHG6ISSURFHTMSG7SI3PVS5XVME7OJHOAMP7BRHASSIZQHUOS6E" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAJGJRHG6ISSURFHTMSG7SI3PVS5XVME7OJHOAMP7BRHASSIZQHUOS6E" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Ox_Immapro/status/2100980371441528897" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789748468" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485395, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAMH2GEVQXETLZGAFWMIU5RKXSRON5UFIMTWX3B7JMTJ7QG77C46RLNO" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAMH2GEVQXETLZGAFWMIU5RKXSRON5UFIMTWX3B7JMTJ7QG77C46RLNO" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Bruce2070391362" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789712753" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488726, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GANHXXHJWLACEFFSZJOQSTAZBBRV65F2G5CNS5J5YBOWROWIGUS4E3R3" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GANHXXHJWLACEFFSZJOQSTAZBBRV65F2G5CNS5J5YBOWROWIGUS4E3R3" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ExcellentDani/status/2100891658065760717" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789729408" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488312, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAOAE5MEJCCWMBAIKDGD64UBHUX73SE3EBVV7GW5UWJK6AHZSUWA6U6H" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAOAE5MEJCCWMBAIKDGD64UBHUX73SE3EBVV7GW5UWJK6AHZSUWA6U6H" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Teeweb3talk/status/2100823471416549569" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789727338" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493957, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAR3M54VVNPAC7TKQZVZZQTW5LLXV6UL56VAD3P3GVM4FQNTJNEI6WPV" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAR3M54VVNPAC7TKQZVZZQTW5LLXV6UL56VAD3P3GVM4FQNTJNEI6WPV" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ZUKOWEB3166/status/2101004932946047407" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789755563" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487181, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GARDPYJY3URSWQWU2CSOG4JQHBD3A2HK6EOQHUEPKDWYNNUPL4FDDWS7" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GARDPYJY3URSWQWU2CSOG4JQHBD3A2HK6EOQHUEPKDWYNNUPL4FDDWS7" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/shukakunara01/status/2100684594253009088" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789721683" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486032, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAUB4KOF5DQRW35B6Z6Q5ZBJNGCWZY5F55OFYDW5OD5A5FGPN5VPBEBJ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAUB4KOF5DQRW35B6Z6Q5ZBJNGCWZY5F55OFYDW5OD5A5FGPN5VPBEBJ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Boseni65/status/2100659601469329647" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789715938" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486860, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GAXWC6RGYLTDCLD52LLRUVTHW6RUE2QYTMSGGUMZMZBFAAZ4E4GTURSB" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GAXWC6RGYLTDCLD52LLRUVTHW6RUE2QYTMSGGUMZMZBFAAZ4E4GTURSB" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/rizqullaaah/status/2100864127476584849?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789720078" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493836, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBBIXKRKYU4XVEWEZPQ6XE4HUIEDI26OOCANJC37AJCUKYGQANFMEVI7" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBBIXKRKYU4XVEWEZPQ6XE4HUIEDI26OOCANJC37AJCUKYGQANFMEVI7" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/yocodedx/status/2101008393829749037" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789754958" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489872, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBCQCUF56FZ34A4LIFBUMSGQ3PD2HONTADI7OZVDW2LQ5I2NPHXE56UK" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBCQCUF56FZ34A4LIFBUMSGQ3PD2HONTADI7OZVDW2LQ5I2NPHXE56UK" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/dfwgreat/status/2100925808663478481" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789735138" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476491, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBDVM5H2HUR2UJU4U62H3AO3B3QA7XXRPOMJQYWKBJ2UT4G7CKKCHXRS" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBDVM5H2HUR2UJU4U62H3AO3B3QA7XXRPOMJQYWKBJ2UT4G7CKKCHXRS" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Seeemus/status/2100642210035204440?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789668233" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490869, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBFEMXAVBW2JSNVFQQKHWAKOAO2COIMZOIIKMRE6OL63R74SMSWFIZLI" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBFEMXAVBW2JSNVFQQKHWAKOAO2COIMZOIIKMRE6OL63R74SMSWFIZLI" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/empirepro_/status/2100912499105112153" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789740123" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495135, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBH5L3YEZICNEZV4GXJ6LYNG5TIAXRELYWZYBKUOZI5LOFO6CLUT5GPY" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBH5L3YEZICNEZV4GXJ6LYNG5TIAXRELYWZYBKUOZI5LOFO6CLUT5GPY" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Lucy_Lucie1607/status/2101032802024079671" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789761453" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488943, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBI7MHCOBO56HPIOJ4WBDZIAZB2WB3YBJYBZRLAWIOMSEKOMJTKNBMBX" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBI7MHCOBO56HPIOJ4WBDZIAZB2WB3YBJYBZRLAWIOMSEKOMJTKNBMBX" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/TanaMon22301744/status/2100896744892444843" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789730493" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476690, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBKJMLBPFWZTUVBJ5DFQJGJLDHR52JHJTAOO3JDPAILRTABKGR2A2UUY" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBKJMLBPFWZTUVBJ5DFQJGJLDHR52JHJTAOO3JDPAILRTABKGR2A2UUY" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/RohanShikder131/status/2100650173722685542" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789669228" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473717, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBLW2D4KJQTSPLMHBTQ3F7Q4W2KNJYPT7DUF5P3FVRIC63CZOQEHGPDQ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBLW2D4KJQTSPLMHBTQ3F7Q4W2KNJYPT7DUF5P3FVRIC63CZOQEHGPDQ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/DivFire11/status/2100584207462338739" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789654363" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489097, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBNAYCLP6TYGS3NLUCHUHWHCEKUNX3B5UQEMO3K5BH7ATG73JBV3XTXO" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBNAYCLP6TYGS3NLUCHUHWHCEKUNX3B5UQEMO3K5BH7ATG73JBV3XTXO" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/mickness_111/status/2100897620889661702" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789731263" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487831, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBNQO6SYESAPXFRZOOFJUMW7QQL2DSNAC3IQH2XWOGLPEE2S3SXSU77D" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBNQO6SYESAPXFRZOOFJUMW7QQL2DSNAC3IQH2XWOGLPEE2S3SXSU77D" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/MichaelOke39841/status/2100845876490981748?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789724933" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492418, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBP2P4JAKP7ASHKSOQABFRSV624LYNS45NE57ZOMUJD2E2ONBHP66MRJ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBP2P4JAKP7ASHKSOQABFRSV624LYNS45NE57ZOMUJD2E2ONBHP66MRJ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/MR_DY0R_Of_Web3/status/2100979873137201556" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789747868" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497312, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBPA53YAWB3I6CLSEPX6D6BG6SOTP6G7OJVSEPJ4QUTBHLTRWQC2YTEI" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBPA53YAWB3I6CLSEPX6D6BG6SOTP6G7OJVSEPJ4QUTBHLTRWQC2YTEI" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/HenryChris211/status/2101083191956165001?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789772338" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492339, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBT3QYFC2VJRKTWAW2JJ4ZGUSOSXJN4T4XHSLYCB7BSDRCQOA6YIATJG" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBT3QYFC2VJRKTWAW2JJ4ZGUSOSXJN4T4XHSLYCB7BSDRCQOA6YIATJG" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/kim_metaxl/status/2100977187457241569?s=46" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789747473" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486015, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBU5PAXAFBGLPYZRCWHUFFN77737DN6CVRSRQP67IBMTEX6ZP553UKON" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBU5PAXAFBGLPYZRCWHUFFN77737DN6CVRSRQP67IBMTEX6ZP553UKON" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/thefissha/status/2100761062568010048?s=46" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789715853" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476165, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBVFPIPPCXIW2GCUEA7WTOYZJ32VUYNO7GUZSB6DCAYV4G2IJ7JWS43O" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBVFPIPPCXIW2GCUEA7WTOYZJ32VUYNO7GUZSB6DCAYV4G2IJ7JWS43O" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/sesanlazarus/status/2100633653210464734" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789666603" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490051, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBVUU2XPZVGPNMOW7TDPI7CPJ2RL2EPD33AB2DZUZLIKGAVECTKIIFKV" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBVUU2XPZVGPNMOW7TDPI7CPJ2RL2EPD33AB2DZUZLIKGAVECTKIIFKV" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/DeGodman10/status/2100928568372887792" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789736033" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494483, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBWGHKRNC7CAR4FBY7FQTTTKEJGTPL2L6RTS7RIXDEPCIEG2ZXCEVF5I" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBWGHKRNC7CAR4FBY7FQTTTKEJGTPL2L6RTS7RIXDEPCIEG2ZXCEVF5I" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/aboy1134/status/2100856051742527721" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789758193" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496983, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBYXAGK76FXYNAD73E5W6O5UYD74MR4F6N74O5JHOSOMU7A5Q7Q2O6U4" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBYXAGK76FXYNAD73E5W6O5UYD74MR4F6N74O5JHOSOMU7A5Q7Q2O6U4" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/0xdanielonchain/status/2101072533902573859?s=46" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789770693" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473462, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GBZFPXM2L6ENBLXBPUOXTVUIXLTI4TRAZ6N52NP2FNWRER7R5ZETVSCG" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GBZFPXM2L6ENBLXBPUOXTVUIXLTI4TRAZ6N52NP2FNWRER7R5ZETVSCG" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/paduaHQ/status/2100582592575611056" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789653088" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487025, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GC3BD233YVEL4NVYZHQ2IHWQNNYJQTVDQGY3R357A77PU3KAO2RH2AUF" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC3BD233YVEL4NVYZHQ2IHWQNNYJQTVDQGY3R357A77PU3KAO2RH2AUF" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/lmyuunn34/status/2100867166916706800" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789720903" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494595, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GC5DALRCGWSK4PZDOK7I47EGJGEENNGBZMTBNQAZMPMPQKFYOKQYLW56" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC5DALRCGWSK4PZDOK7I47EGJGEENNGBZMTBNQAZMPMPQKFYOKQYLW56" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Digitalmonarch/status/2101022498523353322" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789758753" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489514, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GC75TVZ4HGQF7PF4LEAT5Y7OONTTGUQ2I275A6AOR5ZHRXQHYCREZRTC" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC75TVZ4HGQF7PF4LEAT5Y7OONTTGUQ2I275A6AOR5ZHRXQHYCREZRTC" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/AcidBlaq0001/status/2100901774487855587" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789733348" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485434, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GC7QUT5CLSK35R2C5JI4LP4P6W47K6RJJARZLPTLVLTJ34YVZIFRKLTY" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GC7QUT5CLSK35R2C5JI4LP4P6W47K6RJJARZLPTLVLTJ34YVZIFRKLTY" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Zinny_Edmund/status/2100696113116242047?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789712948" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489309, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCE4LIJFKVHC7DCFHMTAURZFHXT2EWUVDOFMTKGA7WDGZ7VVRSQYNUER" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCE4LIJFKVHC7DCFHMTAURZFHXT2EWUVDOFMTKGA7WDGZ7VVRSQYNUER" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/faizal_web/status/2100807192526143553" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789732323" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487065, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCFM2ROFIA7AGJ2UER2GVWIKTNWY6UZGYX46TP4FGX2CGJZZ643WVNJJ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCFM2ROFIA7AGJ2UER2GVWIKTNWY6UZGYX46TP4FGX2CGJZZ643WVNJJ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/musictus_62_/status/2100865193999737182" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789721103" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489534, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCIBOCOAT3JJJWEEGATGHLM4GFR75MDW5G66UXGLXKB27N5EOSKT3GFD" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCIBOCOAT3JJJWEEGATGHLM4GFR75MDW5G66UXGLXKB27N5EOSKT3GFD" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Chioma_Johnson9/status/2100915809887334531" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789733448" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497102, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCIFU4XBA4JFJNR5CJNDACNTXMTUCW5LU2XTZ5V6PYIGQF7MIQEYGUDH" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCIFU4XBA4JFJNR5CJNDACNTXMTUCW5LU2XTZ5V6PYIGQF7MIQEYGUDH" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/oceetarh/status/2101077582326448189?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789771288" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496005, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCIR3QJXGKOTEDVBNFAJOG7WZ6CWI7NYAHWYT67F5CD7ARKXYWRF3LAD" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCIR3QJXGKOTEDVBNFAJOG7WZ6CWI7NYAHWYT67F5CD7ARKXYWRF3LAD" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/LexanderOfX/status/2101054658953224409" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789765803" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488254, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/i/status/2087316983565971699" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789727048" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487661, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCN5RTDME54YCDS4LJYWDGX3ASD6MYURMVGAYPV24LWW6KYWYDMDZKWQ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCN5RTDME54YCDS4LJYWDGX3ASD6MYURMVGAYPV24LWW6KYWYDMDZKWQ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/0xAndreeee/status/2100879195765121291" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789724083" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494603, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCPXZWNP7AD3MVOLQFKVCDMXITHI6ZX4LL5JYLS4XQNPEVTF7CCKXYMV" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCPXZWNP7AD3MVOLQFKVCDMXITHI6ZX4LL5JYLS4XQNPEVTF7CCKXYMV" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Wendy_rohsee/status/2101024992062300571" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789758793" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490914, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCQ5VQGWHOKPR5MRI52TJNLOGJMQGXHI34FICOV47G2Y4NIDHPVDFR7G" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCQ5VQGWHOKPR5MRI52TJNLOGJMQGXHI34FICOV47G2Y4NIDHPVDFR7G" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/PascalIfec43229/status/2100732392826716423" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789740348" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494941, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCSYQ5IDWYTRFX36UAIUOLG6TNWPKTP5MJ73FLV5R4ETQ6BQORU6M4FI" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCSYQ5IDWYTRFX36UAIUOLG6TNWPKTP5MJ73FLV5R4ETQ6BQORU6M4FI" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/just_alphas/status/2101028104957218934" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789760483" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494335, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCT5HH53MXGEX7OQCPRBM5VBYPWMXFTS7VFIAA77K2UDSOGXZONH35CK" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCT5HH53MXGEX7OQCPRBM5VBYPWMXFTS7VFIAA77K2UDSOGXZONH35CK" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Girlnamedresa/status/2101018362344063047" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789757453" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495900, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCUKGEAU7QNUFG4CRDNJZYUA2XR3AETEVS6MDH3GF5DY5LOEYC6HDQTD" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCUKGEAU7QNUFG4CRDNJZYUA2XR3AETEVS6MDH3GF5DY5LOEYC6HDQTD" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/mfoursevenxbt/status/2100689082632605774?s=46&t=nCWOf2MemQbjofWzsPWX6Q" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789765278" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473381, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/malvinsdev/status/2100579676976537749" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789652683" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64471299, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCX3NIFZEBAVU6DHZ4O4ZVJYTEMVBFDXVHX6V6PV2N4EYPCRFBP7GW3X" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCX3NIFZEBAVU6DHZ4O4ZVJYTEMVBFDXVHX6V6PV2N4EYPCRFBP7GW3X" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ss_osmond" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789642273" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492881, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCX4YJNRMCNCXBH3DGZ7HWAXXLXFBRSJWU7BNNSEDMREYSGL35I2AN5H" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCX4YJNRMCNCXBH3DGZ7HWAXXLXFBRSJWU7BNNSEDMREYSGL35I2AN5H" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/chiinaza0x5/status/2100990399514824920?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789750183" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488014, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCXEAJ7WYM5ZR5O56OHCMWGKCHRSGOJJVRGSCVNNLSENQXDAGIVPSU72" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCXEAJ7WYM5ZR5O56OHCMWGKCHRSGOJJVRGSCVNNLSENQXDAGIVPSU72" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/RealPleasureB/status/2100874334549995799" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789725848" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492073, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCZ5BVJDG7OVI6GUEA3GPBGQLMJLSJVAFND7QWZUEC4KDYMB5HSA2SFB" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCZ5BVJDG7OVI6GUEA3GPBGQLMJLSJVAFND7QWZUEC4KDYMB5HSA2SFB" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/0xkrypt0n_/status/2100971062137614442" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789746143" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492234, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCZINFPZ33TOWAMT4A52UU7P5ZZURRYFQUHP2N3RSSKVGXHX6AWDWCOD" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCZINFPZ33TOWAMT4A52UU7P5ZZURRYFQUHP2N3RSSKVGXHX6AWDWCOD" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/NnajiChidi11451/status/2100976453298889080" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789746948" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64478096, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GCZJMNAUIQ2U577P4RA6JQNRX6LABXZGQWBCJAKERN46GU457K6C3GQW" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GCZJMNAUIQ2U577P4RA6JQNRX6LABXZGQWBCJAKERN46GU457K6C3GQW" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/adex2berry/status/2100637824370270631?s=46" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789676258" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472987, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GD4UNF3UMYMI3NA4RZGPRYIDELND3RAS2LV6LTJKNKWHBAZVSI4GELOG" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GD4UNF3UMYMI3NA4RZGPRYIDELND3RAS2LV6LTJKNKWHBAZVSI4GELOG" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/ngozi_miss/status/2100566616379400491" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789650713" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493736, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDBY6AK3PTYQFDF6L3AV2RQE74V3KSKVJAT7GEV6TPCX3KQ7C6QCKPZD" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDBY6AK3PTYQFDF6L3AV2RQE74V3KSKVJAT7GEV6TPCX3KQ7C6QCKPZD" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/dexter_042/status/2101007197882700279" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789754458" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496873, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDC7HWCF35MCND4IJBTSVBOAKR4BG2HI45R345ERWFQGML2HS7KGGDLQ" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDC7HWCF35MCND4IJBTSVBOAKR4BG2HI45R345ERWFQGML2HS7KGGDLQ" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/iampreshie22/status/2101074077645455378?s=20" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789770143" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497293, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDENLMKPPVI7HYVJWRJIB6Z2AAIQNUKT7VSG6VJW4WGR3VAC5MAY6IQL" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDENLMKPPVI7HYVJWRJIB6Z2AAIQNUKT7VSG6VJW4WGR3VAC5MAY6IQL" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/zuko_Writes/status/2101082541579018625" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789772243" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492556, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDGNENZ4B2HIZOXO2LUVTI4MC3HIT6LWOX2LAMTMGSGQ57MSFE5ERJIT" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDGNENZ4B2HIZOXO2LUVTI4MC3HIT6LWOX2LAMTMGSGQ57MSFE5ERJIT" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/_Emmgreat07/status/2100974997799875022" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789748558" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64491030, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDGU3HWNHGZX3T7LERAOCP73TYESCPT6QYOXNBY7JPYWIM6WKJWHSFCI" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDGU3HWNHGZX3T7LERAOCP73TYESCPT6QYOXNBY7JPYWIM6WKJWHSFCI" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/KChukwukanne/status/2100944909519778100" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789740928" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497108, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDGVNX64C46N2RGQ7E7EW4RKBG6PZ54MPWSWSSOYZA2LVSLY3NXBSC6R" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDGVNX64C46N2RGQ7E7EW4RKBG6PZ54MPWSWSSOYZA2LVSLY3NXBSC6R" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Just__Rosey/status/2101075265556488194" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789771318" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489740, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDI3IFSW6CZNMF7XMBME6YYUDBE34UQ67QZR64PNRIJSZUR6YFH7UI5L" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDI3IFSW6CZNMF7XMBME6YYUDBE34UQ67QZR64PNRIJSZUR6YFH7UI5L" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Alagbax/status/2100907019506983004" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789734478" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486173, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDJTYHSIWQG35TO6YFFJ6GB4RWFFJH4FMWQNG6BW7DGXHBIWESZXY66S" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDJTYHSIWQG35TO6YFFJ6GB4RWFFJH4FMWQNG6BW7DGXHBIWESZXY66S" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/mavrix006/status/2100847746294976734" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789716643" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490239, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDK2HMIISZ4B5RR5EEA726OJEVRQHHZJHDM7SVB2Y7K5XCRI33QIVU3H" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDK2HMIISZ4B5RR5EEA726OJEVRQHHZJHDM7SVB2Y7K5XCRI33QIVU3H" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/INvioneL8B8/status/2100622241448985035" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789736973" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486074, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDKMSQYPV3M2ZOZ6ELXDVQF5YWYEZPJIQA2XODJOGHZ57PE2XAD3BD7O" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDKMSQYPV3M2ZOZ6ELXDVQF5YWYEZPJIQA2XODJOGHZ57PE2XAD3BD7O" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/victorben001/status/2089830296585720175" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789716148" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490478, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDL7S4G5BGQECSBNGAVTLMZTICV5MSO5GNPRZBNJEWDXWR5NENHUEM3U" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDL7S4G5BGQECSBNGAVTLMZTICV5MSO5GNPRZBNJEWDXWR5NENHUEM3U" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/divinesylv1r/status/2100935055388406266?s=46" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789738168" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475733, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDLVB47EHGB6DBTAZHC24N5VGC5B5JGAG6NTBJ3O23JXLONDWLIQVJVL" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDLVB47EHGB6DBTAZHC24N5VGC5B5JGAG6NTBJ3O23JXLONDWLIQVJVL" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Haseeb_eth/status/2100627552536789344" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789664443" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486469, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDMHMOM65BWYHVYJRXPYDCSXT4WPP2XMZC6OR5V3NFNJWUEXQR4YPUX7" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDMHMOM65BWYHVYJRXPYDCSXT4WPP2XMZC6OR5V3NFNJWUEXQR4YPUX7" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Zeal322779" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789718123" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475488, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDO3D2K3TFJSEB7GFKMUGXVCFFIEXRGNPXZTRJ27KQLYEZDDCOBUZV74" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDO3D2K3TFJSEB7GFKMUGXVCFFIEXRGNPXZTRJ27KQLYEZDDCOBUZV74" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/SolomonBuildsX/status/2100623240280375770" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789663218" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDOJ3XPIAHCYG26SGBSJY6KJDIATCNHEIV7WGFVL7WAY5XX2KRDVA47Y" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDOJ3XPIAHCYG26SGBSJY6KJDIATCNHEIV7WGFVL7WAY5XX2KRDVA47Y" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/jonahemman27246/status/2100993134448521387?s=46" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789751718" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64491524, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDOR4CPOMWGJIYUKLHUAWG6YKG5O54W6QXU4W6HSB5I7UIZ3GK3LFGDX" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDOR4CPOMWGJIYUKLHUAWG6YKG5O54W6QXU4W6HSB5I7UIZ3GK3LFGDX" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Haideedotxyz/status/2100915841709514796" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789743398" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492868, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDUYVERC6QT6QQZ3SCBIZYRAJH6E42JZQHUFG6F46Z4Y2OM27BK4WO53" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDUYVERC6QT6QQZ3SCBIZYRAJH6E42JZQHUFG6F46Z4Y2OM27BK4WO53" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/iam_rejoice1/status/2100983139619180888?s=46" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789750118" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492654, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDWVOFFYGIYWYTRKPXMNUES7NHAJWEUKEUL423DE36R23TAJO5Z7Q6LT" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDWVOFFYGIYWYTRKPXMNUES7NHAJWEUKEUL423DE36R23TAJO5Z7Q6LT" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/Kingwithchrist/status/2100985302097531282" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789749048" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493104, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDXURAFHE27EXW2L2HE4PQIWJEO7MXNROPZBSZ4XO2HQWTDNA4REUD4U" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDXURAFHE27EXW2L2HE4PQIWJEO7MXNROPZBSZ4XO2HQWTDNA4REUD4U" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/LindaCBlanding" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789751298" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485241, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventSubmissionEntry" + }, + { + "u64": "271539957145796616" + }, + { + "address": "GDYKGYYSOGYXBOIYOOO5MNZKVT537H3C2T35UIIXWKVXTZRLOKR7DTS5" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "applicant" + }, + "val": { + "address": "GDYKGYYSOGYXBOIYOOO5MNZKVT537H3C2T35UIIXWKVXTZRLOKR7DTS5" + } + }, + { + "key": { + "symbol": "content_uri" + }, + "val": { + "string": "https://x.com/nothing__web3/status/2100828388466245984" + } + }, + { + "key": { + "symbol": "submitted_at" + }, + "val": { + "u64": "1789711983" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63718136, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventUnclaimedPrizes" + }, + { + "u64": "271539957145796609" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 0 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63841346, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventUnclaimedPrizes" + }, + { + "u64": "271539957145796610" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 0 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64744258, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventUnclaimedPrizes" + }, + { + "u64": "271539957145796612" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64725863, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventUnclaimedPrizes" + }, + { + "u64": "271539957145796613" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 0 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599980, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventUnclaimedPrizes" + }, + { + "u64": "271539957145796615" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 0 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609068, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventUnclaimedPrizes" + }, + { + "u64": "271539957145796616" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 0 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63718136, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796609" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "100000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1785414323" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GCPX5J4CXKA7KFIJEGUIR63SR6CKQIEGBFSAALMFLE5IURDHXJ66KFKL" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63840956, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796610" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "600000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1786104295" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GBKA233FZEZ3QIZVY4BH5IO3UZMZQV7UHPCJVXB4FYCMEYBUSPRYB3DA" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63841346, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796610" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "400000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1786106486" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GCFRGHJSLBUIN536Y2K4Q5KGKE2AXSZPQZW37ZH62VCYD2XSEWBNZWNO" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64717681, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790874187" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GDJUY3N2IVMYWPWL5CHEIGQHSMBQROELUHF4QTIMC56GVO27FLKDEPUS" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716248, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 10 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790867022" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 11 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GCFZKKIYA4QFR2H2QZZ4QHRPZBUU7XRILEQHNYB2FTYRSP7XGP6F645Y" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716227, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 11 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790866917" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 12 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GC3Q4CJXKLYESHLL4C34CT3ENOT4TXDO3W4PRIQ3C7TC4FHTRAQ5S37J" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": "void" + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GAF6ML2FAQIT7GPP74FRUH4DDEOIMPJENDKBJLMAEHY37B7RTEBTIYOP" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716417, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 2 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790867867" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GC7PKCYZRRDRT6HBGPPON4NKQGHKNJJJQ7JN74TM5XBHFH7JBVI7LBR6" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716661, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 3 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790869087" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GB4O24QI4GT65UXRBH2ZVXPKDCS3HF7UXSCW4ZBU4JUE52RAS7OS7GNH" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716274, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 4 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790867152" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GDNWNV2PBY54YRL45GVHRDHA737SEPL6BZMAKRI2IDRKUEP56GERIHDT" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716883, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 5 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790870197" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 6 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716336, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 6 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790867462" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GA3NAZYKIAQWJHXCUORX3FUXZCCMWRFIKJFEDMLEUFMCWELYD2LCDWON" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716395, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 7 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790867757" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 8 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GDQRHRIHCEFBBBGV25MVVV4CPOZKGC3L2WE2VEAJP5YU3MGYSXU472DT" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64744258, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 8 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1791007072" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 9 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GAJOAYF7JRQNPAFECS7SDYAKPPZHEUVSDMHFHPKYWYWECIDAMTTFUBRW" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64731045, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796612" + }, + { + "u32": 9 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790941007" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 10 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GDGZXEANOXIJRO5CGHDUTWDARC43OBEFWZF2ORWCMGTMQD6OELJ5VQPF" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64718487, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "2000000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790878217" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GDHEFAG7XPZ4UZXDT7OT342PYTCF7OQQ34LZJNOWK5CLRLTLXJAYENKI" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716452, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1000000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790868042" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GB2DG2EQGAUIW6VFQ5I62RMXJBWUBAKYBKCY77Z7UEJUCYHX4IPEGEOA" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64725863, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 2 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790915097" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GBZIEOJ4VXBSNSLQQ73ZXLACAOU7PNR3JIOMT33PYE46UTB47PLIYIPC" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64720595, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796613" + }, + { + "u32": 3 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790888757" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GBMFSMT3OK6T7LOWJBINEAGN7W26GLOCAFOV5GQU2ORSHI6Z2SBFP3OM" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599968, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796615" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "2500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790285619" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GD4N2RWP2GD6I22O2MVUGTSEBGVLFR2XIRC5OHIQ7K6EDPOJRSHAZRXM" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599968, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796615" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790285619" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GDUW2GJIT56XTAEF4ACXDO7PFUXE37JDZXS5OOMO73UEUZD7BXALKZ2K" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599980, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796615" + }, + { + "u32": 2 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1000000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790285679" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GC5P3MKC4MK5IE5IJYQVLPS6EVSHMYUPOYWPS6AAQQ7FUEF32G3H4TRJ" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609068, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790331119" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GC5DALRCGWSK4PZDOK7I47EGJGEENNGBZMTBNQAZMPMPQKFYOKQYLW56" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64605481, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790313184" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GCE4LIJFKVHC7DCFHMTAURZFHXT2EWUVDOFMTKGA7WDGZ7VVRSQYNUER" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64600105, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 2 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790286304" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GCN5RTDME54YCDS4LJYWDGX3ASD6MYURMVGAYPV24LWW6KYWYDMDZKWQ" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599931, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerAt" + }, + { + "u64": "271539957145796616" + }, + { + "u32": 3 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "500000000" + } + }, + { + "key": { + "symbol": "milestone" + }, + "val": "void" + }, + { + "key": { + "symbol": "paid_at" + }, + "val": { + "u64": "1790285434" + } + }, + { + "key": { + "symbol": "position" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63717877, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerCount" + }, + { + "u64": "271539957145796609" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63840900, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerCount" + }, + { + "u64": "271539957145796610" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 2 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerCount" + }, + { + "u64": "271539957145796612" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 12 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716191, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerCount" + }, + { + "u64": "271539957145796613" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 4 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599965, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerCount" + }, + { + "u64": "271539957145796615" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 3 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599439, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "EventWinnerCount" + }, + { + "u64": "271539957145796616" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 4 + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63716776, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "NonOwnerContributionTotal" + }, + { + "u64": "271539957145796609" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "0" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63718330, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "NonOwnerContributionTotal" + }, + { + "u64": "271539957145796610" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "0" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64164377, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "NonOwnerContributionTotal" + }, + { + "u64": "271539957145796611" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "0" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64210275, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "NonOwnerContributionTotal" + }, + { + "u64": "271539957145796612" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "0" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64210292, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "NonOwnerContributionTotal" + }, + { + "u64": "271539957145796613" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "0" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64440680, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "NonOwnerContributionTotal" + }, + { + "u64": "271539957145796614" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "0" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64457345, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "NonOwnerContributionTotal" + }, + { + "u64": "271539957145796615" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "0" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460331, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "NonOwnerContributionTotal" + }, + { + "u64": "271539957145796616" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "0" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716336, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GA3NAZYKIAQWJHXCUORX3FUXZCCMWRFIKJFEDMLEUFMCWELYD2LCDWON" + }, + { + "bytes": "7df45e73e1f1ca2a14c8ba51be5d2cfef64e9eea2c285be8a47f29ee5460fe2c" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716188, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GAA6HG7FCNPKSS6CQLN27GUIMWJJMLDCSBF64G5QWM4HH536KABLFD4Y" + }, + { + "bytes": "f31a7387db05aa230cad42fe88e688a01204efdee24c35dad7e61f4305ed2d92" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716191, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GAA6HG7FCNPKSS6CQLN27GUIMWJJMLDCSBF64G5QWM4HH536KABLFD4Y" + }, + { + "bytes": "faacfd79449f482be0fd1fcd79b52c9ec1e5d443b3344a0bc371ad693198d898" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64744258, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GAJOAYF7JRQNPAFECS7SDYAKPPZHEUVSDMHFHPKYWYWECIDAMTTFUBRW" + }, + { + "bytes": "2a985dfec5725f2b39ecd7d80d4b3918371094b07cd192228a6bf6c8afbfeebc" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716452, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GB2DG2EQGAUIW6VFQ5I62RMXJBWUBAKYBKCY77Z7UEJUCYHX4IPEGEOA" + }, + { + "bytes": "817334f6619850a492a30016f581065f46a8d50a72ad9de37e262ec657038205" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716661, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GB4O24QI4GT65UXRBH2ZVXPKDCS3HF7UXSCW4ZBU4JUE52RAS7OS7GNH" + }, + { + "bytes": "56fde4b86b5368984c68f7d66509fea53d53ff59c59bd9c5bc1623ee6b5dd173" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64720595, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GBMFSMT3OK6T7LOWJBINEAGN7W26GLOCAFOV5GQU2ORSHI6Z2SBFP3OM" + }, + { + "bytes": "7d6d9f14d881d4353ee8d95b1301e39f9f84d577f58168c71eab9f401f6bdebe" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64725863, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GBZIEOJ4VXBSNSLQQ73ZXLACAOU7PNR3JIOMT33PYE46UTB47PLIYIPC" + }, + { + "bytes": "d16b2d324b714b5e9f7f32679d82b734f79b95fcae3c862a85862cf10ae6e2b9" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716227, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GC3Q4CJXKLYESHLL4C34CT3ENOT4TXDO3W4PRIQ3C7TC4FHTRAQ5S37J" + }, + { + "bytes": "6967139714f2257e15279f0bcfbbb9a511ff9aa31345f0eb0d91d21603613fa5" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716417, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GC7PKCYZRRDRT6HBGPPON4NKQGHKNJJJQ7JN74TM5XBHFH7JBVI7LBR6" + }, + { + "bytes": "b8707f7958a6f9dce24330631cc5e7bca2a461d93961c0f1f5dcfefc40b21254" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716248, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GCFZKKIYA4QFR2H2QZZ4QHRPZBUU7XRILEQHNYB2FTYRSP7XGP6F645Y" + }, + { + "bytes": "9d3b2a9bd6b7e85b73cc3e11ba3e00b7181bc9a0fd66979059f37b5c00673e2f" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716883, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + }, + { + "bytes": "38496d6edbdcfd55cb10d91ec919b96491cfbc3720d08913bc1675ce2348fb61" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64731045, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GDGZXEANOXIJRO5CGHDUTWDARC43OBEFWZF2ORWCMGTMQD6OELJ5VQPF" + }, + { + "bytes": "5d0047ed8b56184af933efb74fc34a0038cf02bcaaff208bdaeca4a23e2a5d16" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64718487, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GDHEFAG7XPZ4UZXDT7OT342PYTCF7OQQ34LZJNOWK5CLRLTLXJAYENKI" + }, + { + "bytes": "643855ab1d882ef7ce2bdb6db9ab4d369ed4777cf80cacdec75a8d3c5e520ca9" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64717681, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GDJUY3N2IVMYWPWL5CHEIGQHSMBQROELUHF4QTIMC56GVO27FLKDEPUS" + }, + { + "bytes": "72bbad2f49ae72c2589412d25e0664000f5db8d0209f741402b04443ffb4d26e" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716274, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GDNWNV2PBY54YRL45GVHRDHA737SEPL6BZMAKRI2IDRKUEP56GERIHDT" + }, + { + "bytes": "9a3044b18b16793d948cb4de9c7ee78840e03e5668ed71e464062962bb379ee0" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716395, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GDQRHRIHCEFBBBGV25MVVV4CPOZKGC3L2WE2VEAJP5YU3MGYSXU472DT" + }, + { + "bytes": "5606e5d2deee036395be7bfb68030ec33c93c6fe81a9bcc01ff8b190bb1cdaeb" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64028245, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "6b4804920a4068dfdcaaa711fac6390850e0a92f4b5ed4e46259694b61cbae12" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "GCVK72I6TVJVDTTY4UKU6MQT4QJ2T2AAG3NULNEUDM46L3UOQYDSO4O2" + } + }, + { + "key": { + "vec": [ + { + "symbol": "DefaultBootstrapCredits" + } + ] + }, + "val": { + "u32": 10 + } + }, + { + "key": { + "vec": [ + { + "symbol": "DeploymentSeq" + } + ] + }, + "val": { + "u32": 63222664 + } + }, + { + "key": { + "vec": [ + { + "symbol": "EventsContract" + } + ] + }, + "val": { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "string": "1.2.0" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716336, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GA3NAZYKIAQWJHXCUORX3FUXZCCMWRFIKJFEDMLEUFMCWELYD2LCDWON" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64744258, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GAJOAYF7JRQNPAFECS7SDYAKPPZHEUVSDMHFHPKYWYWECIDAMTTFUBRW" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716452, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GB2DG2EQGAUIW6VFQ5I62RMXJBWUBAKYBKCY77Z7UEJUCYHX4IPEGEOA" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "1000000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716661, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GB4O24QI4GT65UXRBH2ZVXPKDCS3HF7UXSCW4ZBU4JUE52RAS7OS7GNH" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63840956, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GBKA233FZEZ3QIZVY4BH5IO3UZMZQV7UHPCJVXB4FYCMEYBUSPRYB3DA" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "600000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64720595, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GBMFSMT3OK6T7LOWJBINEAGN7W26GLOCAFOV5GQU2ORSHI6Z2SBFP3OM" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64725863, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GBZIEOJ4VXBSNSLQQ73ZXLACAOU7PNR3JIOMT33PYE46UTB47PLIYIPC" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716227, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GC3Q4CJXKLYESHLL4C34CT3ENOT4TXDO3W4PRIQ3C7TC4FHTRAQ5S37J" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609068, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GC5DALRCGWSK4PZDOK7I47EGJGEENNGBZMTBNQAZMPMPQKFYOKQYLW56" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599980, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GC5P3MKC4MK5IE5IJYQVLPS6EVSHMYUPOYWPS6AAQQ7FUEF32G3H4TRJ" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "1000000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716417, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GC7PKCYZRRDRT6HBGPPON4NKQGHKNJJJQ7JN74TM5XBHFH7JBVI7LBR6" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64605481, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GCE4LIJFKVHC7DCFHMTAURZFHXT2EWUVDOFMTKGA7WDGZ7VVRSQYNUER" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63841346, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GCFRGHJSLBUIN536Y2K4Q5KGKE2AXSZPQZW37ZH62VCYD2XSEWBNZWNO" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "400000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716248, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GCFZKKIYA4QFR2H2QZZ4QHRPZBUU7XRILEQHNYB2FTYRSP7XGP6F645Y" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599931, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64600105, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GCN5RTDME54YCDS4LJYWDGX3ASD6MYURMVGAYPV24LWW6KYWYDMDZKWQ" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63718136, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GCPX5J4CXKA7KFIJEGUIR63SR6CKQIEGBFSAALMFLE5IURDHXJ66KFKL" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716883, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599968, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GD4N2RWP2GD6I22O2MVUGTSEBGVLFR2XIRC5OHIQ7K6EDPOJRSHAZRXM" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "2500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64731045, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GDGZXEANOXIJRO5CGHDUTWDARC43OBEFWZF2ORWCMGTMQD6OELJ5VQPF" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64718487, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GDHEFAG7XPZ4UZXDT7OT342PYTCF7OQQ34LZJNOWK5CLRLTLXJAYENKI" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "2000000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64717681, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GDJUY3N2IVMYWPWL5CHEIGQHSMBQROELUHF4QTIMC56GVO27FLKDEPUS" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716274, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GDNWNV2PBY54YRL45GVHRDHA737SEPL6BZMAKRI2IDRKUEP56GERIHDT" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716395, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GDQRHRIHCEFBBBGV25MVVV4CPOZKGC3L2WE2VEAJP5YU3MGYSXU472DT" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599968, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "EarningsByToken" + }, + { + "address": "GDUW2GJIT56XTAEF4ACXDO7PFUXE37JDZXS5OOMO73UEUZD7BXALKZ2K" + }, + { + "address": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "1500000000" + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716395, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "01db3d43a288d7230c6ea0b4d622b23008a04219f6991d4de308ff89e4e6b58f" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64744258, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "125c0ba8599d511281f35bf56dd29b475381b167c1052da423b41d69d1792612" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64717681, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "249d432a5047200e2955d03145eee3e810ee63724d9184a6ee28731ffab48464" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64720595, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "279722735b0a419d060cf41ae52b499e9fc5a470e290321726dda4c2dcfe15d6" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716661, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "294d150cc065abca649339c2df7095a04acc47a9bdf005b36f92b0506ceab9af" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716452, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "2c02954e79eef64bd70cb5bce96f0103e3769ca1ffd390f223b2b6120fc4dd5d" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716395, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "2e4bb173893517d37982de249b1934f761712990043520257ca9a545ccfbad72" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64717681, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "31e402693cb5e05fe9dbac358ccf16835b281663fe64317d1d8f5c510f37f085" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64731045, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "3820ffdeabc365bba5f584fc498c92c386738fe0a2b8d73622dc503f65262774" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64731045, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "3bad368bff93e88e28d24d4cda9b3ffb26d19c1739655aa2038ad21447d648f1" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64744258, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "410a3ee873bbc8ebdf69a61036f393e4a2640060e13e59abacf96914eb460653" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716417, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "43cfdf3400d98214e4c01e6678692ca06b5f21bce53c74a77e9010bc8f7b6d69" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64717681, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "4472e2b7611d9b15ce02c6932ddb43e94ea46d2a204b90529b19b15c5e608153" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716274, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "4ca4cc75029684ddbd0488b4155ebd873f30f046c864cc645ba641d4335ea574" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716336, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "4d388f80c3623386f79fc128a7f6c5cd3e3f4f69fa5fd0e2b99d6b1cd1842ce9" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64718487, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "504cb81d1d84971bdfa07bab7a5a841792f03bd5657fb2338d8d69c282a6d791" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716336, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "5073b34e344879a5c4492913d6809f83c9483438e681ba37df2705674d6f2b1f" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64731045, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "54ddcb7e326f503f0aea8e3c751b4d3ca5724b211dddc17c3e435b969e239764" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716274, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "563fe23cbca992539e9844c1820e8c86ddaa919cb18be05ca375297d674bae14" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716883, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "58d393a0715bf36ce4d40dbd39c351348be014b7f4749f9a52cac2ba603cd42a" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716883, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "5ad4ef7ddaf2a216fa4a662c4e0c82c2ab73e491627d1131eaeeeed6e20bfa21" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64718487, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "5c0e35594022bf9bc28d5010ffa97ab7048e83433e770a539894d475e9c40f4b" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64718487, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "5c1ed3efa4a27be76d59ba750d43a786bb63639e666305bdf6ed65857137ba82" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64725863, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "621f2ba6c0a78f51d784b0b4f02ffd4dbb790d547b6c1e48b491305704db4523" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716883, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "623c7a04f3bd791672d53918d9884a54b433c73ed7bbbfef9fac6f93028e7a9a" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716227, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "667f927324162e7f95272e655700bab769d246419022f9012e03507c4fb84463" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716274, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "7aa4fcd3db61739fdb517bdbd72f62704eb6ca7c0982b8592445ed5c9da6efc0" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64744258, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "8626eade51da81fe77ca224f38b4e8927fd0fcd900be9cd02a57e4691efa1b73" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716227, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "97c9a4868c91b4c181971827b41dcb7f8bb14d6499c893bb73e615f60f4016c1" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716417, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "99760919238dd783d423ba2115a47e6902144a2889d58405c8dfba4faee6c365" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716417, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "a20cd48eb093fff7ccad6eb96193597910dd3ecc5d5457c2e15c492d4879e9b1" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716661, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "ae78d278c7495b4a2a47a2e898f652345a705c403cb3ea52fe5dcae81003a2b6" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716336, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "b27732042ae65d0805423bb14ce591472e398933ec76adfab67db92915114640" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716248, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "bb1dfae0725378e5056f234e49adfec390d9e5efb847cf749d1bd995d77f4ee9" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716248, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "bdcf5f7e78ac69557b72a7e270a49a26d58854483347f8099f58bdaef57b9c13" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716661, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "cbf0696e7b5e200130091b0a3f9953af63fa8f041f50caba11fc2297ac488eb1" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716248, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "cf8f3f2f8cf60940d7f76fa94f28ce34766db07b2a96e37487cd42f813a9fe63" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716452, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "d032a0ddea7507fa3e2db42b9dd40970eafab2aa43c8abe145d981b065845576" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64720595, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "d588079c030cae697c6ae8074d66dbe80e57b3f7e0aa046dc2956ac2526be065" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64725863, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "d7c0810e175d3f2fb170afa4bab5ed5021f5b3b520e5827518d0e2226fdb5257" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64725863, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "e715d21575527897d01df64aadb1aead89a70494f5e6418a1b564c30927026cc" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64720595, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "ea6eae11b69cd20344f70d7f0d0951864de7a819252f151451acbd91d391bb58" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716395, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "ee71cf8ac795827fd4853de0a89fdbb2bbda8c073c937b3fd5f4982abd8dc864" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716452, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "fe3ef87f87aa7e43de0a2d25062b5ce792efe814c12af4cfeb1513f0ec6d6402" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716227, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ" + }, + { + "bytes": "fe58d0aafbd59de36b532a84555965aa667d6b58fbbcb04ed0d64ea450e6d749" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64733458, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GAJCILKZETMMCXMNJXBBFZ5ZVAFHXVGPQSMXY6U7YDX6UCSZN4VMJGU6" + }, + { + "bytes": "281acc48a1071a5174ce468e3e891db8aa5097ab475a10288a2e27458b39d225" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64721118, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GARFFI5UVYEUMHDJY24KWDFU7R737JF23JUQSN5BIOUHS4BAEIJO6MEV" + }, + { + "bytes": "2d6258a6c0a924cdd148d624afd05fb0bebbe2816416e14290a0527d50ce9b7c" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64720408, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GBOEU2VQWDUHUZSH3CBUEFHROAL3DTENFW6ENLQY6J3LCV2YPLVDDLHD" + }, + { + "bytes": "773e3f8e6dbcc5ec5b31aff5a87000b443286a6ad90f8a63836b96962efffc19" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64717103, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GBVKX7526IBKIH4FSFXHNSUUIWW5H7YK7URYGFDR62C622BC62WBFEIF" + }, + { + "bytes": "120b565bef566f799b952e0c6c1bc13ae341cdfc2822bd0b5f13439bef1f3188" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64730224, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GDFGP2CRVW27SRQWQWVEM2A6OFCJEC45LSYE6ZNBQBHLFYMM2R5KDMEQ" + }, + { + "bytes": "f5303ff9aea56e0fad139ef2deaeb7a5aa9f36f06074f9a01d83e75997d536f1" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64726495, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GDN6VFHTBQN46TDAGZYUZYZZQ7HLH5VPG6W6ZCVCBHASWZMHRUYLTYFV" + }, + { + "bytes": "bc87f63cabbacad5e8f9e8e5ea8e50f037f3521073455f2644f606a8db17c6f5" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64703375, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GDQ5KKVQDXPYAFQ7H4YG4G7W2NJ5S3UDV6MN4EICCTUXHQJ5GRAPGALV" + }, + { + "bytes": "aeed3b6b7151731d9b66f593b1dcad83aa866b46e5f7c0f515e719ad79e985d4" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64700907, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GDQKNUFEA33EKGNDKZ5W5PSRLADVF7563RLJW2MBCLS5WAQVOGQUI6SF" + }, + { + "bytes": "cd86f0cc0627a354d521c9d4aacd65851e7bcc8beedebdf3f6052941278f9bfc" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64715256, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "OpSeen" + }, + { + "address": "GDRDXLBZN6SOXMKXIUNRWNJTMHBNYMCL4666LOZATBLFYYFM2RQMLXIF" + }, + { + "bytes": "70a739b3ace269e39e17219df69144d8a41b411ecb80419ef7f4994ae89df124" + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64418211, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA224ZNNKZKU7AX3UOOLVDWMMSYRXDHDKESM2YS3KVO52URJDCNMLKFY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789352850" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64571411, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA25XFBDROFS3V53RRGHGN5IY2LQFP3HO4IFSOZS2SAAQA4DEJ7JHWX4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790142833" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64477298, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA25YVWWZN4AME3HS3OTPSDEAHC7DQXEQXFLZHDLCKONARU66ZGCXMUE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789672268" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426561, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA2CWWXT26Q4TNNRHRSV674ZF6OWCNDW5JAGEEJD2FB3CBDKXSEVLWNU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789399597" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64477734, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA2GIMCLGYM3ZXD54DEOC2LHTS47DQTZS5PKKBFQQUUNZO7DYEU2YFOF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789674448" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425558, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA2MMWELTIH5IUJE7CWK6AW7EAMOZVGKY3F3GBNFVSQFYE5W52VBAFTD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789393962" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64491192, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA2NXAC3ARFVMDI74CTE4655XHZJSF6D4R6BZR7YHIMF3CRRMNH5HHJF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789741738" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64464750, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA3L6AL6F5WPVMEVBY6MGSNNF75W7NUBL47OBFSDZELOCWUWZZBLPCQF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789609528" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716336, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA3NAZYKIAQWJHXCUORX3FUXZCCMWRFIKJFEDMLEUFMCWELYD2LCDWON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790050648" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "5" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64231386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA3PUOORWJQ3BBY2PQYIEPAWHOED2Q6MLLGWBW3LZXNHAIPU4D5IVFMN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788307179" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64467229, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA3S2WI2ZDQQ6LPQVUR27MIULTFTMFYRZ2PVJNUYCP5U2Q7KD23VKTB6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789621923" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64413485, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA4DJDM66BZLZ54K7GLZFFPKGBNC44IPZSHMMZ6G7YY5TOQH3N5T5HAM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789326502" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64311200, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA4HMWRUEZA4UCWRD6EGTSGVDNCG5QHMBA5AIXGXLH2PDLRVKARNWD2C" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788756341" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64501629, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA4IT7XQV56GWKSWHYGELBV6X6OYAUO76UQOTJHDDMRZICCOG24UGJ37" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789793923" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64322397, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA4ND45BUYLCALAXQ3MJEBCCDS4W5ONHRLM2HYRLP24XOJIXS5EJR5MF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788818877" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64304323, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA4NKMQBJABOR7BIXLY6GDXJEJQA447Z4SJL2VEDZWVXURIHE5TQRCKK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788718017" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476813, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA5TO3ZWC235NHI6EZN25PBMBVAAAVJMRM47E6CW2JM2XF2N7RZCJPZ6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789669843" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496446, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA5U356LQZB2Y2ZBTJ5SQYAKTO63KTQL22H5CF2ONWDJKFCOI64T5EQX" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789768008" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64254964, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA67HUSONXSYG553UG5IDDIQSBH5Q4F2BU7ZYAQSIZ7L2IX43JAUXWAJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788441721" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64375648, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA6F53H7FYB4CUNDICTODGQ7Y2477SOWUHBU3EWISTPAFDE3FGS7N7T2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789115652" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64412298, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA6KWW4R7QFFNVSAQI6OVNWMRJ7Z6IHL4DHLIJDOSET54RHXTJWJFUMC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789319899" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460062, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA6Q2W65YHHFSMUU6PC2LSKLXN5JDSA4ZMCAA6TMWYKBQLUF756ZJSKK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789586086" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426091, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA6QAJ6TMPTODF6DOMLU6XI7VD6XYYYM7JZA6PPAWNNQEF5454NQ2ELN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789396963" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490635, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA6UANZSAIOSKXKPYXEYLHAUNTQOJNKUIKCPGFNU6RVVTPJDJJNHOJYH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789738953" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64461138, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA6UKOFTZWEEFP7JBK3J5FA6CAGSZU7AUTB4N4WV342SFPLYOINDPQSH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789591466" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490120, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA6WVPSKHSY5SYBSQLYRQILALJRYDJKCJ24GMZVA3SW2BI3CBGHDKEN3" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789736378" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263781, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA6X5ENKESTG2CXBYC3DUWFZ3LKHDWSESUT3YK3N5QOLBP5V2EUUKXLS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788491586" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472726, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA7RZAXUBCJCMHMOYB4HNIGJDCVEYXVJI4VRTYQ47YJMGMRJANL4EJUN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789649408" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64595172, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA7VIS5CL6LXI23TADDI5TTKZORASCUQDJRH6EKF2TPLTNMXS5MJUFWF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790261639" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490005, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GA7YDWNQYXXLAWBZG25MH3XI2QATNC5CVZZ7U3IKWEWCDEV4B6E54TLM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789735803" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64477488, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAABSHDXGKSQ6VJXW5I36E4YEMXPUJTYG2CZWPEP7D2ASI6NUPIZQFIH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789673218" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64434349, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAAJ4XUODHJUC23YRMFVTS5M73S5ZZTQSZIDF2ZOSA5P2COKXJOTNUSN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789443198" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64435177, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAAKMCBKEHJHWVLYR6CSX77AYAFYMAITCUI4GM6EFO54V6OSCKA2KONZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789447830" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64468365, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAAPEUCFUZPY75RXXFW2WQM5I6AJYDYK7AHNC3U5OO57MU2VIVQWPZ3Q" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789627603" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64304312, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAAPLQUP5U3QX4RNUPANAPZHU34PYSP743UCEI7MPGXEKPPHZKMIYPNK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788717955" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64225754, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAAYZTURGB7OZ2YBZGIXDIKPOPBHB4QWAER3TUCZELBJTW2IXHNJVQNA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788275216" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64461943, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAAZEXTYFCDS2QNXAYKVCMAUJLUZACWVOQ2WVRUUEIXC6ZKSHC6GDU5O" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789595491" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64312660, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAB6Z7XBXJDS736GUA7RXUSXSHZCDC5X23BB2OSN6UAG7CNKE4SXQGIL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788764481" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490105, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GABIBU6C7MV462TNPUTELJKOJLRC6BGCAHGCJQ466ZQ6VOAKDAHRQXPM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789736303" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63897537, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GABLCERMMELZLEVOZYUYQLWDTNXKDXF5AZGWNZNXK7OGNRXKI4MWRHJQ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1786421552" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64267750, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GABM2IMGYVRARUHND47RYFGJRLWLFG4BPDW6VWJJ4E7Y7NCTVC44KEO2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788514040" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613757, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GABN2BUS6G6C4GA3FKUWYQNU2B2PVGBQQZSAPQWDVQHECFWHWQZ2IM5B" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790354564" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63778427, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GABOWUHQFN5D6SM5MWR4QIJGIXTJVIFFV7P2DOKLBSP4FXKXCK5UEAZF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785752297" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64312116, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GABSWJI4O5YIICUTGVMJQGDSU2ZPFQWPQO2OOCN5BMLPDHMOCZNOYBJ7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788761459" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64412140, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GABUOS3YDHA56AEBOE26Q7FDDMD3E7IKHGZKTG4PSIU3LYTTXIARFWGN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789319031" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64459984, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAC6PDLAYXPODTRJSQK67UQ66VVHKRRCVW2VRUATGG7ZVDKS5NOFSOEE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789585696" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64589405, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GACEK4USKMSX7DYY5P37FYKUIZPI7DNIURMH5VKIOV3FIPCISWCVTVNT" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790232803" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64343343, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GACELCRF3P7PBSFLSPHHLK2YIQ6WNEOZGBN3EJ6TMLCMJPSVDAZDXDDM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788935767" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64610876, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GACEYCZE76K424A5KX35SBIIT4RK5GYM6VNUT23KG6TAEOPRSUKZOQMG" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790340159" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63815105, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GACIEO4OFKLJMUO3KFXSIIQO2QDJ2EPCUA5MWQGZOC5F2DHE2V5WNVJR" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785958778" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64462841, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GACLRP7D5VXRRJ2CK7RTJDRHEORILM6IRK3XLVGFGL54WS5ASFPMLSGS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789599981" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64452208, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GACN6AYZYI4DO3GTCDA4CQBVQQHVDKWYLVDNVMRIYKVJBVSXEJ4FBYRN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789543129" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64423483, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GACNFVACOQPBXJARGRKEJM2K5TD3RYJQM5RQV6Y3J3JH3BENWCI7J5YE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789382304" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64213284, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAD2PJIY4WZIZM3HIWB4STXDGQWQ4GFFDBQYIOEAEGVWIQST53PVU6B5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788204273" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64467569, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAD37OWHVXGX52GN4ZG5SZILGWEKRYVXHBBKG36N34GQ362XHARARDQD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789623623" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494875, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GADCI46FPSCQ4GWCJBXZYLPUTIIYV5OFR5JFRU7ABFMO4AH7W2ELUGAP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789760153" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64516409, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GADGXEIP2NEIJ3723RFTFCSPVJIJVM42RTONINH4MRTMUV2KBDFBORF5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789867823" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64219808, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GADKENAIJDM2RDSOKUCNN3VHK2LFVJMRE2GYUGXFOPAS5YLDHI6S6JKL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788241373" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64539286, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GADR2KUYLHAZNUH7J4IPC4QOFKMJS2CHTXIUVMRFLI536VL3XPNTEUWZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789982208" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64322956, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GADWDDKP4TKUVNZVSKXFNFN6FXSZYIAHL35R6GEQB4M3QK3FNEF225YS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788822000" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63624118, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GADZJQYATX2GFX7FOEHHKB7K5XQCDHTZTG2SSJA3SKL7MRKEZBD5EVJV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1784886018" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64477803, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAEL5GKRHQIGEYEGK5NWYLPVKGWTXU6MNPWEZ3LK3WXVOQA4OCOOBLSI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789674793" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490063, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAEL7PVWHQG3V6ZHIDHOWYO22TB6FPDG7KUDCD6VUSPED7AUN7R7R3FV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789736093" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64403104, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAELNLPNRD5U7NPERCKIX4SXIGTIIJ6RJR7UGQE7J6FXT2SSG6NGW4EE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789268847" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64587993, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAEVYIB4QUSGU2GPEBBEOSS2B6ATCZLIQ4ZNF2IMIO2RAOJIEZDQY2YX" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790225743" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64571780, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAF4DXSSAOZYHBPVQAKYTMNMOMDWMSUPDLI25BBEJCMRAH2RCFXJFRVY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790144678" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426568, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAF6ML2FAQIT7GPP74FRUH4DDEOIMPJENDKBJLMAEHY37B7RTEBTIYOP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789399636" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460647, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAFAYKIZTOIA3KWY7GVNYW6K7ZMCHHK2TC2DVRLM63PF3WQ7XWC67BKG" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789589011" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326462, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAFVBUV7COXHXLQWL6VWB63AP6VXHTKIIM7KA4S2DZEXCEZJKANJQLNV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788841555" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63737071, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAFXV4YOKTO6FJRG72CPLHCM4BHBIJVW7FOA2AO6A452CUCRCOXRHNNE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785520146" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64461336, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAG4PSHPAPNGYWNHPKMDZOPZBUN23ZFQ2XSYWIKOWM5IIQFLAZKYMR5K" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789592456" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473093, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAG5MXAGAV2HO4FYFJS3MI7HWNALXJMYPLD374T4VYIDIXGHPPY6CDNF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789651243" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264355, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAH4O6GYKLK2VZBSRWVKLLJ6K6XWWW3RPYG37BHA3J6SNW6WKW5MURKU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788494776" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574572, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAHCZAPDQH32PUCAUSIA6YUHRZP37C2RHNN3IHBW35JR2A4W6IQZEFKE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790158638" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64567270, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAHDDTSTE2P6JSTUBYIHZ566S2MT554CYJBJIU4W4Z3P3T7XKLGA2TIK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790122128" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64470927, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAHETB7HLONGSAT5CDIIULG547JZ4VD2V3RNP5KMSRS2BKD2WQAJGO5K" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789640413" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63585475, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAHGDV4MWDLT3BXOUT5A2T774IUAE54DZ6BUCBH4O7PG5TJGWXSV3OJO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1784668845" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64461357, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAHLSHD53JDVKMPIOZNB3GNKTQXYCLS6R6FYX2BGFEWDCBHV2JMHUCVK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789592561" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460392, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAI7526ECDGKQAIHRXQOVHYURC4BJQTAS6Q6N45OGWZ6WDYVCCA5VEXN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789587736" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64587472, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAIR7XYIVOIEADFWYP3TNHDBXBIB2DVASZRSIYRJXBCTPCA7KQDJVANC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790223138" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64345826, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAJ2WCH2L6WV3J7F5H2VX2M6A7ZYWL5GDF2GLZZ7ZO3HH7XGP33276UN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788949607" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64229597, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAJA3EEWG5SJDV2OSC7NBAGQ4OFEC64DFO7GKTK5J6A6SXDEO4EQ4CRM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788297001" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64733458, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAJCILKZETMMCXMNJXBBFZ5ZVAFHXVGPQSMXY6U7YDX6UCSZN4VMJGU6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790953072" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492483, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAJGJRHG6ISSURFHTMSG7SI3PVS5XVME7OJHOAMP7BRHASSIZQHUOS6E" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789748193" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64449479, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAJJYKVGLTGP6A3ANITXSKM26FT5OWLOV6MLWQPGHMOLWGSXXPRNOAFM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789527906" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64744258, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAJOAYF7JRQNPAFECS7SDYAKPPZHEUVSDMHFHPKYWYWECIDAMTTFUBRW" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789514930" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "5" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574706, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAJWVQLHXY6DFSC3CMWL6YZNJTQT7SRD4BOZHQOVEHHRLP535VJ6JH6O" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790159308" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488416, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAKCDS3UQB7V6TJKKWNURUOEHP6QZ2TL6LUZD5GQLZIABNYS5ZDOPDDM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789727858" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472996, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAKLZLGYIDN2ATGC4IAC3Q6ZEOA5RIGWCZKWGIOY3IOZ3OMCQ3TGSZX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789650758" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490042, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAKX3HGLVDSBI33VPBP2OIQMH6NBDXRUSKT55YZDSLGF6FU3RRDPOUKD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789735988" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64601717, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAL5TDYPCCU7OEUZCAUQKRKIHFOGOZTQRKW5ZJBVYDGKAUYHZCJ3PRO4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790294364" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492953, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAL67SRM53ZKJ7RITS7US57AU5647AJJMTZ4V3IIVXMLNQG77T3GVBES" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789750543" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64356316, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAL764ONG67SJZUAWKEH3AQHQ2NQTAZZ3RNPOSRYYSMFCWWDSAOPT6B7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789008246" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64213197, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GALE3JTPDC3NR6KV3RWS42CCAQVFCO2IJYTMTBODAG6ET42P65WEY4CV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788203773" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489464, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GALSJE72WDQWVJV6DCSKRHL7TVFGASPAGIWECGR4PNALHG54UV5SY3TA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789733098" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323920, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GALYZTM4XE6TKQAUNPN3HKDB7IHP3SPEHHQEMNZBCE3B4NZW6UHAM5WH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788827380" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64314653, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAMDZSTTRZ3FXHAIVZXSLYWZVRC57I4U4NRAWL5TLREOERRJOE6QPQI5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788775584" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485365, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAMH2GEVQXETLZGAFWMIU5RKXSRON5UFIMTWX3B7JMTJ7QG77C46RLNO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789712603" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63726335, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAMHNDNAKWJYOBP3L72IGEVG2Q5IEND6TO4DUQ5RG6QMJFJW72BYU3HO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785460287" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485638, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAMK5KPK4JMP2LYE4HZOWE3WONE2SZLEDIOP4P5FIVZJEXADH2PZAZD2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789713968" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64434352, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAMUGU5B43ZFG2BW2DRMEZZTQI2WPYU5BGOXTVJT6UA23DKKZLXGMSKN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789443215" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63810998, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAMYN5NNVOY2O4E6PTTAUWFSVA2TYKHFJX2Y4N3XW4MX6KSH6WXJJQRU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785935627" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472664, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GANHXXHJWLACEFFSZJOQSTAZBBRV65F2G5CNS5J5YBOWROWIGUS4E3R3" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789649098" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64317925, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GANRSEJFRR4I2MJYKP2LSQNBA3C7QFMGYRO4DOJCZRN762JD5QXASBHD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788793849" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64461193, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GANXCQH5INI26LZQFC7BPQCCTOQECHLBB3ZLMXVKQ5MM5VPWE3XGSTWZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789591741" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488170, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAOAE5MEJCCWMBAIKDGD64UBHUX73SE3EBVV7GW5UWJK6AHZSUWA6U6H" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789726628" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460068, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAOKXH33P6L3GVE4VVSY5PY2YOXW2WNCENJTJWRZPHFVHPA5ANYYI4WQ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789586116" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64239038, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAOMRKOZJOXUHI3PHRPRQUORZ4NXZVSCRZSHDJJYEYNFBWZIO5WMRZJ3" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788350883" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64484839, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAPF3JTLOTEK6AKE2Z74V7N35M7KMYU6RDZ6O3H77VDUXBU4WZ5QT33Y" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789709973" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64444396, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAPFD4AVZGSXJGZ6SQBM4VOVNAVCZHGQT7UXALJSNDZAN45DCBFNVFZP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789499483" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64461437, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAPFZQGAWS3H3DVOKDHSBPYPZERHNNQIC7J6JT4L2XGAMIPCUQ3PMO4G" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789592961" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494897, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAPS5LQAH6LLBRSFX23COJV6NAN32T7SMX5Y3BRQZIIFMRZJCRWLOQWT" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789760263" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64622360, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAQ2WKE3ZN4TOVK3AJ6N6BJ4SEDBSCZ4CIFOOKWGNPIYTI3SJWRDE4JU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790397579" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460770, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAQ6OTASPOWLUYVTU5FUYX5SCCGRJZEWV6PZM2IGYR2E7JDYVPWBNCJL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789589626" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488177, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAQEWMDNCGENYPCMQBFOGGVZ5A4SKSA74ENCAOBW4YOMTFOH34LJHLDE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789726663" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488675, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAQT56TOTFMQ5D76BHGIYNOCR4JEYGM2GUSJJ567CYOCLHY754SR2J46" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789729153" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490888, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAR3M54VVNPAC7TKQZVZZQTW5LLXV6UL56VAD3P3GVM4FQNTJNEI6WPV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789740218" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326461, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GARBDCXQS4LEIJL3DYSCES34OGHBMDKMAIIKFNHB7SENYSFPWVKTQXLH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788841550" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487180, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GARDPYJY3URSWQWU2CSOG4JQHBD3A2HK6EOQHUEPKDWYNNUPL4FDDWS7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789721678" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64721118, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GARFFI5UVYEUMHDJY24KWDFU7R737JF23JUQSN5BIOUHS4BAEIJO6MEV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790891372" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64462788, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GARGHU6LJUUGDF3LAAZ45RXKVE6MR7BT5AMMX335SSYCEK4NSFIDKSWX" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789599716" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64213304, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GARGZMEHRGVDSOD2OPNMNXIHSRQOKW5YBBEJ35XIV6SQBSPL6J3LQ3LB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788204386" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64470757, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAS6X6RGVL4SYT72BGNW4YGIT7DCNV2XYBWFMSGIZEGMFSL4HFRFTTHX" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789639563" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64227918, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GASAU6U23EO3BEQ5P6TDLXZLFLIHKAK4YFLNOOBQC54IOOXU2CBA4LYU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788287505" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64531849, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GASEQUQAP7QMLZK4VMNQLMGKLZ2GR5XJ3MTO5C2RA22RKDKHEPRKKAHU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789945023" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64422351, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GASIB5GAWA6B66X4ZOHVTWEJHVOLXW3ZGWNTPCXNCVA22CTXTKKOHUKA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789375971" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64536040, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GASWMZPKDGCQCKDRYQCGVD7FF7D2NRWUOG7KSDDO4XGGN7XETX5OEE4L" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789965978" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64468998, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GASX7QVZLN3BDQATMVLLNM4MABJXLG4ZZJKCUGQZDJAJNUYY2ETRZFOX" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789630768" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64523675, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GASZFQI35SWJMMQNMGIK4MPRPK7G5NAYH64YZC3CO43HXGARL7MDSTJO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789904153" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486991, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAT3GKWHEXZUSZQBZ2AXN4Q4WU7TU2RKINIJWB63VRWCE7OLE4BHVFS2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789720733" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64221425, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GATJYZIXPTLOIK7F7XRM4PCHTTMVLWKHATECHLA4QOQUQ4LMCZOCGUKX" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788250568" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460720, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GATN2BPMTX3VP6M5QR262B6TK2B4H25A2UT74HDQZM6XLBK6SM7KNHKS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789589376" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609951, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GATP5JYOC36OMXDURFWEE4OYODTP4VO3AKXRYSDAPKKHRFHPVOASWDEY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790335534" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64421560, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GATRUJAWQWVWSSXYGUDDXPDQG4EGHNIQBMYCBYWX7HVZJQYYAMPYAHKL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789371559" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64577930, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GATTCGMJ2MDHDT5TBQX4NGMSHSMTMCHXRVIKPBES6JM5VGZSHC45OGJC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790175428" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64391203, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GATUFIJ6BE3ZBSCR5AAZLE7KEDC4ALBOX6RSRRFBMYK5D6HOKQ4SFK2C" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789202388" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367175, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAU2MGBQZKRFNAASGQSBQX7LY6Z6DXEV6DXV234U3XHDUP5HFZUOJQ67" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789068596" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64477822, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAUB4KOF5DQRW35B6Z6Q5ZBJNGCWZY5F55OFYDW5OD5A5FGPN5VPBEBJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789674888" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63777468, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAUSVYOW44IOKHEDEMHTQUZYB3HEUB7RYGEGAAG7CO55Y2DFRGB4RGJR" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785746851" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64322377, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAV4V6WZGMVPZM54DR2242NMUHV3JPVRLC7XDYIFSRU2WZIXLWQIKYO2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788818766" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64500738, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAVMEQDO4QZDVK6AHNPKBTBMI6CUE7LOYRAI7C22FTMA3FEP64QMNS4F" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789789468" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490430, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAVOZGARB2RJG7ZDQPTMA3VJPQRQYPJUWV6BGCWQKSGFFOJRVQTITFD5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789737928" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64469979, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAVVVMKGTI5UC3NZ7EXXPDPBWPCCDYTBWZ2BHX4MVHTA3QF6F54YLQFT" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789635673" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64239964, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAW4DTRCC6JEBXQN53RYX6D2TZZ3Y2EUBF54HC35RR6TOYCHCCUQZVI2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788356150" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263452, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAWI2SC7R3U6H7I4YCCDMBTACYICY4ZZ2OTXSSTZ3QZ4DSEFXY2IAVLF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788489754" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264344, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAWNMRCDNSJTAMHK2Y7FWRRLHGBJZV7VPBETXDE6CC2TAEQMBYRW7VKP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788494716" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64436702, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAXFCHETKZD2SH45HJP4RCNGRDPPDSMFFSJX5P44V54XFHEDYXB4KKAS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789456352" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472929, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAXKZZ25Z2MINQGFZDRWWX4GDEJKKILBVZSGEAMF7DOE25LUVALKZGSL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789650423" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486780, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAXWC6RGYLTDCLD52LLRUVTHW6RUE2QYTMSGGUMZMZBFAAZ4E4GTURSB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789719678" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258940, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAY2PVZZYRJL4TY3NJWTOX73R4WYMBRPR35EHSLXTU5FEEQEY55XYOB4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788464335" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489076, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAYAJZXNBSQJYE6JW4TDVMOBNHP5TA3LSW66TQXHFIZWBPBAAX4GP4WE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789731158" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485103, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAYBPZH7NZMLDLBOF5KAUEUC4AS4VOKXUL3IKVCRND3IJJMDUSCT5SXM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789711293" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64574360, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAYNG64UV3AS4PK5CAAZE65HQYBVPYEAAGSK4YMSIW3DAT6GZY632N62" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790157578" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64470275, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAYPI75VC2OUGS7FB5P4CRQB7V7GXK4ZC3LPFBBV4VJHPVSKTCDYX7TJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789637153" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472302, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAZ7XDESEDXVG3Z7UFRHLSDSIBW3EQ45JFG5UEUECZ47XZRY5LO4RO55" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789647288" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64334984, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GAZTRV6HPHQJD6EA2K7Y6XABIVTYF462Z2NVT26MZPOJULTV6S4V7FPT" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788889107" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472754, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB22PWAE4VK4IBPS7MVGXTGW67TTSJCXIGO3Y742ZODK5QDYC6NYS7CP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789649548" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64594700, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB2DA347Q7J6THBSL6A3T2YYWTBOJMXMD2BFO4M43AGSWSQHS5CFUQTI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790259278" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716452, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB2DG2EQGAUIW6VFQ5I62RMXJBWUBAKYBKCY77Z7UEJUCYHX4IPEGEOA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788241378" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "25" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460610, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB2HKZF465PN33NVGUPCRKMKVGD3FHHYJPMTXC4GDPKUE5HTC3WUDX2C" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789588826" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64498938, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB2LBLRAJMXCNQ3R43GXJ7PLQBIPFDBAUEQO4ZKBTOHKNGCBHKMWKBIB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789780468" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64583464, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB3EXLNQXLMQIHHIRT2RRMSUJVZGCDSJ5K2GSIQ6H7CQZBDXCMWLD4XQ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790203098" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64304536, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB3UVZEY46UHMAEBVFNFMUEODAUMRHTVDJPNJWGMULPR72THEDSYJ4HC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788719204" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64607628, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB444W6G4PHTTCSUA7FR5JNVSN3GMXRE6SBJZ3VKMIVEEYAYFGEPHC3H" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790323919" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476250, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB47IMX4NPAWJF5BQJSKFMFS2THUO2IFHSXSGPRO5JED2KGIPO2IEVJV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789667028" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258246, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB4A4YFSQTSKA46YNIDIDIRDOEKIXOCCME6RG45BRULD633KDQZABRJC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788460383" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716661, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB4O24QI4GT65UXRBH2ZVXPKDCS3HF7UXSCW4ZBU4JUE52RAS7OS7GNH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788501040" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "5" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489699, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB4WGWQVD7KJOUBYQDRDGVO6ZFNH3RCL6KQISQB2BU7EXX276W3R2LQB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789734273" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64290618, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB5LN3DCD3NF7AS5KP4DA4OQO4CO7XPNCKE5MSLL4MXSXXYSFQYY5INJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788641619" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64468877, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB5NO7CV2IMLV5NQ4IHDJYH3BA3DFRTBNGSP2W32DZEYNHAHI7LSND6J" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789630163" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64316910, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB5P66LJE67DLSMN5SY5Y55D34WRTUR6TFTIDEMS4Q3G6T7WA5SANN6F" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788788157" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493186, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB5VEZCY34VCQKC4FQNIXAERD7GWGSLWN3NLTUES4CD2UIGKY4MY227K" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789751708" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64461124, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB634FNKHX5SST5CHGNDYYEW3DALBFDDKFNQGCDJKJ7ECOH2JRBRP2AI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789591396" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64468420, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB63EHSQFTKS2DUVRQAIX2ZJLRIS6N66JLEDUNV7OUP4HYGK5QRY5NBH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789627878" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64471643, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB6UTCSHC5REGOMHAAJZHOFUDRGCTJSOL3FLHCPP4C25M7SISN7XAPYB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789643993" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64439248, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB6XO323BSFDCQPWKRDKGCPKWRQNS72EPTV3ZCXIUKP3DTOAC6JJWXQP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789470592" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64558691, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB72GQM45MCS4UUGXKTFYHLWLTZ5JB7KKGCBKOSH3BGTWCT3QZ2NREB4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790079233" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64468238, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB75PF7ZUPYW32USAAIQ74EVEDRQTT4RDFB6GOUOIGREUDFNESAVNRI2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789626968" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64471628, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB7ENQDYGWUY7M2WFMZYOGKDFT6EHSQWPZP6OPJ7WXYJVCWE7E3EYWRU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789643918" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460003, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB7IJRMMFKNURSODTNVSXROZFZXVNRHMETKIYOEO5BYWSYXM5AX27I2P" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789585791" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64468236, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB7VCY4J33KLWK5AJBX6FU22NUI4IEBQXUOWE3ETECZLJKI2PMQ4ZHTB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789626958" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475660, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB7VLT4YBK6OPQ6VFGQQ3Z4Q3XZAQ5IVDKBMCEUPM3OA2HTFIMCQ4FWH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789664078" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64461381, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GB7X7DPJZIAOFIET6MT3AXE52UAQCRVHVRREH4KMLUBEGXJFFZ6BQADS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789592681" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64373029, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBAHP2GWLDDFPP76KXVFTZC2RXE7XH5W3UGVSQUHN5IY7LZ3JWHUOIHY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789101111" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64170754, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBAJXEV6RQSHLNXIWQJYUAVFZTOQOVN4AAN76EKUQFNX6YPTWEDTAWNJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1787961890" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485447, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBAKTZONDEPRZCAJVS3LPLCT33OUW2UV5ZSJFBWMIEZDZXLKLR6GH3TG" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789713013" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64321428, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBAYJECW5TX6VC5BVHMHC3CXNGOCH7SMKEB7HY7PY3FA74ITFV6EHRKU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788813457" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487165, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBBEOPMYZHDYJHF3PEEWCFMBJTYSMP6TO6XKTTHIGJJDPOAZ2VV4HE4U" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789721603" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493745, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBBIXKRKYU4XVEWEZPQ6XE4HUIEDI26OOCANJC37AJCUKYGQANFMEVI7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789754503" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64352808, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBBZ5ARLATIB362OH74BIYUJ7SKZBZG2Q3WRPW6USGNLXPRYMRCT52PV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788988664" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494338, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBCG3TIVM7NPV2EIM6CGS77JUGB7VOVZYPV3ODKXDUFLK24FUZ5NUIBH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789757468" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBCI4C4GGIYM2C2MFRFOTULRATO46JM5DLO2WNBL42LQPOO3PEHXU3FH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789392992" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64362847, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBCIR2XXHFLZNWIXCTLCXMPHSXFOPB2XSHNOGCBNSXZ7PWMXDXJU4HL6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789044577" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64304459, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBCMD546KER6MFBLWB2ZOKRUVXFWC5U27BYYKH35LHQIWUNC3YYC7VOQ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788718776" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489869, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBCQCUF56FZ34A4LIFBUMSGQ3PD2HONTADI7OZVDW2LQ5I2NPHXE56UK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789735123" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64378319, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBCUPSMCHV6F5WGQ2F6GTVYW3A72O75U5ZBX2JI7UOD3L3EVAT2X2DBM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789130511" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489880, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBD7LL5636SKOQA6JVVIS7A3CGTYWWJQFY2PDNWNWG6FNI76L5GWQ42Y" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789735178" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64225843, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBDHR3CNQHGUICIBUAJQLRRTLJITUZNA2M6ZZNAJPCHIRA2CK2CVNCHI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788275718" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64339465, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBDL254GBFNKWH4GDLMP666YCMU56KUCFCUE4RUWPIBCUJO3RI7LZL4U" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788914131" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64477450, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBDNPDYEHMCCOM2L77YTKIWFQYVXNFZD4PZDNFRFMBHWJHYZXSYVOOGI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789673028" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64474943, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBDVM5H2HUR2UJU4U62H3AO3B3QA7XXRPOMJQYWKBJ2UT4G7CKKCHXRS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789660493" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223317, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBE22IVD5UZGE3BBGBPRIDYWZ25WUZ5XDTVVKXRYHLSD7KJK63QY3JNZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788261315" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460427, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBEADGAQ55WMLMOCXOLYGZQYERTLFSCPLNHL6D2KX5CASFITH3QQJJDM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789587911" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64330028, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBEFFGXQ5NO23P7QYXL7DVFT426QQYU7ZGXDOLJMUIFLNI3NQEEAXVNF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788861426" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437442, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBEYGVKWVZNB2MYLOBAQVGATNKGJ3ZK5SYHYS4JUXU6PKS5QHWPEDM6W" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789460494" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64358678, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBF5JQPKGAH73ENUHNY57YNX4R2CDAGSRQW43LULFKNHP42DQR5XI53P" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789021423" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490837, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBFEMXAVBW2JSNVFQQKHWAKOAO2COIMZOIIKMRE6OL63R74SMSWFIZLI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789739963" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63891864, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBFGY6YHRMJ6JMFVVARZOCURPC43TSFCEVZM24M2TOPJI3MUYJC2KYUF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1786389639" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64477030, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBFJSHVZSZIZ762XGMV5VBOHGZQAASWOIUZKG6GBBCADCLBCSNYICF2Q" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789670928" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426076, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBFRBYERVZWUK26QRHHMVSPMUG5N2Z5BZHTZL5QMHUIXLECF36L454LS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789396880" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64219087, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBFTYXXJAINGLWBOLUAHRYJQZAI2BE4CRKBY3OWFLCXQRLY6QWYHG7XZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788237289" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489416, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBFUU5J3UY4JOS5OHE4ZEYYYNO3E26YOWBRW35XO67MMOE6ISVJD6USB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789732858" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496552, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBFW6RSAV6YPDKIL6QEYE5R6M3KROSQ6J7DYWFNQ2TT3FMT7POUPJCUL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789768538" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473486, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBGARGMSDMLW7I4ZPRD5HTGVAEOUJG73PPGBXZ7C7AP7DKXV6TK3QTRN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789653208" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488655, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBGFA2Y6LVGXYIJ7PRIF3T4BZ7SJASMEVUX6LHLDKLC67KCMDHD67TOZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789729053" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493756, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBGYBCMY3LBQOUKO3GDEJAJT6V47EL3QWUJPRBHKTJRQEMJRHG5A5MIA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789754558" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495016, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBH5L3YEZICNEZV4GXJ6LYNG5TIAXRELYWZYBKUOZI5LOFO6CLUT5GPY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789760858" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64251096, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBHCXMJLEJAS7YIIQ7LM5MZZOZGWUTZOAJ65M6WUZTM6YCWKAL54RQLY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788419668" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263461, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBHMTQZDOI2VVZMBBDQ3KAXMRJR35N7GFYRYK4NDSXAII4GAUZQJVTIY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788489805" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63778562, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBHOBJIHSDU5QJCBTG3QWQYAXTHQIORSAH4RVCHJRUZU6UFXDVTYZAKV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785753069" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64608170, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBHSU3DNI6IZCVUTBHHYGJUUOVFYORPYKBOQFVBLQBCNOPGCKR4KB32U" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790326629" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488672, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBI7MHCOBO56HPIOJ4WBDZIAZB2WB3YBJYBZRLAWIOMSEKOMJTKNBMBX" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789729138" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476300, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBIAZCI757ZJNXYA2B5VPRCCX32VN2DRRWR4SQ536BMKFRJDCJIHFAYB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789667278" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64471322, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBIIS6VDYYN5PV653QFMDNOMKXWN2HCKQI7FVZBLXPDNWT3PKU76MVFM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789642388" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64325704, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBIJR73UIEPNN2NI2U3DBXM7ADUJFQH2ROCLSYMPNQLU3P7LWP5ZBQP3" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788837341" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64225715, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBISCFS2T5Y4YNCHSGI3OWZ5SIZ6CAODGDUUWT2P6JG65KTAZFRRO7VN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788274990" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612402, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBISWUA6YYUXWP5LZ6HEQSUSAGYLSIQPMVJOOPELXNLJNFSAI67DAYK5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790347789" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64362740, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBJ6A5DSSKOERUXDT2G2KNCJLRY32IJIT4QG5NQ644DHQHDDKDYAXQLU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789043984" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326407, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBJ7TIB5D7WQTE7DG7ZNVUJTD5AY663RPVCCRV5L2LQA3KUHUARAWJWT" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788841252" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263490, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBJEYD5ZZXMPXDZJZ5OAHHDCK56TZDBTZ5WIWCXFFVGAK4AMYJTYFD2O" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788489968" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63840956, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBKA233FZEZ3QIZVY4BH5IO3UZMZQV7UHPCJVXB4FYCMEYBUSPRYB3DA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1786039912" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "50" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64225156, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBKEV6LBMLRLWLIVYZMVH2DVO7CANWFNWHWZI6IPV6VSXNI2RTGGYXQL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788271811" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476547, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBKJMLBPFWZTUVBJ5DFQJGJLDHR52JHJTAOO3JDPAILRTABKGR2A2UUY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789668513" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367608, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBKKKVQR5YPXA6GERFMJYPSSMGJ43DUJPOPLYHUGEV3CMDNVAJDESFGX" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789070999" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64232123, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBKOUX6KOXYS2PNX7U66OVTHWW4GW2JGQF2DFWHO64N3Y2M2BF5DEGBB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788311379" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64442449, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBKPM5RCXJDRYLHTDETCCXM3274GNJY6BTFDMNNESTMQI3NDSC6PRYGV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789488535" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64242803, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBKSR3SM5TBFPKX676SZRR25GKU43IC6XWUQMX7QQNEBYY7WL7ZL473O" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788372391" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437454, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBKTPUI7K3X6556BEEKZW6TMPLPB6U3S2IP7SZOYPQWYELJHQIJ5F7VY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789460561" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64461314, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBKWUE6VYUGG5ZTRNEUO2HXL2WJGWK62GOUQ7CELZQGT56QWJQVCCNCE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789592346" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64477129, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBL2KLLY47AXYPFXT2B2OVFPHNB2PK4YOBDTMGCCUOQTRCRA76L3W4JN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789671423" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64571146, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBL6Q3ZKJ6VIJ6KPWWS5O6MWNYQXPBIS3IFFL5NYNRCEGRXZDBGXDECS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790141508" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64470989, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBLDL4F6SVGE2FDVYKI4QE4ERJ6CEYRQTHECELEQAICMGQ7NLHJSYTHA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789640723" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460428, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBLIRYECXR765HPER2E3352WS3VD5WNDMKYRO5A3365KIOBS4WB4SJX7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789587916" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64602702, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBLKAQFX7Z6YOYA46LRMPT2SGSGRKSDGWN7A6ALTRXCMQ3L72EZYYQ4F" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790299289" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64477233, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBLMKYSUMGNJB3CL5BYH6TJ7LPZCIHA47G56A4YQZTXV6PA23KPUPLT4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789671943" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64545630, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBLTWEGZFW5VV4WRSPOFJTVPCGRLMVZN422DBHT7Q55AWUBCKNHF3XS6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790013928" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612048, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBLV5ZFGAFHRF2VDWQRZZAXFKWNHTOX2A3BSRRDWKXYSQ2LZBWWDUJOV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790346019" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63792476, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBLVHWN3K6J4KPPYIV7BMVELFVUM4UV4CRHXLPUBQ4SGZUSCVNXVTW67" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785831514" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473601, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBLW2D4KJQTSPLMHBTQ3F7Q4W2KNJYPT7DUF5P3FVRIC63CZOQEHGPDQ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789653783" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63809511, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBM5DMY5TIL3LDI4ZKV3PP4DS2HU7MK3A5RIC2LWUJEK46LOSNPLXQ3L" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785927268" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486663, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBM7DBU47CGARHYGI32MTZ3VL7ZVRH63PAI42JSI3VKH2VKT567IO2SY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789719093" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64720595, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBMFSMT3OK6T7LOWJBINEAGN7W26GLOCAFOV5GQU2ORSHI6Z2SBFP3OM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789840453" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "5" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63807895, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBMQZETCEJDEEBWPJYYRRZZHDGQBL5VQZSYBVAJESX3MIQLQGKQYGZ6V" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785918183" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460217, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBMSZBY4P3L3TQE74SGCTN62F3CIJHJQK2Q5LZDMVJKZ6MXMDOVZZBWR" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789586861" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460571, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBN6EP2LMJID7OSPICOKJTCCAH3TM5K75DZE3R5F6YNF6IGGPUXVRVWJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789588631" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488534, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBNAYCLP6TYGS3NLUCHUHWHCEKUNX3B5UQEMO3K5BH7ATG73JBV3XTXO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789728448" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64376020, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBNKYCX5V47NRSXU6JVHZNUUG37GXVEM2VACRURJMES7NPKPG64A2Z5E" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789117715" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485480, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBNQO6SYESAPXFRZOOFJUMW7QQL2DSNAC3IQH2XWOGLPEE2S3SXSU77D" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789713178" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64463865, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBNUXY7JS4Z37KQWOFIEG3DGQWDDDH7OBYGKLB7CBZOS6BJ5D4W7U3T7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789605101" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63717018, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBNWWZRV4HW5IAELT76Q7EE7RZ4GS3GIF55PPEELFMGMQQPEXSQD2E2G" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785408082" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64272788, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBNXYGYADZN3OFMXB5HUDKXTJ66MLZ2BGVR22VDEXILALZ26BO7BEUDQ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788542598" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64462308, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBO4PYJJS2E32F7NVE5ZROBXRFT477ZBKQGIVDQSH6UTY6SWNPAY5P37" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789597316" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64720408, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBOEU2VQWDUHUZSH3CBUEFHROAL3DTENFW6ENLQY6J3LCV2YPLVDDLHD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790887822" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64468391, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBOH2AIPXRTDRG4KL6XBKYW6LU7MH6ZZAXXJMLKXHQNSLCYJ4UWPKH56" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789627733" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64325210, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBOZJTMYF2NSGLYI66YS42SH3X47ILWR4D65TPALOO2HQOUIGGYHVYS3" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788834582" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492415, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBP2P4JAKP7ASHKSOQABFRSV624LYNS45NE57ZOMUJD2E2ONBHP66MRJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789747853" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64466972, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBPA53YAWB3I6CLSEPX6D6BG6SOTP6G7OJVSEPJ4QUTBHLTRWQC2YTEI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789620638" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64523867, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBPHQXYYQXNDI6O3LMKY5P4BISQH2NQRRI3GFDMD2UXVEDLBM6Z3SA6B" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789905113" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64330020, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBPT2QI464Z4YGYVFWZ4HZ4JCOZAB4N5TMVC3C4JAVLJ7VZ5TEFC2FV2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788861382" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64505200, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBQ2D2PC5TGR6NBZXREJDBAQESEUQ3WWIJ62A5B7P2VEJ7NDT47QPI4S" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789811778" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64222832, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBQ5NADAG6PXWTOZR3KSOAJJ2PIRB4CETM6NBIEUW6JCE3W2D3YFIU2U" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788258561" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64365648, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBQ6SEKS34TMVVIDJAS6U3BP26D2YB246ZP3W5JCZALI6DYJUUXPYKSJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789060123" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64594763, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBQF3E7EDEE5LGCLYZNP5DHXM3FIDHR3SG44BJ3WRLHEKZ3D4OGTAHXB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790259593" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490301, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBQN6WXUXOQB6EJ6ZVD7MMZBGQWNVGJMVJFNJBSOXOAMXLTROHU45XEU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789737283" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472463, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBQSZOYNP3AATFE4MSVUEUF4WP4U5IAJZLFNI6Q4PKGYTTXJGFVMYVBC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789648093" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64445730, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBQY5FY4RHSYDKP3YDBQJQLVII5AISTPU6TCNHYNHPDCMYUXINKF236C" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789506937" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472037, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBR7ICN5PPAE24ITSPYWV3P4XCXE3RZVRB77HVALZP7YTWCJ5GIIUDNZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789645963" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494960, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBRPYPLGP7KNWYRGWJYP2NSJ672ZU54UISVFKBXVRCHSRKEQBIX2YI2B" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789760578" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612428, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBS3VO3ARGGIXRBHDSN5MZ3NTBB6HGQEMRUCE3E5PBPIEE7QCV4BZURI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790347919" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64470526, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBS3WZFDSWMQ3D3MRSK6RUCIWKJOKVXWUZ2KMKUTK6TICQATLRP52VHL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789638408" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460039, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBSLNBFV4DR2A6VLPBIXZUVKDHQ4KBNEVF5LCP472KVAGQTG4UOA27NC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789585971" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64259703, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBSNUERW773JMRW2TGJRGWOKHMV6XONEMXJQAATMC4NXN5V65PFE5N3I" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788468678" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460711, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBSXTAYAIUG74OCSFQQ5W4CME2WLMQMQBTPSPZDG47XALAL42D6IULES" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789589331" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64330729, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBSZVRT426RUENU3LEWHCI44XIERVSLHOEUNYX2YS52JIHJE44BFQ4NZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788865345" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64477708, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBT2OLDSH2W2JEHWTP3L4SULEQFAODZUJBQ7WHFVE67U6G6KMQRXPQLL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789674318" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64402001, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBT3QYFC2VJRKTWAW2JJ4ZGUSOSXJN4T4XHSLYCB7BSDRCQOA6YIATJG" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789262659" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64613922, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBTCII43YUWJ4Y6KUZR46SP6BJLWLJWUYVHVRGMANY2XR5RG35FXRR3S" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790355389" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64514982, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBTSW5Q6RWDNJ3RBXSCBQ24UJRTOQHUH4BAUOESS7LFB3OXFZTXBEIQT" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789860688" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460026, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBTUBAF5NA6H4CJE3FXHLEGXW2CL7LY3OQMMILASLTIA2Q6ZJBDQQUUK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789585906" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64693948, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBTXQSU3W36B2F5PHJETHTW5T2UGX4VLN6CCAC47G5SCFJAIM4XHZB2A" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790755522" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485971, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBU5PAXAFBGLPYZRCWHUFFN77737DN6CVRSRQP67IBMTEX6ZP553UKON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789715633" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64239838, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBUBRR57MSNTWC7ZIZGLJYQYCTK64J6KMHDK2WKL6HLNYJRXUMNNIXCH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788355440" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425356, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBULATZ5EGBJ6R77RIRJVLHR4TEYRLMES4U7I7TVW4AOA3EDRMYKL2CD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789392825" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487306, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBV3V7R2XVL7VRD4M3F6VE4ELKNJS6Z7NPXIW2MOYRRJIHPJXFBCHARF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789722308" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64463134, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBVAEMSTLFX6KSGS3P7LGK7XTROIYYXXORX7IAERH657262OBVUTGMUC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789601446" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64476080, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBVFPIPPCXIW2GCUEA7WTOYZJ32VUYNO7GUZSB6DCAYV4G2IJ7JWS43O" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789666178" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64717103, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBVKX7526IBKIH4FSFXHNSUUIWW5H7YK7URYGFDR62C622BC62WBFEIF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790871297" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63593387, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBVQKBWHZGO6YED3EVXOZW76VPNYUMJLBLKE5IN4XE5LTT262UXCBIR7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1784713278" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64477680, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBVUU2XPZVGPNMOW7TDPI7CPJ2RL2EPD33AB2DZUZLIKGAVECTKIIFKV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789674178" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493461, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBW72MIX33IHGOBDAJ7TPKBTMGOR4QXVCY6OA4HHNDUFVGDY3AYLWZJV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789753083" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64469035, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBWFUVLWE3IRBZ72UA6OTIFXAJKTM3IGUNN7KU5WHLHU4RQPFGUJC5N7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789630953" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494400, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBWGHKRNC7CAR4FBY7FQTTTKEJGTPL2L6RTS7RIXDEPCIEG2ZXCEVF5I" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789757778" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64359699, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBWGVQRGKZJNJZP2SQMF6DDBCRST5J5O7HZMDS3HCWHJ7KZOIIYTPIM4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789027078" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64452874, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBWSKQ7QLQEOSATZI27DB7SPPRHQOTH7XGLHF4FE2T7SVVNDMX5F666K" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789546852" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64477772, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBXHIFTXEVZ7TPGUJ4QOHCZWTKKDGXG6TZSQZ6VJZAAIHBQQPXOZE3KE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789674638" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64225837, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBXN4W36NDNHH2CNEUCGHOP2UDHUXVUZ53TGEIPPEE3XLQUVEECKUK6R" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788275685" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425129, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBXNVHAJNEVV6JXTOBASA4G4IGQMADJQPC2TKXHUDWVQSN45XG3JGEW2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789391555" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64587692, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBXV2EEM4ME3VBQNHSKBTEDEY4UGKT4PSRWNI4XB3ZHE43KVIFA66PSS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790224238" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323023, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBYADSQ667D4CQDQEVHK4ESP2562GN3WNPU3NY2VMPXY3P36VBUZ6CZT" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788822375" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63765190, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBYJDEH3JIEO7LHYW6BOTOV2QLPYX7DAPKF2IBEGXASGUDRZAHTYQWIZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785677395" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326454, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBYUOXGBUQ746GKXETUCY6TNE326DS2HM6CWBNXAPAEPBFI34IZL7RVK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788841511" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496916, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBYXAGK76FXYNAD73E5W6O5UYD74MR4F6N74O5JHOSOMU7A5Q7Q2O6U4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789770358" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263967, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBZAMWZSJXEJZQJWOOHBM4U74OQQGQFFQWID5F4QOWUWHLPE7RI5CI3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788492615" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64471366, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBZFPXM2L6ENBLXBPUOXTVUIXLTI4TRAZ6N52NP2FNWRER7R5ZETVSCG" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789642608" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64725863, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBZIEOJ4VXBSNSLQQ73ZXLACAOU7PNR3JIOMT33PYE46UTB47PLIYIPC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788665400" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "10" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64314633, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBZL6VXKXVVODBENQWT3M3U4RZ2E3PIVNGI4MRQBZNNWTKXQR4HFJ3Y3" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788775472" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64347526, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBZN72COCY4J4755G4KGSCYH4XN353JWVIUD2OL6UYEAZ5VI2PZGRLXH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788959086" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64226820, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBZNFITNWK2KBCHUERLOBCS6XBQC4LFKEEURYWM7G3AT55LWS3YHOWRL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788281275" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64104171, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBZVR5X65DIXKJWXCNM6ETCTMOCAFHBTHQ2WE3S5HYOKADYACOHIY4WQ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1787583392" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64285336, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBZYBHVWTEU23BTMVDPYGHI726XOD4GGQB5N2D5IEZ47B7RA7GGBR5PB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788612130" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326438, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GBZYZX3UDSZBK5N7QS4B3BJDGEE3BITVZWXFFQMRWT6HIDGK53FTESAP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788841423" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64280100, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC27EZGJZLKHO5CCFYL3TNHRFLYKAVS5N3PB6PI64KNDD4W5CVTFT7KO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788583095" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64467777, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC2EB2SZJE6ZUFTUJA32DQWQ4VGHOIZRE6YW3RA3EMFMTHXQULAFSNB6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789624663" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460281, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC2QLNMYY6HG3VY2I6YHB5SJOXYEDZN4MXMYWU5ETDEH4E7EVPISJKU7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789587181" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63698949, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC2TJ55OAVE7UHHR6SI3KVEM2WDKVGROUSS4YMRHOKJRSTW55TRAYUUK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785306781" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263401, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC2XWR6TCACRQXGLJKBW4LFOS7ZHGEFC5QX6GIQPNCLAOK554BE4NVDW" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788489474" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489088, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC2ZO2H7SYITX7AXBGOJNQHRGVWSTABIKHROFFE3ZDBYUOGGBDJ5ASHK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789731218" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64349821, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC33RPJWTEV5ND6DQ25SLT3GYDDPBZBQ3T3CT7R6QDY45YKJLLSTIJBZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788971933" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258242, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC35DGZ4HDRMI622LUTETV7W6MJH6GO5KM7FH4LNYMQ57VM3YRMBPC4L" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788460361" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64468561, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC35IBPQOMUSJ7KGZ6O4YXUWGZWPEA2OOSBFFMT3TMCQGKJDO24AXPXA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789628583" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486911, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC3BD233YVEL4NVYZHQ2IHWQNNYJQTVDQGY3R357A77PU3KAO2RH2AUF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789720333" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63835541, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC3BZOQPSUZ7JADBKCBNEPUQGKDGLSJSNP6FUQ5VPBIIKYRLQEINNIP2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1786073846" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264228, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC3EJLBRM4VZBVG2YNY6X5VMGS4BO7P4XV7RE7D7C2OVY6G7G3K433QN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788494068" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64325599, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC3KL2WTNWWK4C2KZFLKKMECF6JZVDXKHGATDIWQ7OJU3OHZSVUBK2Y5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788836752" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612518, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC3NRR7ZZLRZAZL4WMLJMUXPXD2HXLYVWKTQOUDLLJP4U2LL7CTWTWJ6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790348369" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64558103, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC3OLVPNJYDH26LFK4B4PNVFRGDJYUCMSGJVDJQ3UN76FMLJE77VTX6S" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790076293" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716227, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC3Q4CJXKLYESHLL4C34CT3ENOT4TXDO3W4PRIQ3C7TC4FHTRAQ5S37J" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790050998" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "5" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64474850, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC42GWYZEL2VO4NJQQ5RQLIWEWCJ7SKAHXGTVUORABC522DQ2E7HLHN5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789660028" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64264414, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC44D7WDICQQ64CDENKCCZ7LCGS5AN37ST3ESO6CUU7TZGMFIGHDRPQ2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788495102" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460517, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC4XLXEB74LLZHFAMI2OQDHRY27GNNSOLXDR6OVLFE4FD6JZN4BHQSXB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789588361" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64563922, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC4ZC6F65CYSIN2TT6XO5BZ4GNYZ2TCQIVGBRMCHUI2QMPOQISORL6DO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790105388" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64468547, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC564Z6O7OIYADM33IBC4PSIVCRWZC46ERYPH35KYWCQXNAUTKKA4ZFQ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789628513" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64224325, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC5ARS3X2H3IHL45LOZINXNDWNODYC2QABCDJ4GMIMBQQBXLGKXUQ3FI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788267051" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64609068, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC5DALRCGWSK4PZDOK7I47EGJGEENNGBZMTBNQAZMPMPQKFYOKQYLW56" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789758743" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "50" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599980, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC5P3MKC4MK5IE5IJYQVLPS6EVSHMYUPOYWPS6AAQQ7FUEF32G3H4TRJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790229878" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "10" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64497960, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC5UI7B3CU4PVMMVZSFAVKXOXT7ZTIYGXNRXWR7KY3E74A43VJKQGA2X" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789775578" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64254801, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC5Y67F532THXAIH7NRM4O54QWYDP6XUFP5ZKK46JOQEJ3VDDKNWXGRR" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788440794" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64471164, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC64PHJ3HGUJ7MNSQDO32JFPD2W7JCH6TWFC5ZKJANKG3RMWHE7QPQND" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789641598" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64259401, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC66OARZRA5CCH5YBRNOQQ7QJDDR7TT4PZM4KHEXGWGD66HGX227HYAZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788466964" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64328226, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC6AMJ46H25FQJ4Y2F7VITAWKUEJCUKQWJDEM2OP6SWEH2WQJM4QTQEY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788851391" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64564347, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC6B674B74XTQGHAGIEYKSJHGECF3EP3MXYVJEKMBAC2PJMZ6ER67ETK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790107513" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258512, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC6C6HXLFESMAVPIOG5ILS7WFQOD6TIWC7M4ASVNJRGTJXYZSAM634GC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788461898" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64542751, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC6NCYXDLUZ6KYJBVYJ6MSIHORZYGTL6T7B6GTLF4CCI6AJ6SBVF3NUQ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789999533" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490496, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC6PA5IGLEGV3IIA2A3LGRSLSLQ6EAV2JQQ5DSPCGODRC6WBGUV5TASF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789738258" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64392621, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC6SRAFF4PK6GCNDAOVYO6BSVIJB3FUL2W5K2C6KKXQKJ2RQMPIBBZ3Q" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789210291" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64297000, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC6Z7QLRJDCAMTP4DIJO77I3MBH7WHW444FYP7E6YJNACR4W7XACDQOX" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788677192" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489031, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC75TVZ4HGQF7PF4LEAT5Y7OONTTGUQ2I275A6AOR5ZHRXQHYCREZRTC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789730933" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64474613, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC7I7BJHGNGHUOG36NZJBQOJPYKJTUEXQHKBE72Y5VDMVKXK6EYWLSUO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789658843" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64434386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC7J5RFWAERY3PJD4SFTS5UKS7R4BCA3LFOG5I5GS2IKYJSAWEKXWXQO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789443405" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263895, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC7MQXJZ7FWEK42QSYTVEIKGBSO77EED5CKTILBWROPZ3J7LASINK7AI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788492214" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716417, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC7PKCYZRRDRT6HBGPPON4NKQGHKNJJJQ7JN74TM5XBHFH7JBVI7LBR6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790053648" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "10" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64219495, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC7QUT5CLSK35R2C5JI4LP4P6W47K6RJJARZLPTLVLTJ34YVZIFRKLTY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788239604" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485345, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GC7Y7OPQQNGCWYFTQ2N42BPCNMFZJLBVLROTQZQPI2XMZJK7OJYZZ6ZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789712503" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63703948, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCACQ4PBO6JRHTWPIMSADEMT4NAIUHMOC3HKBYXZRBYY6N5E6WDNFHHP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785334906" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64467775, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCAEHESW34PCFS5E7TLB5C73O7FGYZMBQ23MYNHDUS6LGAMECF2NE76I" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789624653" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64313005, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCAQQBQ5AS5H3G3UBE7TINPH26XWT35AL5ECMYNKSAO32DQ2BRGZRB5T" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788766411" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591038, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCAR2MD5F3ALAUZM6XJP7JKKGAPA73DQ6NNUDBBBPSO6GP3SFUKDUBSJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790240968" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64322601, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCB7TCOUJXKWM4SQIKD5C72G6Y4WPKFLILOGMR7FLKOHPO7SC65I5WNI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788820018" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64572346, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCB7USJ4ZSNXYSUQAXUUXHXWQMCEACRMR3M5442PJVY4SHG5GW26N4MZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790147508" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326439, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCBLDIFSZZLQV2Y7XZ7UMY3B4UGBGQQRX636JW5GVCV3CFFMLFDJFC6H" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788841429" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64687353, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCBZ35Q3CFJGJS6GIJHNMTOFUH7FCYG323COCEEDTW3JWNVQQTZZ5F3W" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790722547" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64218714, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCC43U44RD7F2T54PNRPVNH7OW24OJ7MNGIOS45XWWOYPEMHIQTR4ZPU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788235181" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64470612, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCC45QCKSZ7X7JFX5MNVTXSLC2H3OGNINNI74TRIZQ3NYCRADXMA2NIA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789638838" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63539164, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCCCPDSWYDVTD2VSXNXDKWWNENSRTA637CHVHIIXISTKSK4FV6T7G3HV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1784408398" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326450, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCCKOGI4JF3PODDOKPICCGFIMWHGCRCEBAM6JW5ZBOCH3M5B6HC5HM76" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788841489" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64467517, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCCPDM7HRDZIVHIYK3JEPBQEBYNXLXM5CXCYT2QPBMMS3QZQOAO3MTXK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789623363" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64302318, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCCRAS23I66EM4AYUUEFVLMQYO6OQMPFXZWLCPWJYLPZW2RETQ324BRR" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788706835" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64398053, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCCZ7C7BYYA3RTGUY4YSE6ZT6BWYN2VBOUF53NYU4FU2O3HTCG6R5XQL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789240623" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64553899, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCCZVSEE77TOK6QTPLUNUUFZ5JOHFQJNXJCN63FBW6VEVLQ676RW7UV3" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790055273" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490356, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCDD35WKILCDXEKL275OFVXPZBYN2DCTOEIXJZY5W4A2ODWEXK3CU7RH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789737558" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64605481, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCE4LIJFKVHC7DCFHMTAURZFHXT2EWUVDOFMTKGA7WDGZ7VVRSQYNUER" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788438971" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "25" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64541639, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCEE54NZQVKEPPYF5BUWJHMGRORKIRJIXQYW3IFIMHTJIYLSBWPYCZ5H" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789993973" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64434393, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCEL3ZJPOL4KGX5AQ2V7D6DTV7XIJNSN3CLFDDBZUMGCPL3E7LCFWJXS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789443445" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64380369, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCETB2HL6ZPYZPJAGKTB2STFYYUBTFCIMCUHYIW5F5I5PJY2UPY6KZCO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789141967" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460005, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCF5B7O3MIDGYVQHKD43E7BKMZJZAVKZ57A7NYXEFDAJPPZOKCRUH7J4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789585801" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64222827, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCFCMBKVHECP3TLBPCC6QRHZJ3AVJDFZM2JGZDHJBW3NVVUV7TJYDLKB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788258532" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486944, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCFM2ROFIA7AGJ2UER2GVWIKTNWY6UZGYX46TP4FGX2CGJZZ643WVNJJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789720498" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64271011, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCFN7SN46VC6E766HPZRMBWISI5HVRMGWFFMWPDGDKM5EVPXSLZ6T34Z" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788532481" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63841346, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCFRGHJSLBUIN536Y2K4Q5KGKE2AXSZPQZW37ZH62VCYD2XSEWBNZWNO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785766706" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "25" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64336849, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCFZFN54GPXIVILU6XGGZXGA6UIKPAIUOQWVBEEX4RJHKSPEVKZ2P5QQ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788899543" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716248, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCFZKKIYA4QFR2H2QZZ4QHRPZBUU7XRILEQHNYB2FTYRSP7XGP6F645Y" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788685503" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "5" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64282809, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCGJRCKSLBMAKN7UHB5KEGDA4OVWCCT4CSXY7YO6A5BVMSSAMNJSOLR7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788598103" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258371, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCGWJGISTRZPSVTTATGSEKBE5XHWDLDTTP4KJ3DKQRFOE2EZ5FALKKXH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788461091" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64225202, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCHDPCUFZSMRCTULLNVGRLDAU3VG42MACAG76SQ3PIIE3M3GYPWU3JL3" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788272076" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64267435, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCHGHO5FAYP5EL2WD2EPSPR2CUYPB3DXU3HYR4PTGQQ7AIPIOOAYNSNH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788512260" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64576884, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCHHMMHY24Z5DAFSO7PS37DR744WTMNXBBE2H7GVHFR73L6KLXBTP4BN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790170198" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63704425, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCHKEMYKLQ2JJRYSZLTO2BWX4ZYYVBYIVCE2XHJR3BKOPSEGFSUNZOB5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785337582" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63765771, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCHKFLBXHJMUNZYMHM5OSFF7B4BUS24VZR4N5XN7HYA6VQDLOOKTXTDN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785680691" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64524229, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCHP34H33RESQLJTHX75EV33R7B76QGORR5JSY4KPRVGG2KPDKGQHV5O" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789906923" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489866, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCHPNUSRCPIYKAANV644FKTO3LREVQHJWQGP4SFE6UYQBIOTCD4A77T6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789735108" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495376, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCHUYYNNBZWENKQJVWJTZO4HBERGS6K4X3JZGKS2CJVDLLXN62AHAWRF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789762658" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258462, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCHWIOFZKSS725UWD7A345TELAOP5RPWLAM4IC5RVD6WWTLKRXPG3MKT" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788461611" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64596798, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCHYROHFWJWBNFR2T5DXVCORNFEWFPGX3LBOQEIZRTOVE7SBBJEQLCGM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790269769" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489426, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCIBOCOAT3JJJWEEGATGHLM4GFR75MDW5G66UXGLXKB27N5EOSKT3GFD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789732908" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496061, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCIFU4XBA4JFJNR5CJNDACNTXMTUCW5LU2XTZ5V6PYIGQF7MIQEYGUDH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789766083" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64324759, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCIHUSESSVBRHP4KKJXNBLAI2B2XR2LHA4EYZQHWSYS6S73EVPPFHOHD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788832063" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495990, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCIR3QJXGKOTEDVBNFAJOG7WZ6CWI7NYAHWYT67F5CD7ARKXYWRF3LAD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789765728" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64297866, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCIU375XLKJKYU6D5YGFWO34Q5M5THKMFDMJ2BVWDE54GYIKNQFQEXRI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788682004" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263422, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCIYSZBHHDAD4HFTZKEBV2UC2XTAN76SXZMHWQFS2SRGUKGLBSQ6VFQN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788489590" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599931, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCIZNL4Z7HD4BANS7274CQGSM7FE6TOBBE65PY36M3UKZF7XYWP3NVLO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785496000" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "5" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475152, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCJ3RRD55LWCG2TCBBTDQUO3A25TXKSRHFL3O4CW6KY2QQAZKAAATY5Z" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789661538" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64487840, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCJKAH52DQBECZA7D4MVBTM4XCZHXUT6QLMQNCEA3PVZYBZP37ES5TQU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789724978" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472864, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCJXSVV2IMRPOVKAYVEH32SX2IW5DULUNBIE6W7PQYPEP3S4CRZ25WDD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789650098" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64512660, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCK7E564LET4I42RNS2CEERKHCIUAFJLM2HNKK7M44IQRH4RB2KFPJU5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789849078" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258377, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCKAXQ6XLXOJ366C3P3VVLXU24X2UQ3YERWL5VNX2C77E6U7C6KTAAVJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788461126" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64437453, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCKDWMET5N7PWM6DOCSLPLFN37CAD3DQYEBGEPNWREBCHCNYQZWOWQFS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789460555" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63759100, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCKTSSYHH7IHTSOBY6GRSJHTWBCVAPBWW57D4ATBLTPJKZ5IPHQ3BV2S" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785643048" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473334, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCKU3LW6GRZPX4N37JSDO45UXVRGUJPPF7Y4DE7M5FFHPLA34OJENXEH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789652448" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64598273, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCKZ4AIZ7O5STRLXMX2OH5NQUDT5EN3ZMUYMRHFSJMUQYAQKFVTF4UXA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790277144" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64467784, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCLGABHBSE4VC6UCAIDRFH6TXA7AR5IVYMSCTRYE4ADIANSZFOZSGKZU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789624698" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64459968, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCLKCDVYTH24E4RZJWXYSZK22YEHBVFPQSONRYM6ETBOKQGKCEHBOGNH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789585616" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591832, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCLKENZG5UH2I67H5Q7WQRCTUI4EVJSHNRHELLNPX2BWL4QVDIZ62JES" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790244938" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64628300, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCLSG5YP7CS2YMJLBSZ342ZEDBXUKOSBOR2HGZNOQBJLUBQCFDZNTAPY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790427279" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64322386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCLTZEUNUK6KSTI6OKMZCXUXQ44VIS2NTSR7RWFU2UMDZSF2M3WPKBB2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788818816" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64260869, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCMMBSBKLGISFFUXFALPMILFN36PNTGAI4Y5XEJ374Y2JKYQHS5TYARP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788475358" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64626287, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCMOVEGYKVJPCKCMDLAZPIQ24WH2O7JVUJ4DT2TPFC67OMJ6VRTE4DHL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790417214" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64461324, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCMWKPM52AZ37VRSSPXTXCE5PKRT7OLFDWDGMBR7QA33ENDCRJ22QR3N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789592396" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64587172, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCMYZU6UFGB2MWTCCGNOAUQWAM4JUWDQDBS4GVB7HZBDDYOUGGBSKXRW" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790221638" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64600105, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCN5RTDME54YCDS4LJYWDGX3ASD6MYURMVGAYPV24LWW6KYWYDMDZKWQ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789724073" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "10" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64669903, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCNAQWPCISYISUCHA2EKGKYM5TFY2EJHEKZNOD5C6KCBUKNKIY3YCECZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790635296" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64611877, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCNVUL4E4KBP3S6P7DMLHL7G5DFTIOEIMWXWITBGY3ZIDZQJKOFGDYWO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790345164" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64513980, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCOCWSJFKR4Y6QB3QVBQ7ALXUJCRSIIZGJNSFTCDEMSEKKUZCGLGQES2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789855678" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64388854, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCOHSWSJ75CEEHNRLYTK6R4ALEDJWFY535UOIFVCFHNSJSSIPKXB3NML" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789189292" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460020, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCOMKVJBI6GIJFMOWUJSCTYBFABKBX636CHWTMWQQXCWUH2CQRPKR2KH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789585876" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64504838, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCP2DXP5RFSHVJR5MY3I2SV7TO3M2MB2GBWLXPLE5TB7X5ZVHQHHQZ2S" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789809968" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64278936, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCP6XZS6WEONXRC44RG2RFHGF35EJNWT3HBKF2FFNDOWCYAC653323N7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788576649" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64567975, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCPBFZPPLKE6OYQE74UYFWGTS32UHACB62TO5TJU2VG6NXY4VXBYWLD6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790125653" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223066, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCPT5TY7QL3G64O6LEDCJXULHXESZ6AAVGA5EUKKHGJSKODX4PBWSGFJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788259899" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63718136, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCPX5J4CXKA7KFIJEGUIR63SR6CKQIEGBFSAALMFLE5IURDHXJ66KFKL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785407007" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "50" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494536, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCPXZWNP7AD3MVOLQFKVCDMXITHI6ZX4LL5JYLS4XQNPEVTF7CCKXYMV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789758458" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63961902, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCPZOWLZOUZ6T7VGSNGSF5A52Z6GYZYAEGGGELKCNPHG27BAJVFGTDXX" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1786782756" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473228, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCQ3ZHK3EZS2KJXUPWYV4PUDRPSLR5BATI43ZKXEB4OTAUOJB4ZIVEWE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789651918" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489189, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCQ5VQGWHOKPR5MRI52TJNLOGJMQGXHI34FICOV47G2Y4NIDHPVDFR7G" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789731723" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64290130, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCQCPNPBFA6SZ5QZKF73HFOJIQ7Z65CAOAZW3Q267NFXDRVLZXXFKMG6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788638901" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426556, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCQDJQXVVAF7NRWSPV7BFSIJX7JQP7XVPGBVMXMZW5LBSBJV4F4EA6NG" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789399569" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460547, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCQDRM5YGEOTAXHU757SITYKLYEC4MD5HBHW3KRV3ODHSCSAJLTV2UA3" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789588511" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326449, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCQKGG22LREYEVUF4QAIMXT32SKGETGIWQZDKMYG2W6GZO4KJNGCVWXA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788841484" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263435, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCQMZAECNSAIMOVZWB7OFLJ6BF3JEL35KR42FG5WE6DIVT5TRLXFWXGG" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788489660" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490252, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCQNAOKSUJYW3UCOH42LEUQG7XCUSAHGYJSLSNLEVQPBFQL4YNFFK63H" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789737038" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64541558, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCQQRPKZQAE542XOF53KM7KESYPDWK6LA4EEX2FNUQAG43CL66DQUXHG" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789993568" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426641, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCR6F3I3ZNQXNC5GADLO6EOAKDWWSJV63VS6WXVRISAOV6OPMFAIA4IA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789400041" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64461282, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCRDPSDCPC4GRCOWCECNNGPHXIFKEJ5P4FUTDWZHH3FNAIR2QTVJXXZG" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789592186" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258413, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCRJ7WFLGZS7S33NX2PMZZOWAWBCO4NB4RVEW2JHVN44T3LQT7DDALU2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788461333" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475989, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCRQKLHZLAB7ZCPGRXRVVRHP6A2HDOBZUPTEW3WSLK23TPSUH7DB55BW" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789665723" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64336093, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCS25KIWHKS3WKUPSY5H73A7WXVWRPNGVOOJ6QR66OJYQMR5FIM5UGSK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788895318" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63519879, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCS5XWO3M72B6PSMZVGOSB3CLQVWB5OJ6Z7FTFAP5FAZVWS3MLO4Y3WH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1784300085" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494891, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCSYQ5IDWYTRFX36UAIUOLG6TNWPKTP5MJ73FLV5R4ETQ6BQORU6M4FI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789760233" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64459950, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCT3AH5JE6ZQOQDJ6F2HMYTXLTUXVZN2HGJC27IGPL6JPTXV4NURTEZF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789585526" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64468243, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCT4LA6TO7KJLUDMQXN7X5XFFXEXNCFXNA4UNZ52PS42FONJ2KKVAQ5D" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789626993" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494079, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCT5HH53MXGEX7OQCPRBM5VBYPWMXFTS7VFIAA77K2UDSOGXZONH35CK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789756173" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63696951, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCT6GPOIKD2MMPEAMRAKNDPFJMABOBRDBRIB3QJT2XQUYTAURPYARXBV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785295510" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64461590, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCT7FHPMHQHUWYJBZM2OP5EKQ5NWU7HTQJUB362GUFU7USCT6CERJBMS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789593726" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64304526, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCTKF7FJADL6CXCIAYFVXVSHPBM5UABFD4573MEDKIUXNARLZ4L2CVMU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788719148" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460461, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCTKT3UENMFXI6KW2TABS53AMCJFROTFK5Q5C2H2JJUROD2BEB36TXPU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789588081" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612446, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCTLMEFWQJ4F4VPJKKEAO4FZB5BQ354MGMB7TBNOWV63D6KN7ER34MHM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790348009" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64471934, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCTNYPODU7Q6RJ7IAYPVNKZZU477IQHYSB3XJNX7NOFV353MOAMHILWE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789645448" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64213364, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCTV72H24HOTG5QWNSRWCGL2L4FT4CWFKN72YC32K7VWFWKYCURWR5KN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788204725" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64495852, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCUKGEAU7QNUFG4CRDNJZYUA2XR3AETEVS6MDH3GF5DY5LOEYC6HDQTD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789765038" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485077, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCUKUSWC6GI2UMBIGLS6IECS2BVDDCNBRVFR4QUHXSKMF47MYBYBMJ5V" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789711163" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472299, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCUOHOGGKIGOYZAIN7GI62E47UPPJJK2J6BJYIM6YUEBVTRRE6NKABDL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789647273" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612503, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCUY5ASCBPOSSQXYGHGKEPEOMUD7IKHCQVZ35KE3SJYSYXRFYY4XVYIG" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790348294" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64469266, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCVE35GP6GPZGF6VNS3IHSZH4IDE2J7HF6GLIJCWA2HCG3PG7GSBYOJF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789632108" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64469572, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCVPWRGN6ISDMSIUZDZBDNGOQS7XCIRPMWFCVDNPC23TU4SL365XOOL2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789633638" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64312266, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCVRUOOSB53I2QNGBHMW4WMKPVULRKBYEIW3JPB56O64PMOJMCZGX5HI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788762291" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64312438, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCVTSJNMNWU4VRKNHCCAIMBR7WNOXIU3UFJVJ5HAAJJJYZ6WKPSHQGU4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788763247" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64620287, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCVWEC6C5VCJJ4YFNRNILAYHUWFVOJJULZUIITFN3MJHRJTB3ULVATDW" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790387214" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64606213, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCW7KCKK4T3KZBP4X2TT2UKYOZPJH52TPFDZWNUXUIW2PDVRDNZJUPGE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790316844" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64226031, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCWCR3TKBCT6BH6YNTEONYLRLX57TOVWWANPY4S5ZEVS3PJQQXVQIDS3" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788276793" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64461757, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCWHTBWPD4HWLLFMACPKJ2HJ25RUFZHYS3BTR4O3ELRZIYKP6HPO3EWH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789594561" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64477157, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCWKEG5HG6T6UCEVRIO6NYFL76WFTBLKMLBDZR7X2TPTQKSVOSNSJKAA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789671563" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64468478, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCWLN5A6RRGSX774DJVVK5LADW6QLLAC2CDJVDY3UFVSE5VTSN4SXCGB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789628168" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323197, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCWTN3KRQS6MKJEBDH5PSMHQEMBECARKJPO2GKSFIR2AA2QQGSDPBP6M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788823350" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64464478, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCWYCR2NNOZMITJBLXGNSFAWT3YQDHXOIPUPCONCQZPRAUZGWDNGNM7M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789608166" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716883, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCWZYXNRZLK3XNGUYH36UZZRQGEU47CRUNUPKYHZP7PJFNHBZC7Z46EP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788824479" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "5" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64471247, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCX3NIFZEBAVU6DHZ4O4ZVJYTEMVBFDXVHX6V6PV2N4EYPCRFBP7GW3X" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789642013" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492879, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCX4YJNRMCNCXBH3DGZ7HWAXXLXFBRSJWU7BNNSEDMREYSGL35I2AN5H" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789750173" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460194, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCXBQSOZHBFYUZBWGONLK5RYUBVJCOGS3FNLYIQGJSVLDWWOXTFHQXNA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789586746" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64488011, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCXEAJ7WYM5ZR5O56OHCMWGKCHRSGOJJVRGSCVNNLSENQXDAGIVPSU72" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789725833" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258581, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCXIXZGYK6Y4WM47GDIWEQPG2Q6THRXQTWVJX5QFX2E3UABEJPA5E6MW" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788462290" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64484974, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCXQ7ZGE45A4SCBQYRNZS2OD3MZF4KSELDJNBEQOKGOR6RKTY6OGABUZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789710648" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489421, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCY24J546DBR2A7LH5MVXCSSOWANT5VGFNMTALZSL2CP5I5SMCZWEZO5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789732883" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64302349, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCYNTQNZYQLRF4ND3FAWGYFFYN3XSAGZF6WW6IGBTVRQXPIQYP5WRU2X" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788707009" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489920, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCYTEG5PSMVNZ54LFTEHRVXACO6ZSXHG3XJE47XV7JO2MZAAFVKDLJWE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789735378" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494972, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCYU6TZWJWSI7MZM7YYY23QPSLHAFVI5ME45GXMGLAQMWR7LUUZBCQ7O" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789760638" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64491248, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCZ5BVJDG7OVI6GUEA3GPBGQLMJLSJVAFND7QWZUEC4KDYMB5HSA2SFB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789742018" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64491978, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCZINFPZ33TOWAMT4A52UU7P5ZZURRYFQUHP2N3RSSKVGXHX6AWDWCOD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789745668" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64477709, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCZJMNAUIQ2U577P4RA6JQNRX6LABXZGQWBCJAKERN46GU457K6C3GQW" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789674323" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490309, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCZX6DQOVHSUZRYDXPT3KT3DXTSTNTDLFUC7RIXOOEJNQHQ3RKOLFLGO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789737323" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64306646, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GCZZV7L6SJY3KDPUCSXD5MQCXOYSZA22WTXYX62M3RBCRNXE7J4ZJHLV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788730968" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612480, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD2DEIBYTR4H6ME44J53Z7XQOGDDZEF3ZT2SGKXIQXTW46QFNMUT6B3D" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790348179" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64238973, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD2KSWPRAFE24PS7ZRJ6JWTB4HA4HMPODUK62KTTTQTP6WWLA2N6AXZ7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788350509" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64364439, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD2NW7INAHXPCY2CGXA7K74QVA3GOB7M6KP7DJNDAIEHVSK4CROWYNIA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789053414" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591821, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD2SOPA77HAN6FUAT7XXCTC6EVRL3WWN5OZ7VYNZY2WBZP4RKNQVV2IG" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790244883" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64477401, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD2TU6DH6AOY7HB55FG7IOS3P7OTG2MORU7WGAITOCIWRHEVMST7VHKG" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789672783" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64224328, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD3GRPQWN4AN53RGQLQ3EIKG2WV4LP52BD4UGB2I6ZBCUOXJTES7AKLC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788267067" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258411, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD3LSEUKWI6L3V2DI4DXPKYKMT6EFCFTLEWOFE54S3SXQNI7PDVEVDOW" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788461321" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64468138, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD3OYC53652NLYGHIKEV7EJXRUQNMDQYLEHTLPAHRXCX7D5YC6IE4W4K" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789626468" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64329545, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD44P5UZ4XJJJI2KSHGYXHYR2R44Y4KLKPH3DQDKPBSJD65PSWQKPXCI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788858737" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263603, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD4DPZTV2HIQOQWXGOSZBXQE7HLTH7Y26HQH6KPWQIKGQ2FAS7ACV7MH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788490595" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599968, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD4N2RWP2GD6I22O2MVUGTSEBGVLFR2XIRC5OHIQ7K6EDPOJRSHAZRXM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790285619" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "50" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64484958, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD4TLJK464ZPC46YYI23BZSULL6BV7ET6XUR664NZJCQTEJUSD7QV4DA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789710568" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64472919, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD4UNF3UMYMI3NA4RZGPRYIDELND3RAS2LV6LTJKNKWHBAZVSI4GELOG" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789650373" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426634, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD4ZUBMN7HPBN3YQPIFNL5JQICVFXZFXIQ7Y2T7MRIDHXMOLBBGD2HWS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789400003" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263850, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD5AVPHJ26B4NBSLDUAUB7HI3XBFKUKLNOHKKK6EKYHB5ILTNA263PDB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788491970" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263420, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD5B6W6W7DA5EJQN2OX7CJAVZW6EODGUUSGHBNFA7DSBNDY7KFDPLWFC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788489579" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64467873, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD5CKRV6OXVP3BDYJBOWILOQ6XSSWUHCKLJB32APPZLIGCSFAFDIL4LU" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789625143" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494791, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD5NEGKB7H2E74FQPY2ZVZRUGPHW6AVJIVUX4TVNZXVZATLWAJDU7XYP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789759733" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64449773, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD5PABD6RFOAKVAH47H2RNQDPS5HWGDYXM5N7LPEMZ4N34CH7QZOW7HL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789529543" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485368, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD5WCLJ3H7VGBNJVZR5QUYRQK7DATNZERK4M5DXJVWOLINRRETDDNCPD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789712618" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425347, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD6L5SNMVT5SXUG5OGXLGWQDBNVGY3OQFXPEZHA53PNEE5DAXOX4CDH4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789392774" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64313851, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD6UB3JOFRLJ4DJAWJ53GFG5FXBJSZITL3LG3PGSQRLXGWRTMQJNQA7B" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788771121" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64343901, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD6ZYOSMNEEZAIJYKCDN7MDA6H2MUHQKYKM6GIYEQ52JU5GI4SSGMWL6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788938876" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64682851, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD72OUK755JAZDSCVGBRDASBWYLYHRZSMGZO3EEVEBPDQ56NM2TFTWLE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790700036" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64434381, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD7R4BI47Q5R4EUYN3AZ5EV4ZMMN2DRUG5DOSQS2ZRCYQLD2OICI3CLT" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789443377" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64489834, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD7SSVXIP7ZX4NLTRVUFX35HSPKN6VNRAZ5GKXPAFFSCOIKINDFTU4PA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789734948" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63698940, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GD7X75IVSNG2O2KULMFUOFTXZEIGMRYSVIJRUNQ74RSVOPA6W6IRTZ3S" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785306731" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64306238, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDAHCRUEUXSLIGGYPCKBHQT2TWFTNEII62GAHGJETGOON5N4I6XPLFVA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788728696" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263931, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDAJUBXRQBNAY22B4VN7SB4YSQ6FAUDXPOBT2QRFICJBT4OX2UY5JY77" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788492412" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323999, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDATYNHFA7NFTK7NORYI2HENINM3LJ2MA2BEFGYK46POPG662WHB524H" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788827825" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63704093, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDBCHE6ZNZRO6PEK275I5AT24LZ3JGKIQLQNQMOPXAUQBQO3NQW5QDY6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785335721" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426553, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDBTK4QJ22WZC7CD2I5KOBNVN5AIRU3DD2EX3YZBLV7M46Y6RYUNCDLR" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789399553" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493726, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDBY6AK3PTYQFDF6L3AV2RQE74V3KSKVJAT7GEV6TPCX3KQ7C6QCKPZD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789754408" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64588115, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDC25VYWGWCK265BS6MKGYAUCBSV3LVQS4LUY33PUOT6S5NUNOEPVRVD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790226353" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473042, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDC7HWCF35MCND4IJBTSVBOAKR4BG2HI45R345ERWFQGML2HS7KGGDLQ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789650988" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64468385, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDCK5HVRB6VNDYLPVEFHJ4C3CUWSVPCCZASEAMXMZ7BQ2LGV7V777M5W" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789627703" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63597602, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDCLE5VYYAZ5HYSBSG3PIKQEXHPYNSHF2W7PSW2R7WEIPP2AD275EL4S" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1784736975" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64221156, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDCM56BZLWE46BDAXPZFSASAXWW3YQLPZY2AKF4FILXNDPREOVJMSONX" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788249043" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64330470, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDCTZYDD3YXCXSA66WRLLBYYM5Z6IWITBSP3T3AYZOC4RUAIFS6GJNM7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788863901" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64267243, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDCWERABAN5YJAUTDJIXNMY72J6CR5IM56SXGRI2W6RCI6KXPL4RWBAE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788511180" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64323907, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDE2M7YEYHQIJMR4I6HD2AHUVJEYPMRSHY6KLWM2C6CIJYVYHNQW5JJP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788827307" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63915830, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDE7RW7OTHYKJW7HG6QTNJREEI7G3HZ64EYNADL7KAMYH3R3WJPLU4OO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1786524280" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64242187, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDEHJYBPFQLVO4YIOG6USXYIZYHSBLLTIH5XAXX7ZARLNHTXPC6RQUQG" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788368864" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64431030, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDENLMKPPVI7HYVJWRJIB6Z2AAIQNUKT7VSG6VJW4WGR3VAC5MAY6IQL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789424640" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425555, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDEUNFH2WAXZC5VPHTULLKE5I6VJMRWZHDN5ZGL3DAGLHMGSCBHPJCPC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789393945" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64338628, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDF3OS65FPM6U6VJZZIICA22WYOC5QC26KVXWMY3I7W6L57DFBD5KAVR" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788909461" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64730224, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDFGP2CRVW27SRQWQWVEM2A6OFCJEC45LSYE6ZNBQBHLFYMM2R5KDMEQ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790936902" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63823605, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDFX52KLINZ33U7HWDLHAHG4XIQURJT75P5XNRRKLSEB265J23ADWK4F" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1786006500" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64520917, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDFZJIBTR7JFFH5MSTBWVXPI3ZB5VZAJQDYRHAZ3EHK6TCIMW4NPVHWV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789890363" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486586, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDG6HMIXS7SIU4IBZGZC2SVBZ7VANIUK74P7EHS7M4L2STRAJ3LZDXN4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789718708" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64597855, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDG7PLWBZGNHFCJ77KGLPUCJQFEXZPU5UFCWES5XWB2Q25UST7WIV6AD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790275054" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64474671, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDGB66J3UVNWGETROC4Q5UQL3DUICIGLNTE5NTFQDLKUKY3JBUMAFFAM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789659133" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64297394, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDGCQALSTXJXNXJLVWF76AORFM6EBQXAJ7QPWIV73CI2YMERMDFFAWTO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788679382" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426140, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDGH345DWYQUQJT3LFED4SVRVTGYYBP7MWTWXDAJTBDBQA6HG2E3KRD5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789397236" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490798, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDGNENZ4B2HIZOXO2LUVTI4MC3HIT6LWOX2LAMTMGSGQ57MSFE5ERJIT" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789739768" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64426572, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDGR7CBKULHMNJNCWPSS3TMNAOWK57PRKRQESDKZCR6LX4FU5ABFDUBR" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789399658" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64491027, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDGU3HWNHGZX3T7LERAOCP73TYESCPT6QYOXNBY7JPYWIM6WKJWHSFCI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789740913" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64493318, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDGVNX64C46N2RGQ7E7EW4RKBG6PZ54MPWSWSSOYZA2LVSLY3NXBSC6R" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789752368" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64731045, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDGZXEANOXIJRO5CGHDUTWDARC43OBEFWZF2ORWCMGTMQD6OELJ5VQPF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788514837" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "5" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64400758, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDH3X6UEA7BDMXY4HNQOM4RYAYSJNUT4TFSFWMF2F3ODG6FE7MZ5IMZK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789255690" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460326, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDHCDT25C5QBTGCRRSNA33ZPKJ4KM42YDYYYBBRR6IKION3RACRY7KEV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789587406" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64218939, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDHDN5WIU6ZA47G5MJ7774VXK7BGKJWCHUDOCZ3NZBZHWNUL6YNWVQ3G" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788236452" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64718487, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDHEFAG7XPZ4UZXDT7OT342PYTCF7OQQ34LZJNOWK5CLRLTLXJAYENKI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788452032" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "50" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64224136, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDHTYPKISYKXU5FRKP57HAE2IGPBOI3N4DNGL4WZ3AIPWJUVRKZA5TFL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788265975" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64221063, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDI3IFSW6CZNMF7XMBME6YYUDBE34UQ67QZR64PNRIJSZUR6YFH7UI5L" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788248515" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64325158, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDICQM26HHWRJUD6N4W552DMI4YBWLXI4QNAOIUO5G3KSRKBZIGUQJKL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788834289" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64563529, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDIFMYOSTTEWCFFRQS53JEQ7MFXGHG77I7ACVJKU4Y72QBWP5HRI5XF3" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790103423" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367176, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDIWDJGCMGXXYGG6HPLNQHQV3KFOYXRKBSCKJZZNTMXELIFBS4D4ZSDK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789068602" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64367049, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDJ4K2KHJTAM3MH47NXOOPCRPKCKRVS5VLVGIBEK7BHVB6NPJNIOQLGF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789067901" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64459960, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDJ4LE4FGIXQW7P2BIE3HWX4FNQ6SVMMGHWJFP53EXZC6L6WISTMVY44" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789585576" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64511447, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDJ4W5TOTWIUWSKKGWGT4UXEZNHVEGEU5JHSASXUYT7ZSZV3ZY7HE3VC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789843013" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485712, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDJGUSUXUPXUOTEBINV4R3WHQLJ5AYTXDCCT2HGTMRXR3MIR5T5TS6CT" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789714338" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64486148, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDJTYHSIWQG35TO6YFFJ6GB4RWFFJH4FMWQNG6BW7DGXHBIWESZXY66S" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789716518" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64717681, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDJUY3N2IVMYWPWL5CHEIGQHSMBQROELUHF4QTIMC56GVO27FLKDEPUS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788626847" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "50" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490164, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDK2HMIISZ4B5RR5EEA726OJEVRQHHZJHDM7SVB2Y7K5XCRI33QIVU3H" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789736598" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64260936, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDKL6WMF2QYVGBULCHGI63WPRHX5HK2GRAWQCJXSRNS7QZP3A44JQQV6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788475731" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64471406, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDKMSQYPV3M2ZOZ6ELXDVQF5YWYEZPJIQA2XODJOGHZ57PE2XAD3BD7O" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789642808" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425564, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDKSGHVOWEEVLKW7WFNR62N5DRVTLYVSMODJ4ZSKB4EFR5K4LGOIGSUJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789393996" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475716, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDKUM7DIQRFYVSNSOL4LT6HVZUH4AGLBGSSFUIT2NSLKLN6D3J4IUNI6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789664358" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64508710, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDKYCASI5FFF6KE4YLCRGKEEDCSMZDWFWBONKW2CEBWM4AO3YGJQTEO7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789829328" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490475, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDL7S4G5BGQECSBNGAVTLMZTICV5MSO5GNPRZBNJEWDXWR5NENHUEM3U" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789738153" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64327476, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDLHMVHGWSZSE4ECKHSVVE56NJSMUXLY3U7ZP2UMLAQ3MMHJ2AF7HV6Y" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788847211" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64225488, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDLJ6XRY7X2H6QESUS7E6Z65URKQPYWW44FAUFRLZQO6DMK4HUBWLJNR" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788273704" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223738, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDLKJIHOV4BOBWWKZAKVVHYGULR6NNGTR2SB5OYTROGMSGODVJIZ4BH2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788263711" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475391, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDLVB47EHGB6DBTAZHC24N5VGC5B5JGAG6NTBJ3O23JXLONDWLIQVJVL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789662733" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64580142, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDMBA5ZEC45HNJEO4R6HV6X53LDALAV4PBI22KGJL4X3WVFKBWGAPFUM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790186488" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64469544, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDMCEQVUJKDSALNJBXGT3CJJMBKTBPGBUEQCHQ2V3SA2K73TD6PE45PB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789633498" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64591784, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDMD4IUM5SFVHRWS6XGM3RW32QEKP62OJRK5M64IUCKNFQC4N4R4ROTO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790244698" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64315352, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDMGYNO4UIGSZP46GRSUFR6IZANBMAK4XECGYCI5N5UIWQCTRVKOJWW7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788779476" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485920, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDMHMOM65BWYHVYJRXPYDCSXT4WPP2XMZC6OR5V3NFNJWUEXQR4YPUX7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789715378" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64594105, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDMRET55PZBZHARD6FAIDUMOEVTCQYEQQ4CCKMBVEESF665D6D2MJUWT" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790256303" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64468311, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDN3AFSFOCSZLVNHTQ3VZYFT7DEG5N62AOY4M47AD3EGMKFCMJCJHEYP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789627333" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64726495, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDN6VFHTBQN46TDAGZYUZYZZQ7HLH5VPG6W6ZCVCBHASWZMHRUYLTYFV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790918257" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64566273, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDN7G6PKUMWAHTSM45QMK5K6TLGLXJYUTMOKDZQI6N3GHTNU2DBC7IDS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790117143" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425379, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDNC6UMPK62ZGHRT6PUY7LRLIJUZ7SWGLTF7XPDOYHZWC3VKDMT4ZNFM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789392953" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716274, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDNWNV2PBY54YRL45GVHRDHA737SEPL6BZMAKRI2IDRKUEP56GERIHDT" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788278674" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "5" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64473706, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDO3D2K3TFJSEB7GFKMUGXVCFFIEXRGNPXZTRJ27KQLYEZDDCOBUZV74" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789654308" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263445, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDOAQK5AK4Z3TAFIMU4WMVJSVZECLK2NEVPRGG4CSO54ZWHFHBE6IDMI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788489715" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64326796, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDOIC3LPD34KTKRTFOAMB6CKAYZNOIGV5V7H5YESTNMFSQ5JG5PMFS3P" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788843411" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485768, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDOIL6B2FMSGQQ7SAWXGOQGHCUMXT74JWRU2GTUSVPUCJQBTBRXA6WJX" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789714618" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64461300, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDOJ3XPIAHCYG26SGBSJY6KJDIATCNHEIV7WGFVL7WAY5XX2KRDVA47Y" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789592276" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63797837, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDOLDNZW53TF2GI7QJDO24MXNQ4FKM57337MQEASVW6JTVEEXU6Y2KZJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785861645" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64555965, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDOLN2CLLI2KI6CVENF2NWCL36NBONRP64P5MVAIP5CPT5QWQCFYYWYV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790065603" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63732347, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDOR4CPOMWGJIYUKLHUAWG6YKG5O54W6QXU4W6HSB5I7UIZ3GK3LFGDX" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785493750" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460486, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDOUKKXMYTORXE5AZVRIGLPPNK4Z4XE52YF5M7YAC3ZGRSFUQ4LW26AS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789588206" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64304381, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDOW4EHEO6VVKBOM6YTPYPZYOL3T3XS6GXYYGH5LZJRTMTGPLYWRKAPI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788718340" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485531, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDOYOX7IV73G3EMSKVW2LQ7PZHEJRUCCJZELS63JNY2LL6VE4D4QELGP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789713433" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64494282, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDOYSYHL5P5MJRW2GSJLYHPB6GNSR7W5CUHFK5R7UGUUVCAQV7W4OSUM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789757188" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64227084, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDOZTWK5JDHIMGQKMZCKC2TTTMBOJ5ON4DUI32EJVJGMV3O7IT3GBQYD" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788282777" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64239296, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDP25U2QVO5LSHQRG36UEFV3EU2B7SGI5QSKBWHMGZILOYQM5T6ZLDFL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788352348" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64223757, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDPCS6V3NLGLBOUETLU2NR6R2WNJXQFISONA7YXGI2ZVDRDZDD2U2B5M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788263816" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460210, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDPNRNOUICLSZXPQDIHM5XUCXOOLJB2YCXK4K5ZM3LUJBOBH7L3YM5UM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789586826" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64703375, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDQ5KKVQDXPYAFQ7H4YG4G7W2NJ5S3UDV6MN4EICCTUXHQJ5GRAPGALV" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790802657" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64700907, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDQKNUFEA33EKGNDKZ5W5PSRLADVF7563RLJW2MBCLS5WAQVOGQUI6SF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790790317" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64474721, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDQMGTGF42JF3GYRSDVOR4NUNYHYWJVZNINKW2SECKIJWMWI5HBNKBGJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789659383" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64222468, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDQPMKWYPYENXAPNJW4Y4ISFNL5FYXLWPFL4TZ4M6PRGL7KIDGXRWNIS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788256496" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496870, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDQRDTCVMLJ4ADBCMN5HH7Y4WH4S7RHZWNQJR4GEVNTIHQEMFA6FCY7L" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789770128" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64716395, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDQRHRIHCEFBBBGV25MVVV4CPOZKGC3L2WE2VEAJP5YU3MGYSXU472DT" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790051708" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "5" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64567927, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDQRMSPPL36367H7GTGY737ZCMERZIODQYBUSSKQZ2KKJQXVP4J3KICR" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790125413" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475600, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDQSOTBYHHIXA2FMZR42PMEZO4XKE6EMP2STQZFBM4SKCTMAUBJV534R" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789663778" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64509162, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDR6352AOYE2KKS4A57SSNVFZYZLTNFJB2RB6I4MBXXLEDG735CNTP4G" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789831588" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64423336, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDRA4YPSRYDIG5QPAB2WISP3V5SGRCJVID2MZHI7UVCPCZGB3JWCZZAZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789381482" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64715256, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDRDXLBZN6SOXMKXIUNRWNJTMHBNYMCL4666LOZATBLFYYFM2RQMLXIF" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790862062" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64224536, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDRFU3O2YWCG6R6QE576GZF6ZYB6ZRLVP4L2Y2LCDDXQZT2D4YUMGNYO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788268254" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64394379, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDRGJUV6A4BPHZAFQIPL55YVZB2UIGUGBUF2V4C4KYOOMXGJEMNOCP5W" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789220102" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64612563, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDRHUIBUERSVOC3VFMAFDY3YDYDUV3RWRNCDFCSEWBFJSKUNFDXLRDTW" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790348594" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64333666, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDRNFVUHSAEFPJ6RHROZNL4PZODJQAGOPUNDY7XHQKN7QGNFJZPNRJ6F" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788881743" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63821441, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDRWD47XEINX2Z2XZMNYEDHMHQU42HTYIG6PCPJ3K2ZVIGRASVEQ3TDI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785994331" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64496508, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDRYC35RT3XY6SUCLZB5KQU5VT7MBGE3TY5V5FVO7REDKJBISJORXGRB" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789768318" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425675, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDRZ3DFYOVBOOONOM6UWYINJLRE4BUSOXCEJCKWXOVU2WOC7XT6F7MXR" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789394621" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63829756, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDRZCJDIVZTOLCQRQWTVCB5UUIJOGD3P4SUZ3PAABWXQJL63O2OFJ3XL" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1786041232" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64258239, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDS77QN77BBHA6NVODQMTYAJTBAIFPR6GANHXNYLYSRYEEBDNC7UXIAJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788460345" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64475436, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDSI3K3CUBLRLSYLKKFBS7LBQDFPY5RHTCTPVFYLHPVFENUSWAZHLKPC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789662958" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64327745, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDT3QTEWTO6MY4UDP6OSQ3CBBAYA7LQLFAMS5SDIA4BZIUPISEJ4DVXA" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788848711" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63802667, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDTA266QWIKI6E3DQ74VDNWYTIQYMLGEHMO5UXBLLWCADKCS4U5NXRI4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785888801" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64240069, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDTEKTRGDPHBT5UTUHYTJR3JDZDPAJ4ZNKFOUROFSDZI72POQJM3RBXK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788356750" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64460717, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDTFYYFJIR24E7P2BIGCBHVNXYT27GA4FZXSLH4MOU2JY5CG7FGMO3G4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789589361" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64425382, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDTRBLSF6K3MI2MVS6DSLEHWRKHWUE74ZF6SE57VHFSL463TY2L6QX7O" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789392970" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64469025, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDTWISBS4CUU2MIMT4SKFJA4VRTVJREOEWI4CD3SYALC6YID3VLKOJTR" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789630903" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64267007, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDUHWGNSL6WL4IIYKP7QMEC7H4CAOX5Q65QG7JGHCPBRRXALLSE6WBP4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788509829" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64599968, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDUW2GJIT56XTAEF4ACXDO7PFUXE37JDZXS5OOMO73UEUZD7BXALKZ2K" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790285619" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "25" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64492790, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDUYVERC6QT6QQZ3SCBIZYRAJH6E42JZQHUFG6F46Z4Y2OM27BK4WO53" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789749728" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64450709, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDVDSU3CNEFFKIOJ5V5EH2YCLERJKXT7RHYJNBFPIAADIOAVI4Q4L37F" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789534767" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64263476, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDVGNWW3GMZE7TNCBCZKB5UZJMECGGLG4XB3FJGG5NFNHICRXWQF3AAQ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788489890" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64318412, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDWHA4JM3W57ZZMIZBZIQF4H7PZOACWVR2ZWOI34VJLBMFB6TCAH7KP4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788796568" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63893818, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDWP5XDDVZBSWMKW7EQCA5CJSQBESQFTZCY5A2NS2KQIHU6FQXYEBH3P" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1786400685" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64266923, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDWPPPCOG4TOKR2NFU5WYDRTS7JQUDIWXHGJZ7W4DILKOUGIMZ3WWBZP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788509352" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64490589, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDWVOFFYGIYWYTRKPXMNUES7NHAJWEUKEUL423DE36R23TAJO5Z7Q6LT" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789738723" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64509037, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDXFY7DJAEC5DFZCA47RTODIIDYD4TMNWKCURPSWNQQN5KR5EONPJELX" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789830963" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64318501, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDXURAFHE27EXW2L2HE4PQIWJEO7MXNROPZBSZ4XO2HQWTDNA4REUD4U" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788797066" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64477471, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDXWOPPTSVVJYYQUTFMOZOGOAW2XR3UVNAMBHG2O23UNYNVWSOTLRD5H" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789673133" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64467025, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDY5CM5TZ2GJCN7SZG4O7QPCADYA3AC5LL2KJICO6NWOWAVZY3IFLDWE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789620903" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64531377, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDY72TZIFIC47ZLEQHKRSL3CLTHJJZMMNEF2RQNTO2LT6SKWRTJHLJWI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789942663" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64461243, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDYBUUG7OH4JSKHEC44QXTMNFXU5B4PBGB7UCCIFPVWTN7UTLWAW6YQ2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789591991" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64255151, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDYEUWPLNHSIZ3YC5B2WTFF2EFRVCHLEAE3BN4IMY2PIVU5OW6BTYXTS" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788442792" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64485231, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDYKGYYSOGYXBOIYOOO5MNZKVT537H3C2T35UIIXWKVXTZRLOKR7DTS5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789711933" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64304443, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDYNXYBKJV7RAMK27YIYQM76D4BVBABQSQXXE7DSTNDPXEZXJR6IMDJH" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788718685" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64324423, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDZ2HV576TOUH6MXE5NR3NOSZHELDXRQ2ULBZS3IKNFANRMTU4FTMIUG" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788830187" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63721916, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDZ6D5YSA4YEQBAQRKUYSM2SM7A2Y4HWMTK2RALRVNPFKD4BYMVVVVJ2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785435501" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64596118, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDZIGG5CNRL45CAWPFYTJ7K6JP4XJIS7DF6T3OIX4NVIU4F6C6E7JIH5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1790266369" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64218378, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDZO4QPQWUORXUSZLKAGNRFZ7WUKHSIYEAPJAF5H3YHAHMK43LEZS6EG" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1788233274" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 64463711, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDZW3SV5L7BBARXSRPGNQEL6FE5LYKKTKS2ABGKEATXFYJU7RHGPP4ZR" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1789604331" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + }, + { + "entry": { + "last_modified_ledger_seq": 63812176, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", + "key": { + "vec": [ + { + "symbol": "Profile" + }, + { + "address": "GDZZNAG6WUMOMGZ2PZZEUSF4JLDZ67PNHQOGJPRRDWZ2MJU7H2AAIYGZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "bootstrapped_at" + }, + "val": { + "u64": "1785942253" + } + }, + { + "key": { + "symbol": "reputation" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] +} diff --git a/contracts/compatibility/fixtures/manifest.json b/contracts/compatibility/fixtures/manifest.json index 0c36476..b1992f7 100644 --- a/contracts/compatibility/fixtures/manifest.json +++ b/contracts/compatibility/fixtures/manifest.json @@ -1,61 +1,29 @@ { "snapshot": { - "file": "mainnet-state-63617727.json", + "file": "mainnet-state.json", "network": "mainnet", "network_id": "7ac33997544e3175d266bd022439b22cdb16508c01163f26e5cb2a3e1045a979", - "ledger": 63617727, - "timestamp": 1784850182, - "protocol": 27, + "ledger": 64747647, + "timestamp": 1791024017, + "protocol": 29, "events_contract": "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", "profile_contract": "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", "capture_script": "scripts/capture-mainnet-compat-snapshot.sh", - "sha256": "c5cff0b8668c985adef50d9f24568fbd23d510ca3e96da9a3c7c4f6f779d38d0" + "sha256": "177c904b2f24ad2300b57a317fe750a58858180cdcef052f9472c1f5fc2c2a06" }, "wasm": [ { - "file": "mainnet-events-1.1.0-sdk23.wasm", - "sha256": "2a8789bf5dd392b91ddfe6591072a0cb9fae70045abf379fd1dbbc2db4af1de3", + "file": "mainnet-events-1.7.0.wasm", + "sha256": "b87365c16102f7242a8fc3e770f615991841741c40673bb241cb254130be4c26", "source": "mainnet contract CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", - "soroban_sdk": "23.5.3", - "protocol": 23, - "runtime_version": "1.1.0", - "contractmeta_version": "1.1.0" - }, - { - "file": "mainnet-profile-1.1.0-sdk23.wasm", - "sha256": "b9e3500cfb559781e68359655f37775c78afffc5a8436daca9d1d1f8e3569b02", - "source": "mainnet contract CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", - "soroban_sdk": "23.5.3", - "protocol": 23, - "runtime_version": "1.1.0", - "contractmeta_version": "1.1.0" - }, - { - "file": "events-1.3.0-sdk23.wasm", - "sha256": "6566d9b29d3880bb31c5c5ce3a3a7b7f9d0a085da5d51de01cfd611e3614f2d7", - "source": "commit 57aa591", - "soroban_sdk": "23.5.3", - "protocol": 23, - "runtime_version": "1.3.0", - "contractmeta_version": "1.2.0", - "note": "The source commit changed the runtime version to 1.3.0 without updating contractmeta. The fixture is retained byte-for-byte and the runtime version is asserted by the compatibility test." - }, - { - "file": "events-1.5.0-sdk27.wasm", - "sha256": "31b27e9d5fe554e0710161dd9387693e166bdd755d985a9771b1ed71b9e28321", - "source": "GitHub Actions Linux x86_64 build from commit d5959d0", "soroban_sdk": "27.0.0", - "protocol": 27, - "runtime_version": "1.5.0", - "contractmeta_version": "1.5.0" + "contractmeta_version": "1.7.0" }, { - "file": "profile-1.2.0-sdk27.wasm", - "sha256": "d2d025d0f7c2c29e6dbd95401841cf62b8b61be608c48615cffb5934050890c0", - "source": "GitHub Actions Linux x86_64 build from commit d5959d0", + "file": "mainnet-profile-1.2.0.wasm", + "sha256": "6b4804920a4068dfdcaaa711fac6390850e0a92f4b5ed4e46259694b61cbae12", + "source": "mainnet contract CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", "soroban_sdk": "27.0.0", - "protocol": 27, - "runtime_version": "1.2.0", "contractmeta_version": "1.2.0" } ] diff --git a/contracts/compatibility/src/lib.rs b/contracts/compatibility/src/lib.rs index c9f5419..69b885b 100644 --- a/contracts/compatibility/src/lib.rs +++ b/contracts/compatibility/src/lib.rs @@ -1,770 +1,374 @@ #![cfg(test)] -#![allow(clippy::enum_variant_names)] -use std::cell::Cell; +//! Replays the mainnet upgrade from the deployed builds (events 1.7.0, profile +//! 1.2.0) to the release build of this tree, against contract storage captured +//! from a mainnet ledger. Everything readable before the upgrade must read the +//! same after it, the records still in the pre-1.7.0 layout must convert, and +//! the upgraded pair must run a grant end to end. +use std::fmt::Debug; + +use boundless_events::types::{ + CreateEventParams, DataKey, EventStatus, Pillar, ReleaseKind, WinnerSpec, +}; +use boundless_events::EventsContractClient; +use boundless_profile::ProfileContractClient; use soroban_sdk::{ - contracttype, - testutils::{Address as _, Ledger as _}, + testutils::{Address as _, BytesN as _}, token, vec, Address, BytesN, Env, Map, String, }; -mod old_events { - soroban_sdk::contractimport!(file = "fixtures/mainnet-events-1.1.0-sdk23.wasm"); +mod deployed_events { + soroban_sdk::contractimport!(file = "fixtures/mainnet-events-1.7.0.wasm"); } -mod old_profile { - soroban_sdk::contractimport!(file = "fixtures/mainnet-profile-1.1.0-sdk23.wasm"); +mod deployed_profile { + soroban_sdk::contractimport!(file = "fixtures/mainnet-profile-1.2.0.wasm"); } -mod pre27_events { - soroban_sdk::contractimport!(file = "fixtures/events-1.3.0-sdk23.wasm"); -} - -mod new_events { - soroban_sdk::contractimport!(file = "fixtures/events-1.5.0-sdk27.wasm"); +const SNAPSHOT: &str = "mainnet-state.json"; +const EVENTS_ID: &str = "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ"; +const PROFILE_ID: &str = "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC"; +const ADMIN: &str = "GCVK72I6TVJVDTTY4UKU6MQT4QJ2T2AAG3NULNEUDM46L3UOQYDSO4O2"; +const FEE_ACCOUNT: &str = "GADSIP2HPINWTMEUNMVYA5NJRL372OV52HDEJTRTLDZXMHADIPQNYH55"; +const MAINNET_USDC: &str = "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75"; +const PAGE: u32 = 90; + +/// The release build this tree produces. The replay upgrades into the exact +/// artifact that would be proposed on chain, so it is read from the build +/// output rather than compiled into the test. +fn release_wasm(name: &str) -> std::vec::Vec { + let dir = std::env::var("BOUNDLESS_WASM_DIR").unwrap_or_else(|_| { + concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../target/wasm32v1-none/release" + ) + .to_string() + }); + let path = format!("{dir}/{name}.wasm"); + std::fs::read(&path).unwrap_or_else(|_| { + panic!("{path} is missing; run scripts/test-storage-compat.sh, which builds it") + }) } -mod new_profile { - soroban_sdk::contractimport!(file = "fixtures/profile-1.2.0-sdk27.wasm"); +/// Loads the captured ledger. The test host runs protocol 28, the newest it +/// supports, so a capture from a later protocol is replayed at 28; nothing the +/// contracts store depends on the protocol version. +fn mainnet_env() -> Env { + let fixture = format!("{}/fixtures/{SNAPSHOT}", env!("CARGO_MANIFEST_DIR")); + let captured = std::fs::read_to_string(&fixture).expect("mainnet snapshot fixture"); + let key = "\"protocol_version\": "; + let at = captured.find(key).expect("snapshot records its protocol") + key.len(); + let digits = captured[at..] + .chars() + .take_while(char::is_ascii_digit) + .count(); + let replayed = format!("{}28{}", &captured[..at], &captured[at + digits..]); + let path = std::env::temp_dir().join("boundless-mainnet-state-p28.json"); + std::fs::write(&path, replayed).expect("write replayed snapshot"); + let env = Env::from_ledger_snapshot_file(path); + env.mock_all_auths_allowing_non_root_auth(); + env } -const FEE_BPS: u32 = 250; -const BUDGET: i128 = 10_000_000_000; -const CONTRIBUTION: i128 = 100_000_000; -const TIMELOCK: u32 = 17_280; - -fn next_op(env: &Env, counter: &Cell) -> BytesN<32> { - let value = counter.get(); - counter.set(value + 1); - let mut bytes = [0; 32]; - bytes[28..].copy_from_slice(&value.to_be_bytes()); - BytesN::from_array(env, &bytes) +fn addr(env: &Env, strkey: &str) -> Address { + Address::from_str(env, strkey) } -#[contracttype] -enum LegacyProfileDataKey { - DefaultBootstrapCredits, - DeploymentSeq, - OpSeen(BytesN<32>), +fn debug(value: T) -> std::string::String { + format!("{value:?}") } -#[contracttype] -enum LegacyEventsDataKey { - EventApplicantSlot(u64, Address), - ContributorSlot(u64, Address), - SupportedTokenSlot(Address), +/// recipient, position, amount, milestone, paid_at +type WinnerRow = (Address, u32, i128, Option, Option); + +/// One event as either build reports it, reduced to values both can express. +#[derive(Debug, PartialEq)] +struct EventView { + pillar: std::string::String, + owner: Address, + token: Address, + total_budget: i128, + remaining_escrow: i128, + release_kind: std::string::String, + status: std::string::String, + title: String, + created_at: u64, + prize_floors: Map, + winners: std::vec::Vec, } -fn distribution(env: &Env) -> Map { - let mut distribution = Map::new(env); - distribution.set(1, 100); - distribution +fn event_ids(env: &Env, events_id: &Address, first: u64) -> std::ops::Range { + let next: u64 = env.as_contract(events_id, || { + env.storage() + .instance() + .get(&DataKey::NextEventId) + .expect("deployment has created events") + }); + first..next } -fn params( - env: &Env, - owner: &Address, - token: &Address, - title: &str, -) -> old_events::CreateEventParams { - old_events::CreateEventParams { - content_uri: String::from_str(env, "ipfs://event"), - deadline: Some(env.ledger().timestamp() + 86_400), - fee_bps_override: None, - manager: None, - owner: owner.clone(), - pillar: old_events::Pillar::Hackathon, - release_kind: old_events::ReleaseKind::Single, - title: String::from_str(env, title), - token: token.clone(), - total_budget: BUDGET, - winner_distribution: distribution(env), +fn view_before(events: &deployed_events::Client, id: u64) -> Option { + let event = events.try_get_event(&id).ok()?.ok()?; + let count = events.get_winner_count(&id); + let mut winners = std::vec::Vec::new(); + let mut start = 0; + while start < count { + for w in events.get_winners_page(&id, &start, &PAGE).iter() { + winners.push((w.recipient, w.position, w.amount, w.milestone, w.paid_at)); + } + start += PAGE; } + Some(EventView { + pillar: debug(event.pillar), + owner: event.owner, + token: event.token, + total_budget: event.total_budget, + remaining_escrow: event.remaining_escrow, + release_kind: debug(event.release_kind), + status: debug(event.status), + title: event.title, + created_at: event.created_at, + prize_floors: event.prize_floors, + winners, + }) } -fn pre27_params( - env: &Env, - owner: &Address, - token: &Address, - title: &str, -) -> pre27_events::CreateEventParams { - pre27_events::CreateEventParams { - content_uri: String::from_str(env, "ipfs://event"), - deadline: Some(env.ledger().timestamp() + 86_400), - fee_bps_override: None, - manager: None, - owner: owner.clone(), - pillar: pre27_events::Pillar::Hackathon, - release_kind: pre27_events::ReleaseKind::Single, - title: String::from_str(env, title), - token: token.clone(), - total_budget: BUDGET, - winner_distribution: distribution(env), +fn view_after(events: &EventsContractClient, id: u64) -> EventView { + let event = events.get_event(&id); + let count = events.get_winner_count(&id); + let mut winners = std::vec::Vec::new(); + let mut start = 0; + while start < count { + for w in events.get_winners_page(&id, &start, &PAGE).iter() { + winners.push((w.recipient, w.position, w.amount, w.milestone, w.paid_at)); + } + start += PAGE; } -} - -fn new_params( - env: &Env, - owner: &Address, - token: &Address, - title: &str, -) -> new_events::CreateEventParams { - new_events::CreateEventParams { - content_uri: String::from_str(env, "ipfs://event"), - deadline: Some(env.ledger().timestamp() + 86_400), - fee_bps_override: None, - manager: None, - owner: owner.clone(), - pillar: new_events::Pillar::Hackathon, - release_kind: new_events::ReleaseKind::Single, - title: String::from_str(env, title), - token: token.clone(), - total_budget: BUDGET, - winner_distribution: distribution(env), + EventView { + pillar: debug(event.pillar), + owner: event.owner, + token: event.token, + total_budget: event.total_budget, + remaining_escrow: event.remaining_escrow, + release_kind: debug(event.release_kind), + status: debug(event.status), + title: event.title, + created_at: event.created_at, + prize_floors: event.prize_floors, + winners, } } #[test] -fn sdk23_v110_rows_survive_h6_upgrade_to_sdk27() { - let env = Env::default(); - let ops = Cell::new(1); - env.mock_all_auths_allowing_non_root_auth(); - env.ledger().with_mut(|ledger| { - ledger.sequence_number = 100; - ledger.timestamp = 1_000_000; - // Preserve legacy replay markers while the test advances through the timelock. - ledger.min_temp_entry_ttl = TIMELOCK + 100; - }); - - let admin = Address::generate(&env); - let fee_account = Address::generate(&env); - - let profile_id = env.register(old_profile::WASM, (&admin,)); - let profile_v1 = old_profile::Client::new(&env, &profile_id); - - let events_id = env.register( - old_events::WASM, - (&admin, &fee_account, &FEE_BPS, &profile_id), - ); - let events_v1 = old_events::Client::new(&env, &events_id); - profile_v1.set_events_contract(&events_id); - - let issuer = Address::generate(&env); - let asset = env.register_stellar_asset_contract_v2(issuer); - let token_id = asset.address(); - let token_admin = token::StellarAssetClient::new(&env, &token_id); - token_admin.mint(&fee_account, &0); - - let owner = Address::generate(&env); - let winner = Address::generate(&env); - let grant_recipient = Address::generate(&env); - let contributor = Address::generate(&env); - let manager = Address::generate(&env); - let next_events_admin = Address::generate(&env); - let next_profile_admin = Address::generate(&env); - let rotated_events_id = Address::generate(&env); - let legacy_profile_user = Address::generate(&env); - let legacy_profile_op = next_op(&env, &ops); - token_admin.mint(&owner, &(BUDGET * 6)); - token_admin.mint(&contributor, &(CONTRIBUTION * 4)); - events_v1.register_supported_token(&token_id); - let token = token::Client::new(&env, &token_id); - profile_v1.bootstrap_self(&legacy_profile_user, &legacy_profile_op); - - let mut completed_params = params(&env, &owner, &token_id, "completed"); - completed_params.pillar = old_events::Pillar::Bounty; - let legacy_event_create_op = next_op(&env, &ops); - let completed_id = events_v1.create_event(&completed_params, &legacy_event_create_op); - events_v1.apply_to_bounty(&completed_id, &winner, &next_op(&env, &ops)); - events_v1.submit( - &completed_id, - &winner, - &String::from_str(&env, "ipfs://submission"), - &next_op(&env, &ops), - ); - events_v1.select_winners( - &completed_id, - &vec![ - &env, - old_events::WinnerSpec { - position: 1, - recipient: winner.clone(), - reputation_bump: 7, - }, - ], - &next_op(&env, &ops), +#[ignore = "needs the release wasm; run scripts/test-storage-compat.sh"] +fn mainnet_upgrades_from_the_deployed_builds_to_this_tree() { + let env = mainnet_env(); + let events_id = addr(&env, EVENTS_ID); + let profile_id = addr(&env, PROFILE_ID); + + // Uploading the deployed code is what makes the captured instances run; + // its hash has to equal the one each instance points at. + env.deployer().upload_contract_wasm(deployed_events::WASM); + env.deployer().upload_contract_wasm(deployed_profile::WASM); + let events_v1 = deployed_events::Client::new(&env, &events_id); + let profile_v1 = deployed_profile::Client::new(&env, &profile_id); + assert_eq!(events_v1.version(), String::from_str(&env, "1.7.0")); + assert_eq!(profile_v1.version(), String::from_str(&env, "1.2.0")); + + let first = events_v1.id_base() + 1; + let ids = event_ids(&env, &events_id, first); + let mut before = std::vec::Vec::new(); + let mut old_layout = std::vec::Vec::new(); + for id in ids.clone() { + match view_before(&events_v1, id) { + Some(view) => before.push((id, view)), + None => old_layout.push(id), + } + } + assert_eq!( + old_layout, + std::vec![first, first + 1], + "the deployed build cannot read exactly the two pre-1.7.0 records" ); - let cancelling_id = events_v1.create_event( - ¶ms(&env, &owner, &token_id, "cancelling"), - &next_op(&env, &ops), - ); - events_v1.add_funds( - &cancelling_id, - &contributor, - &CONTRIBUTION, - &next_op(&env, &ops), - ); - events_v1.start_cancel(&cancelling_id, &next_op(&env, &ops)); - - let mut active_params = params(&env, &owner, &token_id, "active"); - active_params.manager = Some(manager.clone()); - let active_contributor_id = events_v1.create_event(&active_params, &next_op(&env, &ops)); - events_v1.add_funds( - &active_contributor_id, - &contributor, - &CONTRIBUTION, - &next_op(&env, &ops), + assert!( + before.iter().any(|(_, view)| !view.winners.is_empty()), + "the capture must hold paid winners for the comparison to mean anything" ); - let mut grant_params = params(&env, &owner, &token_id, "grant"); - grant_params.pillar = old_events::Pillar::Grant; - grant_params.release_kind = old_events::ReleaseKind::Multi(2); - let grant_id = events_v1.create_event(&grant_params, &next_op(&env, &ops)); - events_v1.select_winners( - &grant_id, - &vec![ - &env, - old_events::WinnerSpec { - position: 1, - recipient: grant_recipient.clone(), - reputation_bump: 0, - }, - ], - &next_op(&env, &ops), - ); - let grant_balance_before = token.balance(&grant_recipient); - events_v1.claim_milestone(&grant_id, &grant_recipient, &0, &5, &next_op(&env, &ops)); - - let mut crowdfunding_params = params(&env, &owner, &token_id, "crowdfunding"); - crowdfunding_params.pillar = old_events::Pillar::Crowdfunding; - crowdfunding_params.release_kind = old_events::ReleaseKind::Multi(2); - let crowdfunding_id = events_v1.create_event(&crowdfunding_params, &next_op(&env, &ops)); - events_v1.add_funds( - &crowdfunding_id, - &contributor, - &CONTRIBUTION, - &next_op(&env, &ops), - ); - events_v1.claim_milestone(&crowdfunding_id, &owner, &0, &0, &next_op(&env, &ops)); - - profile_v1.migrate(); - events_v1.migrate(); - profile_v1.set_admin(&next_profile_admin); - events_v1.set_admin(&next_events_admin); - profile_v1.propose_events_contract(&rotated_events_id); - - let new_profile_hash = env.deployer().upload_contract_wasm(new_profile::WASM); - profile_v1.propose_upgrade(&new_profile_hash, &String::from_str(&env, "1.2.0")); - let new_events_hash = env.deployer().upload_contract_wasm(new_events::WASM); - events_v1.propose_upgrade(&new_events_hash, &String::from_str(&env, "1.5.0")); - env.ledger().with_mut(|ledger| { - ledger.sequence_number += TIMELOCK; - }); - profile_v1.apply_upgrade(); + let recipients: std::vec::Vec
= before + .iter() + .flat_map(|(_, view)| view.winners.iter().map(|w| w.0.clone())) + .collect(); + let reputations_before: std::vec::Vec = recipients + .iter() + .map(|r| profile_v1.get_profile(r).map_or(0, |p| p.reputation)) + .collect(); - let profile_v2 = new_profile::Client::new(&env, &profile_id); - assert_eq!(profile_v2.version(), String::from_str(&env, "1.2.0")); - assert_eq!( - profile_v2.get_migrated_to_version(), - Some(String::from_str(&env, "1.1.0")) - ); - let pending_events_contract = profile_v2.get_pending_events_contract().unwrap(); - assert_eq!(pending_events_contract.target, rotated_events_id); - profile_v2.cancel_pending_events_contract(); - assert_eq!(profile_v2.get_pending_events_contract(), None); - profile_v2.accept_admin(); - assert_eq!(profile_v2.get_admin(), next_profile_admin); - let stored_profile = profile_v2.get_profile(&winner).unwrap(); - assert_eq!(stored_profile.reputation, 7); - assert_eq!(profile_v2.get_earnings(&winner, &token_id), BUDGET); - let profile_replay_error = profile_v2 - .try_bootstrap_self(&legacy_profile_user, &legacy_profile_op) - .expect_err("SDK-23 profile replay row must remain effective") - .unwrap(); - assert_eq!(profile_replay_error, new_profile::Error::OpAlreadySeen); + // The runbook order: profile first, left running; then events, paused + // from propose to unpause. The deployed builds have no upgrade timelock. + let profile_hash = env + .deployer() + .upload_contract_wasm(release_wasm("boundless_profile").as_slice()); + profile_v1.propose_upgrade(&profile_hash, &String::from_str(&env, "1.2.1")); + profile_v1.apply_upgrade(); + let profile = ProfileContractClient::new(&env, &profile_id); + profile.migrate(); + assert!(!profile.is_paused()); + events_v1.pause(); + let events_hash = env + .deployer() + .upload_contract_wasm(release_wasm("boundless_events").as_slice()); + events_v1.propose_upgrade(&events_hash, &String::from_str(&env, "2.0.0")); events_v1.apply_upgrade(); - - let events_v2 = new_events::Client::new(&env, &events_id); - assert_eq!(events_v2.version(), String::from_str(&env, "1.5.0")); - assert_eq!( - events_v2.get_migrated_to_version(), - Some(String::from_str(&env, "1.1.0")) - ); - events_v2.accept_admin(); - assert_eq!(events_v2.get_admin(), next_events_admin); - assert_eq!(events_v2.get_fee_account(), fee_account); - assert_eq!(events_v2.get_fee_bps(), FEE_BPS); - assert_eq!(events_v2.get_profile_contract(), profile_id); - assert_eq!(events_v2.get_applicant_count(&completed_id), 1); - assert_eq!( - events_v2.get_applicant_at(&completed_id, &0), - Some(winner.clone()) - ); + let events = EventsContractClient::new(&env, &events_id); + assert!(events.is_paused()); assert_eq!( - env.as_contract(&events_id, || env.storage().persistent().get::<_, u32>( - &LegacyEventsDataKey::EventApplicantSlot(completed_id, winner.clone()) - )), - Some(1) + events.try_migrate().unwrap_err().unwrap(), + boundless_events::errors::Error::MigrationIncomplete ); + assert_eq!(events.migrate_events(&8), 0); + events.migrate(); + events.unpause(); - let completed = events_v2.get_event(&completed_id); - assert_eq!(completed.title, String::from_str(&env, "completed")); - assert_eq!(completed.status, new_events::EventStatus::Completed); - let submission = events_v2.get_submission(&completed_id, &winner); - assert_eq!( - submission.content_uri, - String::from_str(&env, "ipfs://submission") - ); - let winners = events_v2.get_winners(&completed_id); - assert_eq!(winners.len(), 1); - assert_eq!(winners.get(0).unwrap().recipient, winner); - - assert_eq!(events_v2.get_contributor_count(&cancelling_id), 1); - assert_eq!( - events_v2.get_contributor_amount(&cancelling_id, &contributor), - CONTRIBUTION - ); + assert_eq!(events.version(), String::from_str(&env, "2.0.0")); + assert_eq!(profile.version(), String::from_str(&env, "1.2.1")); assert_eq!( - events_v2.process_cancel_batch(&cancelling_id, &25, &next_op(&env, &ops)), - 0 + events.get_migrated_to_version(), + Some(String::from_str(&env, "2.0.0")) ); - events_v2.finalize_cancel(&cancelling_id, &next_op(&env, &ops)); assert_eq!( - events_v2.get_event(&cancelling_id).status, - new_events::EventStatus::Cancelled + profile.get_migrated_to_version(), + Some(String::from_str(&env, "1.2.1")) ); + assert_eq!(events.get_admin(), addr(&env, ADMIN)); + assert_eq!(profile.get_admin(), addr(&env, ADMIN)); + assert_eq!(events.get_fee_account(), addr(&env, FEE_ACCOUNT)); + assert_eq!(events.get_fee_bps(), 250); + assert_eq!(events.get_profile_contract(), profile_id); + assert_eq!(profile.get_events_contract(), Some(events_id.clone())); + assert_eq!(events.id_base() + 1, first); + assert!(events.is_supported_token(&addr(&env, MAINNET_USDC))); + assert_eq!(events.get_release_validator(), None); - assert_eq!( - events_v2.get_contributor_amount(&active_contributor_id, &contributor), - CONTRIBUTION - ); - assert_eq!( - events_v2.get_contributor_at(&active_contributor_id, &0), - Some(contributor.clone()) - ); - assert_eq!( - env.as_contract(&events_id, || env.storage().persistent().get::<_, u32>( - &LegacyEventsDataKey::ContributorSlot(active_contributor_id, contributor.clone()) - )), - Some(1) - ); - assert_eq!(events_v2.get_manager(&active_contributor_id), manager); - assert!(events_v2 - .try_start_cancel(&active_contributor_id, &next_op(&env, &ops)) - .is_err()); - - let events_replay_error = events_v2 - .try_create_event( - &new_params(&env, &owner, &token_id, "legacy-op-replay"), - &legacy_event_create_op, - ) - .expect_err("SDK-23 events replay row must remain effective") - .unwrap(); - assert_eq!(events_replay_error, new_events::Error::OpAlreadySeen); + for (id, view) in &before { + assert_eq!(&view_after(&events, *id), view, "event {id} changed"); + } - let post_upgrade_id = events_v2.create_event( - &new_params(&env, &owner, &token_id, "post-upgrade"), - &next_op(&env, &ops), - ); - assert_eq!(post_upgrade_id, crowdfunding_id + 1); + // Percentages were always taken of the budget, so each converted floor is + // exactly what the old record would have paid that position. + for id in old_layout { + let event = events.get_event(&id); + let winners = view_after(&events, id).winners; + assert!(!event.prize_floors.is_empty()); + let floors_total: i128 = event.prize_floors.values().iter().sum(); + assert!(floors_total <= event.total_budget); + for (recipient, position, amount, milestone, paid_at) in winners { + assert!(milestone.is_none() && paid_at.is_some(), "{recipient:?}"); + assert_eq!(event.prize_floors.get(position), Some(amount)); + } + } - let grant_replay_error = events_v2 - .try_claim_milestone(&grant_id, &grant_recipient, &0, &5, &next_op(&env, &ops)) - .expect_err("SDK-23 milestone row must reject a duplicate claim") - .unwrap(); - assert_eq!( - grant_replay_error, - new_events::Error::MilestoneAlreadyClaimed - ); - let fee_before_grant_claim = token.balance(&fee_account); - events_v2.claim_milestone(&grant_id, &grant_recipient, &1, &5, &next_op(&env, &ops)); - assert_eq!( - token.balance(&grant_recipient) - grant_balance_before, - BUDGET - ); - assert_eq!(token.balance(&fee_account) - fee_before_grant_claim, 0); - assert_eq!( - events_v2.get_event(&grant_id).status, - new_events::EventStatus::Completed - ); - assert_eq!( - profile_v2.get_profile(&grant_recipient).unwrap().reputation, - 10 - ); - assert_eq!(profile_v2.get_earnings(&grant_recipient, &token_id), BUDGET); + for (recipient, reputation) in recipients.iter().zip(reputations_before) { + let after = profile.get_profile(recipient).map_or(0, |p| p.reputation); + assert_eq!(after, reputation); + } - let crowdfunding_replay_error = events_v2 - .try_claim_milestone(&crowdfunding_id, &owner, &0, &0, &next_op(&env, &ops)) - .expect_err("SDK-23 crowdfunding milestone row must reject a duplicate claim") - .unwrap(); - assert_eq!( - crowdfunding_replay_error, - new_events::Error::MilestoneAlreadyClaimed - ); - let crowdfunding_remaining = events_v2.get_event(&crowdfunding_id).remaining_escrow; - let crowdfunding_balance_before = token.balance(&owner); - let fee_before_crowdfunding_claim = token.balance(&fee_account); - events_v2.claim_milestone(&crowdfunding_id, &owner, &1, &0, &next_op(&env, &ops)); - let crowdfunding_fee = crowdfunding_remaining * FEE_BPS as i128 / 10_000; - assert_eq!( - token.balance(&owner) - crowdfunding_balance_before, - crowdfunding_remaining - crowdfunding_fee - ); - assert_eq!( - token.balance(&fee_account) - fee_before_crowdfunding_claim, - crowdfunding_fee - ); - assert_eq!( - events_v2.get_event(&crowdfunding_id).status, - new_events::EventStatus::Completed - ); + // A second pass finds nothing to do, and the stamp cannot be replayed. + assert_eq!(events.migrate_events(&8), 0); + assert!(events.try_migrate().is_err()); - profile_v2.migrate(); - events_v2.migrate(); - assert_eq!( - profile_v2.get_migrated_to_version(), - Some(String::from_str(&env, "1.2.0")) - ); - assert_eq!( - events_v2.get_migrated_to_version(), - Some(String::from_str(&env, "1.5.0")) - ); + run_a_grant(&env, &events, &profile, ids.end); } -#[test] -fn sdk23_pre27_prize_and_cancellation_keys_work_after_upgrade() { - let env = Env::default(); - let ops = Cell::new(1_000); - env.mock_all_auths_allowing_non_root_auth(); - env.ledger().with_mut(|ledger| { - ledger.sequence_number = 100; - ledger.timestamp = 1_000_000; - }); - - let admin = Address::generate(&env); - let fee_account = Address::generate(&env); - let profile_id = env.register(old_profile::WASM, (&admin,)); - let profile_v1 = old_profile::Client::new(&env, &profile_id); - let events_id = env.register( - pre27_events::WASM, - (&admin, &fee_account, &FEE_BPS, &profile_id), - ); - let events_v1 = pre27_events::Client::new(&env, &events_id); - assert_eq!(events_v1.version(), String::from_str(&env, "1.3.0")); - profile_v1.set_events_contract(&events_id); - - let issuer = Address::generate(&env); - let asset = env.register_stellar_asset_contract_v2(issuer); - let token_id = asset.address(); - let token_admin = token::StellarAssetClient::new(&env, &token_id); - token_admin.mint(&fee_account, &0); - - let owner = Address::generate(&env); - let winner = Address::generate(&env); - let second_winner = Address::generate(&env); - let contributor = Address::generate(&env); - token_admin.mint(&owner, &(BUDGET * 3)); - token_admin.mint(&contributor, &(CONTRIBUTION * 2)); - events_v1.register_supported_token(&token_id); - - let mut prize_params = pre27_params(&env, &owner, &token_id, "prize"); - let mut prize_distribution = Map::new(&env); - prize_distribution.set(1, 50); - prize_distribution.set(2, 50); - prize_params.winner_distribution = prize_distribution; - let prize_id = events_v1.create_event(&prize_params, &next_op(&env, &ops)); - events_v1.select_winners( - &prize_id, +/// A grant through the upgraded pair, on a fresh token: selection, releases, a +/// forfeit, and the close that returns the forfeited share. +fn run_a_grant( + env: &Env, + events: &EventsContractClient, + profile: &ProfileContractClient, + expected_id: u64, +) { + // The mainnet fee account has no ledger entry in the capture, so a test + // address takes the fee. + let fee_account = Address::generate(env); + events.set_fee_account(&fee_account); + + let issuer = Address::generate(env); + let token_id = env.register_stellar_asset_contract_v2(issuer).address(); + let token = token::Client::new(env, &token_id); + events.register_supported_token(&token_id); + + let budget: i128 = 900_0000000; + let fee = budget * 250 / 10_000; + let owner = Address::generate(env); + token::StellarAssetClient::new(env, &token_id).mint(&owner, &(budget + fee)); + + let mut floors = Map::new(env); + floors.set(1, 600_0000000_i128); + floors.set(2, 300_0000000_i128); + let id = events.create_event( + &CreateEventParams { + pillar: Pillar::Grant, + owner: owner.clone(), + token: token_id.clone(), + total_budget: budget, + release_kind: ReleaseKind::Multi(3), + content_uri: String::from_str(env, "https://boundlessfi.xyz/grants/replay"), + title: String::from_str(env, "Upgrade replay"), + deadline: None, + prize_floors: floors, + fee_bps_override: None, + manager: None, + }, + &BytesN::random(env), + ); + assert_eq!( + id, expected_id, + "event ids continue from the deployed counter" + ); + assert_eq!(token.balance(&fee_account), fee); + + let (a, b) = (Address::generate(env), Address::generate(env)); + events.select_winners( + &id, &vec![ - &env, - pre27_events::WinnerSpec { + env, + WinnerSpec { + recipient: a.clone(), position: 1, - recipient: winner.clone(), - reputation_bump: 11, + amount: 600_0000000, + reputation_bump: 10, }, - ], - &next_op(&env, &ops), - ); - - let cancellation_id = events_v1.create_event( - &pre27_params(&env, &owner, &token_id, "aggregate"), - &next_op(&env, &ops), - ); - events_v1.add_funds( - &cancellation_id, - &contributor, - &CONTRIBUTION, - &next_op(&env, &ops), - ); - - let new_profile_hash = env.deployer().upload_contract_wasm(new_profile::WASM); - profile_v1.propose_upgrade(&new_profile_hash, &String::from_str(&env, "1.2.0")); - let new_events_hash = env.deployer().upload_contract_wasm(new_events::WASM); - events_v1.propose_upgrade(&new_events_hash, &String::from_str(&env, "1.5.0")); - env.ledger().with_mut(|ledger| { - ledger.sequence_number += TIMELOCK; - }); - profile_v1.apply_upgrade(); - - events_v1.apply_upgrade(); - - let profile_v2 = new_profile::Client::new(&env, &profile_id); - let events_v2 = new_events::Client::new(&env, &events_id); - let token = token::Client::new(&env, &token_id); - - assert_eq!(token.balance(&winner), 0); - assert!(events_v2 - .try_start_cancel(&prize_id, &next_op(&env, &ops)) - .is_err()); - events_v2.select_winners( - &prize_id, - &vec![ - &env, - new_events::WinnerSpec { + WinnerSpec { + recipient: b.clone(), position: 2, - recipient: second_winner.clone(), - reputation_bump: 13, + amount: 300_0000000, + reputation_bump: 10, }, ], - &next_op(&env, &ops), - ); - let fee_before_prize_claims = token.balance(&fee_account); - events_v2.claim_prize(&prize_id, &1, &next_op(&env, &ops)); - events_v2.claim_prize(&prize_id, &2, &next_op(&env, &ops)); - assert_eq!(token.balance(&winner), BUDGET / 2); - assert_eq!(token.balance(&second_winner), BUDGET / 2); - assert_eq!(token.balance(&fee_account) - fee_before_prize_claims, 0); - assert_eq!( - events_v2.get_event(&prize_id).status, - new_events::EventStatus::Completed - ); - assert_eq!(profile_v2.get_profile(&winner).unwrap().reputation, 11); - assert_eq!( - profile_v2.get_profile(&second_winner).unwrap().reputation, - 13 - ); - assert_eq!(profile_v2.get_earnings(&winner, &token_id), BUDGET / 2); - assert_eq!( - profile_v2.get_earnings(&second_winner, &token_id), - BUDGET / 2 - ); - - events_v2.start_cancel(&cancellation_id, &next_op(&env, &ops)); - assert_eq!( - events_v2.get_event(&cancellation_id).status, - new_events::EventStatus::Cancelling + &BytesN::random(env), ); - assert_eq!( - events_v2.process_cancel_batch(&cancellation_id, &25, &next_op(&env, &ops)), - 0 - ); - events_v2.finalize_cancel(&cancellation_id, &next_op(&env, &ops)); - assert_eq!( - events_v2.get_event(&cancellation_id).status, - new_events::EventStatus::Cancelled - ); -} -#[test] -fn exact_mainnet_snapshot_survives_h6_upgrade_to_sdk27() { - let env = Env::from_ledger_snapshot_file(concat!( - env!("CARGO_MANIFEST_DIR"), - "/fixtures/mainnet-state-63617727.json" - )); - env.mock_all_auths_allowing_non_root_auth(); - - let events_id = Address::from_str( - &env, - "CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ", - ); - let profile_id = Address::from_str( - &env, - "CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC", - ); - let admin = Address::from_str( - &env, - "GCVK72I6TVJVDTTY4UKU6MQT4QJ2T2AAG3NULNEUDM46L3UOQYDSO4O2", - ); - let fee_account = Address::from_str( - &env, - "GADSIP2HPINWTMEUNMVYA5NJRL372OV52HDEJTRTLDZXMHADIPQNYH55", - ); - let token_0 = Address::from_str( - &env, - "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75", - ); - let token_1 = Address::from_str( - &env, - "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", - ); - let profile_addresses = [ - "GDCLE5VYYAZ5HYSBSG3PIKQEXHPYNSHF2W7PSW2R7WEIPP2AD275EL4S", - "GAHGDV4MWDLT3BXOUT5A2T774IUAE54DZ6BUCBH4O7PG5TJGWXSV3OJO", - "GBVQKBWHZGO6YED3EVXOZW76VPNYUMJLBLKE5IN4XE5LTT262UXCBIR7", - "GCCCPDSWYDVTD2VSXNXDKWWNENSRTA637CHVHIIXISTKSK4FV6T7G3HV", - "GCS5XWO3M72B6PSMZVGOSB3CLQVWB5OJ6Z7FTFAP5FAZVWS3MLO4Y3WH", - ]; - let legacy_op_ids = [ - [ - 0xd0, 0x12, 0x86, 0xfa, 0x65, 0x4b, 0x4f, 0x92, 0x4e, 0xb2, 0xa1, 0x65, 0xe3, 0xd8, - 0x38, 0x61, 0x42, 0x91, 0x7b, 0x07, 0xaf, 0x9a, 0x22, 0xf2, 0x22, 0x42, 0x0b, 0xa8, - 0xd2, 0xb0, 0x1a, 0xd8, - ], - [ - 0x22, 0xf9, 0xdf, 0xf5, 0xb7, 0x18, 0x43, 0x44, 0xe5, 0xba, 0xc3, 0x94, 0xf9, 0xfb, - 0x14, 0x1a, 0xf5, 0xb1, 0xda, 0x8e, 0x71, 0xae, 0x36, 0xe7, 0x61, 0x2f, 0xb1, 0xaa, - 0x68, 0xf2, 0xf1, 0xbc, - ], - [ - 0xd4, 0x56, 0xce, 0x7d, 0xbe, 0x62, 0xe2, 0xf5, 0x94, 0x9d, 0xc2, 0xcc, 0xe2, 0xb6, - 0xa9, 0x99, 0x00, 0xce, 0x9e, 0xd0, 0x8e, 0xe4, 0x42, 0x37, 0x21, 0x9a, 0xf2, 0x27, - 0x55, 0xfa, 0x71, 0xd5, - ], - ]; - - env.deployer().upload_contract_wasm(old_events::WASM); - env.deployer().upload_contract_wasm(old_profile::WASM); - - let events_v1 = old_events::Client::new(&env, &events_id); - let profile_v1 = old_profile::Client::new(&env, &profile_id); - assert_eq!(events_v1.version(), String::from_str(&env, "1.1.0")); - assert_eq!(profile_v1.version(), String::from_str(&env, "1.1.0")); - let expected_event_id_base = events_v1.id_base(); - events_v1.pause(); - profile_v1.pause(); - assert!(events_v1.is_paused()); - assert!(profile_v1.is_paused()); - - for strkey in profile_addresses { - let address = Address::from_str(&env, strkey); - let profile = profile_v1.get_profile(&address).unwrap(); - assert_eq!(profile.reputation, 0); + events.claim_milestone(&id, &a, &0, &10, &BytesN::random(env)); + events.forfeit_milestone(&id, &a, &1, &BytesN::random(env)); + events.claim_milestone(&id, &a, &2, &10, &BytesN::random(env)); + for milestone in 0..3 { + events.claim_milestone(&id, &b, &milestone, &10, &BytesN::random(env)); } - assert_eq!( - env.as_contract(&profile_id, || env - .storage() - .instance() - .get::<_, u32>(&LegacyProfileDataKey::DefaultBootstrapCredits)), - Some(10) - ); - assert_eq!( - env.as_contract(&profile_id, || env - .storage() - .instance() - .get::<_, u32>(&LegacyProfileDataKey::DeploymentSeq)), - Some(63_222_664) - ); - for bytes in legacy_op_ids { - let op_id = BytesN::from_array(&env, &bytes); - assert_eq!( - env.as_contract(&profile_id, || env - .storage() - .temporary() - .get::<_, bool>(&LegacyProfileDataKey::OpSeen(op_id))), - Some(true) - ); - } - - let new_profile_hash = env.deployer().upload_contract_wasm(new_profile::WASM); - profile_v1.propose_upgrade(&new_profile_hash, &String::from_str(&env, "1.2.0")); - let new_events_hash = env.deployer().upload_contract_wasm(new_events::WASM); - events_v1.propose_upgrade(&new_events_hash, &String::from_str(&env, "1.5.0")); - env.ledger().with_mut(|ledger| { - ledger.sequence_number += TIMELOCK; - }); - profile_v1.apply_upgrade(); - let profile_v2 = new_profile::Client::new(&env, &profile_id); - assert!(profile_v2.is_paused()); - - events_v1.apply_upgrade(); - - let events_v2 = new_events::Client::new(&env, &events_id); - assert!(events_v2.is_paused()); - profile_v2.migrate(); - events_v2.migrate(); - profile_v2.unpause(); - events_v2.unpause(); - - assert_eq!(events_v2.version(), String::from_str(&env, "1.5.0")); - assert_eq!(profile_v2.version(), String::from_str(&env, "1.2.0")); - assert_eq!( - events_v2.get_migrated_to_version(), - Some(String::from_str(&env, "1.5.0")) - ); - assert_eq!( - profile_v2.get_migrated_to_version(), - Some(String::from_str(&env, "1.2.0")) - ); - assert!(!events_v2.is_paused()); - assert!(!profile_v2.is_paused()); - assert_eq!(events_v2.get_admin(), admin); - assert_eq!(events_v2.get_fee_account(), fee_account); - assert_eq!(events_v2.get_fee_bps(), 250); - assert_eq!(events_v2.get_profile_contract(), profile_id); - assert_eq!(events_v2.id_base(), expected_event_id_base); - assert!(events_v2.is_supported_token(&token_0)); - assert!(events_v2.is_supported_token(&token_1)); - assert_eq!(events_v2.supported_token_count(), 2); - assert_eq!(events_v2.supported_token_at(&0), Some(token_0.clone())); - assert_eq!(events_v2.supported_token_at(&1), Some(token_1.clone())); - assert_eq!( - env.as_contract(&events_id, || env.storage().instance().get::<_, u32>( - &LegacyEventsDataKey::SupportedTokenSlot(token_0.clone()) - )), - Some(1) - ); - assert_eq!( - env.as_contract(&events_id, || env.storage().instance().get::<_, u32>( - &LegacyEventsDataKey::SupportedTokenSlot(token_1.clone()) - )), - Some(2) - ); - events_v2.deregister_supported_token(&token_1); - assert_eq!(events_v2.supported_token_count(), 1); - assert!(!events_v2.is_supported_token(&token_1)); - events_v2.register_supported_token(&token_1); - assert_eq!(events_v2.supported_token_count(), 2); - assert_eq!(events_v2.supported_token_at(&1), Some(token_1.clone())); - assert_eq!(profile_v2.get_admin(), admin); - assert_eq!(profile_v2.get_events_contract(), Some(events_id)); - let legacy_replay_user = Address::from_str(&env, profile_addresses[0]); - let legacy_replay_op = BytesN::from_array(&env, &legacy_op_ids[0]); - let legacy_replay_error = profile_v2 - .try_bootstrap_self(&legacy_replay_user, &legacy_replay_op) - .expect_err("captured SDK-23 replay row must remain effective") - .unwrap(); - assert_eq!(legacy_replay_error, new_profile::Error::OpAlreadySeen); - - for strkey in profile_addresses { - let address = Address::from_str(&env, strkey); - let profile = profile_v2.get_profile(&address).unwrap(); - assert_eq!(profile.reputation, 0); - } - assert_eq!( - env.as_contract(&profile_id, || env - .storage() - .instance() - .get::<_, u32>(&LegacyProfileDataKey::DefaultBootstrapCredits)), - Some(10) - ); - assert_eq!( - env.as_contract(&profile_id, || env - .storage() - .instance() - .get::<_, u32>(&LegacyProfileDataKey::DeploymentSeq)), - Some(63_222_664) - ); - for bytes in legacy_op_ids { - let op_id = BytesN::from_array(&env, &bytes); - assert_eq!( - env.as_contract(&profile_id, || env - .storage() - .temporary() - .get::<_, bool>(&LegacyProfileDataKey::OpSeen(op_id))), - Some(true) - ); + assert_eq!(token.balance(&a), 400_0000000); + assert_eq!(token.balance(&b), 300_0000000); + assert_eq!(profile.get_earnings(&a, &token_id), 400_0000000); + assert_eq!(profile.get_profile(&b).unwrap().reputation, 30); + + events.start_cancel(&id, &BytesN::random(env)); + if events.get_event(&id).status == EventStatus::Cancelling { + while events.process_cancel_batch(&id, &15, &BytesN::random(env)) > 0 {} + events.finalize_cancel(&id, &BytesN::random(env)); } + assert_eq!(events.get_event(&id).status, EventStatus::Cancelled); + assert_eq!(token.balance(&owner), 200_0000000); + assert_eq!(token.balance(&events.address), 0); } diff --git a/contracts/events/Cargo.toml b/contracts/events/Cargo.toml index d2899f7..19f9b90 100644 --- a/contracts/events/Cargo.toml +++ b/contracts/events/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "boundless-events" -version = "1.6.0" +version = "2.0.0" edition = "2021" publish = false @@ -10,7 +10,7 @@ doctest = false [features] # Testnet-only: zero the upgrade timelock so upgrades apply immediately for fast -# iteration. NEVER enable on mainnet โ€” the default (feature off) keeps the full +# iteration. NEVER enable on mainnet: the default (feature off) keeps the full # audit-mandated ~1-day timelock, so forgetting the flag fails safe (secure). testnet = [] diff --git a/contracts/events/Makefile b/contracts/events/Makefile index a01df76..68d9ac2 100644 --- a/contracts/events/Makefile +++ b/contracts/events/Makefile @@ -6,7 +6,7 @@ test: build cargo test build: - stellar contract build + ../../scripts/build-release.sh --package boundless-events @ls -l ../../target/wasm32v1-none/release/*.wasm size: diff --git a/contracts/events/src/admin.rs b/contracts/events/src/admin.rs index ff672b5..a0b8fc8 100644 --- a/contracts/events/src/admin.rs +++ b/contracts/events/src/admin.rs @@ -1,21 +1,54 @@ -use soroban_sdk::{panic_with_error, Address, BytesN, Env, String}; +use soroban_sdk::{ + contracttype, panic_with_error, Address, BytesN, ContractExecutable, Env, Map, String, Symbol, + Val, +}; use crate::errors::Error; use crate::events as evt; +use crate::idempotency; use crate::storage; -use crate::types::{PendingAdmin, PendingUpgrade}; +use crate::types::{ + DataKey, EventRecord, EventStatus, PendingAdmin, PendingUpgrade, PendingValidator, Pillar, + ReleaseKind, +}; + +/// The pre-1.7.0 `EventRecord`, kept only so `migrate` can decode rows written +/// before prize floors replaced the percentage distribution. Nothing else may +/// read or write this shape. +#[contracttype] +#[derive(Clone)] +struct LegacyEventRecord { + pub id: u64, + pub pillar: Pillar, + pub owner: Address, + pub token: Address, + pub total_budget: i128, + pub remaining_escrow: i128, + pub release_kind: ReleaseKind, + pub status: EventStatus, + pub content_uri: String, + pub title: String, + pub created_at: u64, + pub deadline: Option, + pub winner_distribution: Map, + pub fee_bps_override: Option, +} const PENDING_ADMIN_TTL_LEDGERS: u32 = 120_960; pub(crate) const MAX_FEE_BPS: u32 = 1_000; +// About a day on mainnet: without a window a compromised admin quorum can +// propose and apply a wasm swap in one session, before anyone watching can +// react or cancel_pending_upgrade can fire. Testnet builds skip it so +// upgrades can iterate. #[cfg(not(feature = "testnet"))] const UPGRADE_TIMELOCK_LEDGERS: u32 = 17_280; #[cfg(feature = "testnet")] const UPGRADE_TIMELOCK_LEDGERS: u32 = 0; const PENDING_UPGRADE_TTL_LEDGERS: u32 = 518_400; -pub const INITIAL_VERSION: &str = "1.6.0"; +pub const INITIAL_VERSION: &str = "2.0.0"; // ============================================================ // INITIALIZATION @@ -124,6 +157,86 @@ pub fn set_fee_account(env: &Env, new_account: Address) -> Result<(), Error> { Ok(()) } +// ============================================================ +// CROWDFUNDING RELEASE VALIDATOR (two-step, like the admin) +// ============================================================ +/// The proposed key co-signs nothing until it accepts, which proves someone +/// holds it; until then the current validator, or the admin, still co-signs. +pub fn propose_release_validator(env: &Env, target: Address) -> Result<(), Error> { + require_admin(env)?; + if storage::get_pending_release_validator(env).is_some() { + evt::ValidatorProposalCancelled {}.publish(env); + } + let expires_at = env + .ledger() + .sequence() + .saturating_add(PENDING_ADMIN_TTL_LEDGERS); + storage::set_pending_release_validator( + env, + &PendingValidator { + target: target.clone(), + expires_at_ledger: expires_at, + }, + ); + storage::touch_instance(env); + evt::ReleaseValidatorProposed { + target, + expires_at_ledger: expires_at, + } + .publish(env); + Ok(()) +} + +pub fn accept_release_validator(env: &Env) -> Result<(), Error> { + let pending = + storage::get_pending_release_validator(env).ok_or(Error::PendingRotationMismatch)?; + if env.ledger().sequence() > pending.expires_at_ledger { + return Err(Error::PendingRotationExpired); + } + pending.target.require_auth(); + + storage::set_release_validator(env, &Some(pending.target.clone())); + storage::clear_pending_release_validator(env); + storage::touch_instance(env); + evt::ReleaseValidatorUpdated { + validator: Some(pending.target), + } + .publish(env); + Ok(()) +} + +pub fn cancel_pending_release_validator(env: &Env) -> Result<(), Error> { + require_admin(env)?; + if storage::get_pending_release_validator(env).is_none() { + return Err(Error::PendingRotationMismatch); + } + storage::clear_pending_release_validator(env); + storage::touch_instance(env); + evt::ValidatorProposalCancelled {}.publish(env); + Ok(()) +} + +/// Takes effect at once, unlike appointing one: removing the validator is how +/// a compromised key is cut off. Co-signing returns to the admin. +pub fn clear_release_validator(env: &Env) -> Result<(), Error> { + require_admin(env)?; + storage::set_release_validator(env, &None); + if storage::get_pending_release_validator(env).is_some() { + storage::clear_pending_release_validator(env); + evt::ValidatorProposalCancelled {}.publish(env); + } + storage::touch_instance(env); + evt::ReleaseValidatorUpdated { validator: None }.publish(env); + Ok(()) +} + +pub fn release_cosigner(env: &Env) -> Result { + match storage::get_release_validator(env) { + Some(validator) => Ok(validator), + None => storage::get_admin(env), + } +} + // ============================================================ // PROFILE CONTRACT BINDING // ============================================================ @@ -143,6 +256,9 @@ pub fn set_profile_contract(env: &Env, new_addr: Address) -> Result<(), Error> { // ============================================================ pub fn pause(env: &Env) -> Result<(), Error> { require_admin(env)?; + if storage::get_paused_at(env).is_none() { + storage::set_paused_at(env, Some(env.ledger().timestamp())); + } storage::set_paused(env, true); storage::touch_instance(env); evt::Paused {}.publish(env); @@ -151,6 +267,12 @@ pub fn pause(env: &Env) -> Result<(), Error> { pub fn unpause(env: &Env) -> Result<(), Error> { require_admin(env)?; + if let Some(at) = storage::get_paused_at(env) { + let paused_for = env.ledger().timestamp().saturating_sub(at); + let total = storage::get_paused_seconds(env).saturating_add(paused_for); + storage::set_paused_seconds(env, total); + storage::set_paused_at(env, None); + } storage::set_paused(env, false); storage::touch_instance(env); evt::Unpaused {}.publish(env); @@ -158,7 +280,7 @@ pub fn unpause(env: &Env) -> Result<(), Error> { } // ============================================================ -// UPGRADE (timelocked; H6) +// UPGRADE (timelocked) // ============================================================ pub fn propose_upgrade( env: &Env, @@ -203,7 +325,7 @@ pub fn apply_upgrade(env: &Env) -> Result<(), Error> { } storage::touch_instance(env); env.deployer() - .update_current_contract_wasm(pending.wasm_hash.clone()); + .update_current_contract(ContractExecutable::Wasm(pending.wasm_hash.clone())); storage::set_version(env, &pending.new_version); storage::clear_pending_upgrade(env); evt::UpgradeApplied { @@ -233,7 +355,7 @@ pub fn cancel_pending_upgrade(env: &Env) -> Result<(), Error> { } // ============================================================ -// MIGRATE (post-upgrade one-shot; H6) +// MIGRATE (post-upgrade one-shot) // ============================================================ pub fn migrate(env: &Env) -> Result<(), Error> { require_admin(env)?; @@ -250,6 +372,13 @@ pub fn migrate(env: &Env) -> Result<(), Error> { // ============================================================ // PER-(from -> to) MIGRATION DISPATCH // ============================================================ + // Refuse to stamp while any event is still unconverted. The rewrite is + // paged through `migrate_events` because one invocation may touch only 100 + // ledger entries, and stamping early would leave the remainder undecodable + // with no way to resume: this is one-shot. + if migration_remaining(env) > 0 { + return Err(Error::MigrationIncomplete); + } storage::set_migrated_to_version(env, ¤t); storage::touch_instance(env); @@ -261,6 +390,107 @@ pub fn migrate(env: &Env) -> Result<(), Error> { Ok(()) } +/// How many events `migrate_events` has yet to convert. +fn migration_remaining(env: &Env) -> u64 { + let base = idempotency::id_base(env); + let first = base.saturating_add(1); + let next = storage::get_next_event_id(env, first); + let cursor = storage::get_migration_cursor(env).unwrap_or(first); + next.saturating_sub(cursor.max(first)) +} + +/// Converts up to `max_events` events from the pre-1.7.0 percentage layout, +/// advancing a stored cursor. Returns how many remain, so an operator can loop +/// until it reports zero and only then call `migrate`. +/// +/// Paged rather than one-shot because an invocation may touch at most 100 +/// ledger entries and write 50. A deployment with real history (testnet holds +/// over a hundred events) cannot be converted in a single transaction, and a +/// one-shot pass that aborts leaves every event undecodable. +pub fn migrate_events(env: &Env, max_events: u32) -> Result { + require_admin(env)?; + + // Each event costs a record read and, when converted, a record write; + // eight stays far inside the per-transaction entry limits. + const MAX_PER_CALL: u32 = 8; + let budget = if max_events == 0 || max_events > MAX_PER_CALL { + MAX_PER_CALL + } else { + max_events + }; + + let base = idempotency::id_base(env); + let first = base.saturating_add(1); + let next = storage::get_next_event_id(env, first); + let mut cursor = storage::get_migration_cursor(env) + .unwrap_or(first) + .max(first); + + let mut done: u32 = 0; + while cursor < next && done < budget { + migrate_one_event(env, cursor); + cursor = cursor.saturating_add(1); + done = done.saturating_add(1); + } + + storage::set_migration_cursor(env, cursor); + storage::touch_instance(env); + Ok(next.saturating_sub(cursor)) +} + +/// Rewrites one event from the pre-1.7.0 percentage layout to prize floors. +/// `winner_distribution` and `prize_floors` differ in both name and value type, +/// so an old row cannot be decoded by the current struct at all. +/// +/// Percentages were always taken against the escrow balance, so `total_budget * +/// percent / 100` reproduces exactly what each position would have been paid. +fn migrate_one_event(env: &Env, id: u64) { + let key = DataKey::Event(id); + // Decode defensively. `get::` unwraps the conversion, + // and a missing field escalates to a host error rather than a catchable + // one, so a row already in the 1.7.0 layout would abort the whole + // invocation instead of being skipped. A contracttype struct is stored as + // a map keyed by field name, so the old layout is identified by the field + // that only it carries. + let fields: Option> = env.storage().persistent().get(&key); + let is_legacy = fields.is_some_and(|f| f.contains_key(Symbol::new(env, "winner_distribution"))); + if is_legacy { + if let Some(old) = env + .storage() + .persistent() + .get::(&key) + { + let mut floors: Map = Map::new(env); + for (position, percent) in old.winner_distribution.iter() { + let floor = old + .total_budget + .saturating_mul(percent as i128) + .saturating_div(100); + if floor > 0 { + floors.set(position, floor); + } + } + let migrated = EventRecord { + id: old.id, + pillar: old.pillar, + owner: old.owner, + token: old.token, + total_budget: old.total_budget, + remaining_escrow: old.remaining_escrow, + release_kind: old.release_kind, + status: old.status, + content_uri: old.content_uri, + title: old.title, + created_at: old.created_at, + deadline: old.deadline, + prize_floors: floors, + fee_bps_override: old.fee_bps_override, + }; + env.storage().persistent().set(&key, &migrated); + } + } +} + // ============================================================ // READS // ============================================================ @@ -305,6 +535,16 @@ pub fn require_admin(env: &Env) -> Result<(), Error> { Ok(()) } +/// Seconds the contract has been open, the clock claim windows run on. +pub fn open_time(env: &Env) -> u64 { + let now = env.ledger().timestamp(); + let mut paused = storage::get_paused_seconds(env); + if let Some(at) = storage::get_paused_at(env) { + paused = paused.saturating_add(now.saturating_sub(at)); + } + now.saturating_sub(paused) +} + pub fn require_not_paused(env: &Env) -> Result<(), Error> { storage::touch_instance(env); if storage::is_paused(env) { diff --git a/contracts/events/src/bounty.rs b/contracts/events/src/bounty.rs deleted file mode 100644 index 428a58b..0000000 --- a/contracts/events/src/bounty.rs +++ /dev/null @@ -1,95 +0,0 @@ -use soroban_sdk::{Address, BytesN, Env}; - -use crate::admin; -use crate::errors::Error; -use crate::events as evt; -use crate::idempotency::{self, tag}; -use crate::profile_client; -use crate::storage; -use crate::types::{EventRecord, EventStatus, Pillar, ReleaseKind}; - -pub fn validate_create(_env: &Env, record: &EventRecord, _owner: &Address) -> Result<(), Error> { - if !matches!(record.release_kind, ReleaseKind::Single) { - return Err(Error::InvalidReleaseKind); - } - Ok(()) -} - -// ============================================================ -// APPLY -// ============================================================ -pub fn apply( - env: &Env, - bounty_id: u64, - applicant: Address, - op_id: BytesN<32>, -) -> Result<(), Error> { - admin::require_not_paused(env)?; - - let event = storage::get_event(env, bounty_id).ok_or(Error::EventNotFound)?; - require_active_bounty(&event)?; - - applicant.require_auth(); - idempotency::require_unseen(env, &applicant, &op_id)?; - - storage::append_applicant(env, bounty_id, &applicant)?; - - let profile = profile_client::client(env); - let bootstrap_op = idempotency::derive_child(env, &op_id, tag::BOOTSTRAP); - profile.bootstrap(&applicant, &bootstrap_op); - - evt::Applied { - event_id: bounty_id, - applicant: applicant.clone(), - } - .publish(env); - - idempotency::mark_seen(env, &applicant, &op_id); - Ok(()) -} - -// ============================================================ -// WITHDRAW APPLICATION -// ============================================================ -pub fn withdraw_application( - env: &Env, - bounty_id: u64, - applicant: Address, - op_id: BytesN<32>, -) -> Result<(), Error> { - admin::require_not_paused(env)?; - - let event = storage::get_event(env, bounty_id).ok_or(Error::EventNotFound)?; - require_active_bounty(&event)?; - - applicant.require_auth(); - idempotency::require_unseen(env, &applicant, &op_id)?; - - if storage::get_submission(env, bounty_id, &applicant).is_some() { - return Err(Error::SubmissionAlreadyExists); - } - - storage::remove_applicant(env, bounty_id, &applicant)?; - - evt::ApplicationWithdrawn { - event_id: bounty_id, - applicant: applicant.clone(), - } - .publish(env); - - idempotency::mark_seen(env, &applicant, &op_id); - Ok(()) -} - -// ============================================================ -// HELPERS -// ============================================================ -fn require_active_bounty(event: &EventRecord) -> Result<(), Error> { - if !matches!(event.pillar, Pillar::Bounty) { - return Err(Error::InvalidPillar); - } - if !matches!(event.status, EventStatus::Active) { - return Err(Error::EventNotActive); - } - Ok(()) -} diff --git a/contracts/events/src/crowdfunding.rs b/contracts/events/src/crowdfunding.rs deleted file mode 100644 index 04a98ff..0000000 --- a/contracts/events/src/crowdfunding.rs +++ /dev/null @@ -1,26 +0,0 @@ -#![allow(dead_code)] - -use soroban_sdk::{Address, Env}; - -use crate::errors::Error; -use crate::types::{EventRecord, ReleaseKind}; - -pub fn validate_create(_env: &Env, record: &EventRecord, _owner: &Address) -> Result<(), Error> { - match record.release_kind { - ReleaseKind::Multi(n) if n > 0 => {} - _ => return Err(Error::InvalidReleaseKind), - } - - if record.winner_distribution.len() != 1 { - return Err(Error::InvalidDistribution); - } - let percent = record - .winner_distribution - .get(1) - .ok_or(Error::InvalidDistribution)?; - if percent != 100 { - return Err(Error::DistributionMismatch); - } - - Ok(()) -} diff --git a/contracts/events/src/errors.rs b/contracts/events/src/errors.rs index a6eca13..593b917 100644 --- a/contracts/events/src/errors.rs +++ b/contracts/events/src/errors.rs @@ -1,18 +1,15 @@ use soroban_sdk::contracterror; +// Retired codes are never reused, so a code in an old log or client keeps its +// meaning: 2-4, 10, 11, 21, 36-38, 40-43, 59, 80. #[contracterror] #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] #[repr(u32)] pub enum Error { AlreadyInitialized = 1, - AdminCannotBeZero = 2, - FeeAccountCannotBeZero = 3, - ProfileContractCannotBeZero = 4, InvalidFeeBps = 5, NotInitialized = 6, - Unauthorized = 10, - NotAdmin = 11, // Shared by both two-step rotations (admin and event manager): no pending // proposal / target mismatch (12) and pending proposal expired (13). The // manager flow reuses these because the two flows are structurally @@ -21,7 +18,6 @@ pub enum Error { PendingRotationExpired = 13, TokenNotSupported = 20, - FeeAccountMissingTrustline = 21, EventNotFound = 30, EventNotActive = 31, @@ -29,15 +25,8 @@ pub enum Error { InvalidReleaseKind = 33, InvalidDistribution = 34, InvalidBudget = 35, - // 36-38 retired: deadline enforcement removed (submission windows are an - // off-chain/backend concern; the contract no longer gates on deadline). TitleTooLong = 39, - ApplicantAlreadyApplied = 40, - ApplicantNotApplied = 41, - SubmissionNotFound = 42, - SubmissionAlreadyExists = 43, - NoSubmissions = 50, InvalidWinnerPosition = 51, DuplicateWinnerPosition = 52, @@ -50,15 +39,9 @@ pub enum Error { BelowMinimumContribution = 57, InvalidContributionAmount = 58, - // Per-event participant caps were removed (participant sets are - // unbounded; entries are per-participant and self-funded). 59 and 61 are - // kept for ABI stability and now only signal u32 counter overflow. - TooManyApplicants = 59, - OpAlreadySeen = 60, - // Also returned by append_submission's overflow guard โ€” reused rather - // than adding a near-duplicate "TooManySubmissions". + // A u32 overflow on the contributor index; contributor sets have no cap. TooManyContributors = 61, CancellationNotStarted = 62, @@ -74,9 +57,13 @@ pub enum Error { Paused = 70, EventIdOverflow = 71, - ProfileCallFailed = 80, - - // contracterror caps at 50 cases (48 used). Discriminants are not dense โ€” - // 91 is a numeric label, not the case count. + // contracterror caps at 50 cases. Discriminants are not dense: 91 is a + // numeric label, not the case count. PrizeAlreadyClaimed = 91, + DuplicateRecipient = 92, + ReputationBumpTooLarge = 93, + InvalidBatchSize = 94, + NoRefundOwed = 95, + AwardsOutstanding = 96, + MigrationIncomplete = 97, } diff --git a/contracts/events/src/escrow.rs b/contracts/events/src/escrow.rs index 04e53b6..434bdc8 100644 --- a/contracts/events/src/escrow.rs +++ b/contracts/events/src/escrow.rs @@ -1,5 +1,3 @@ -#![allow(dead_code)] - use soroban_sdk::{token, Address, Env}; use crate::storage; @@ -12,10 +10,6 @@ pub fn compute_fee_at(amount: i128, bps: u32) -> i128 { amount.saturating_mul(bps as i128) / 10_000 } -pub fn compute_fee(env: &Env, amount: i128) -> i128 { - compute_fee_at(amount, storage::get_fee_bps(env)) -} - pub fn deposit_with_fee_at( env: &Env, token_addr: &Address, @@ -36,16 +30,23 @@ pub fn deposit_with_fee_at( amount } -pub fn deposit_with_fee(env: &Env, token_addr: &Address, from: &Address, amount: i128) -> i128 { - deposit_with_fee_at(env, token_addr, from, amount, storage::get_fee_bps(env)) -} - pub fn release(env: &Env, token_addr: &Address, recipient: &Address, amount: i128) { let contract = env.current_contract_address(); let client = token::Client::new(env, token_addr); client.transfer(&contract, recipient, &amount); } +/// Like `release`, but reports a transfer the recipient's account refuses +/// instead of reverting the whole call. +pub fn try_release(env: &Env, token_addr: &Address, recipient: &Address, amount: i128) -> bool { + let contract = env.current_contract_address(); + let client = token::Client::new(env, token_addr); + matches!( + client.try_transfer(&contract, recipient, &amount), + Ok(Ok(())) + ) +} + pub fn deposit_no_fee(env: &Env, token_addr: &Address, from: &Address, amount: i128) -> i128 { let contract = env.current_contract_address(); let client = token::Client::new(env, token_addr); diff --git a/contracts/events/src/event_ops.rs b/contracts/events/src/event_ops.rs index 54ab7d6..cf4fb6a 100644 --- a/contracts/events/src/event_ops.rs +++ b/contracts/events/src/event_ops.rs @@ -1,25 +1,28 @@ -use soroban_sdk::{Address, BytesN, Env, String, Symbol, Vec}; +use soroban_sdk::{Address, BytesN, Env, Map, Symbol, Vec}; use crate::admin::{self, MAX_FEE_BPS}; -use crate::bounty; -use crate::crowdfunding; use crate::errors::Error; use crate::escrow; use crate::events as evt; -use crate::grant; -use crate::hackathon; use crate::idempotency::{self, tag}; use crate::profile_client; use crate::storage; use crate::token_whitelist; use crate::types::{ - CancellationBranch, CancellationState, CreateEventParams, EventRecord, EventStatus, - PendingManager, Pillar, PrizeAward, ReleaseKind, Submission, Winner, WinnerSpec, + CancellationBranch, CancellationState, CreateEventParams, EventRecord, EventStatus, GrantAward, + PendingManager, Pillar, PrizeAward, ReleaseKind, Winner, WinnerSpec, }; const MAX_TITLE_LEN: u32 = 120; -const MAX_WINNERS_PER_SELECT: u32 = 50; +// Sized to fit one transaction under mainnet's 100-entry footprint and +// 50-write limits, which the test host enforces. A single-release award writes +// a winner row and a prize award; a grant award writes a winner row and shares +// one roster entry. Single-release events may select in several batches; +// grants select once, so the grant cap is also the most recipients a grant +// can have. +pub const MAX_AWARDS_PER_SELECT: u32 = 20; +pub const MAX_GRANT_AWARDS: u32 = 40; const PENDING_MANAGER_TTL_LEDGERS: u32 = 17_280; @@ -27,19 +30,25 @@ const PENDING_MANAGER_TTL_LEDGERS: u32 = 17_280; // before winners are selected). A per-event override needs a migration. pub const PRIZE_CLAIM_WINDOW_SECS: u64 = 90 * 24 * 60 * 60; -// Participant sets (applicants, contributors, submissions) are unbounded: -// each entry is its own persistent ledger entry paid for by the participant's -// own transaction, and no state-changing path iterates the full set in one -// transaction (refunds are cranked in batches, winner selection takes an -// explicit bounded list). Full-list reads page through VIEW_PAGE_LIMIT -// entries per call so simulation stays inside per-tx read-entry limits. -pub const VIEW_PAGE_LIMIT: u32 = 100; -pub const MAX_CONTENT_URI_LEN: u32 = 256; +// Contributor sets are unbounded: each entry is its own persistent ledger +// entry paid for by the contributor's own transaction, and no state-changing +// path iterates the full set in one transaction (refunds are cranked in +// batches, winner selection takes an explicit bounded list). Full-list reads +// page through VIEW_PAGE_LIMIT entries per call so simulation stays inside +// the 100-entry footprint, which a page also spends on the instance, the +// event and the count. +pub const VIEW_PAGE_LIMIT: u32 = 90; -pub const MAX_REFUNDS_PER_BATCH: u32 = 25; +// Each refund touches the contributor's amount, slot and token balance; 15 keeps +// a batch inside the 100-entry footprint with room to spare. +pub const MAX_REFUNDS_PER_BATCH: u32 = 15; const MIN_CONTRIBUTION_STROOPS: i128 = 100_000_000_i128; +// Reputation is minted by whoever owns an event, and anyone can own one, so +// a single award or release must not be able to move it far. +pub const MAX_REPUTATION_BUMP: u32 = 100; + // ============================================================ // CREATE EVENT // ============================================================ @@ -74,14 +83,22 @@ pub fn create_event(env: &Env, params: CreateEventParams, op_id: BytesN<32>) -> return Err(Error::InvalidBudget); } - if params.winner_distribution.is_empty() { + if params.prize_floors.is_empty() { return Err(Error::InvalidDistribution); } - let mut sum: u32 = 0; - for (_pos, percent) in params.winner_distribution.iter() { - sum = sum.saturating_add(percent); + // Floors may total less than the budget. The headroom is deliberate: it is + // what a later selection draws on to award a position that had no floor at + // create time. + let mut floor_sum: i128 = 0; + for (_pos, floor) in params.prize_floors.iter() { + if floor <= 0 { + return Err(Error::InvalidDistribution); + } + floor_sum = floor_sum + .checked_add(floor) + .ok_or(Error::DistributionMismatch)?; } - if sum != 100 { + if floor_sum > params.total_budget { return Err(Error::DistributionMismatch); } @@ -112,14 +129,17 @@ pub fn create_event(env: &Env, params: CreateEventParams, op_id: BytesN<32>) -> title: params.title.clone(), created_at: env.ledger().timestamp(), deadline: params.deadline, - winner_distribution: params.winner_distribution.clone(), + prize_floors: params.prize_floors.clone(), fee_bps_override: params.fee_bps_override, }; - match params.pillar { - Pillar::Hackathon => hackathon::validate_create(env, &provisional, ¶ms.owner)?, - Pillar::Bounty => bounty::validate_create(env, &provisional, ¶ms.owner)?, - Pillar::Grant => grant::validate_create(env, &provisional, ¶ms.owner)?, - Pillar::Crowdfunding => crowdfunding::validate_create(env, &provisional, ¶ms.owner)?, + let release_kind_fits = match params.pillar { + Pillar::Hackathon | Pillar::Bounty => matches!(params.release_kind, ReleaseKind::Single), + Pillar::Grant | Pillar::Crowdfunding => { + matches!(params.release_kind, ReleaseKind::Multi(n) if n > 0) + } + }; + if !release_kind_fits { + return Err(Error::InvalidReleaseKind); } if !is_crowdfunding { @@ -192,6 +212,10 @@ pub fn propose_manager(env: &Env, event_id: u64, new_manager: Address) -> Result let event = storage::get_event(env, event_id).ok_or(Error::EventNotFound)?; resolve_manager(env, event_id, &event.owner).require_auth(); + if storage::get_pending_manager(env, event_id).is_some() { + evt::PendingManagerCancelled { event_id }.publish(env); + } + let expires_at = env .ledger() .sequence() @@ -250,6 +274,33 @@ pub fn cancel_pending_manager(env: &Env, event_id: u64) -> Result<(), Error> { Ok(()) } +/// The owner takes management back from a delegated manager, which is how an +/// event recovers from a manager key that is lost. Only before any award: from +/// selection on, the awards are the manager's decision and stay theirs. +pub fn reclaim_management(env: &Env, event_id: u64) -> Result<(), Error> { + admin::require_not_paused(env)?; + let event = storage::get_event(env, event_id).ok_or(Error::EventNotFound)?; + if !matches!(event.status, EventStatus::Active) { + return Err(Error::EventNotActive); + } + event.owner.require_auth(); + if !matches!(event.pillar, Pillar::Crowdfunding) && storage::winner_count(env, event_id) > 0 { + return Err(Error::WinnersAlreadySelected); + } + + storage::clear_event_manager(env, event_id); + if storage::get_pending_manager(env, event_id).is_some() { + storage::clear_pending_manager(env, event_id); + evt::PendingManagerCancelled { event_id }.publish(env); + } + evt::ManagementReclaimed { + event_id, + owner: event.owner, + } + .publish(env); + Ok(()) +} + pub fn get_manager(env: &Env, event_id: u64) -> Result { let event = storage::get_event(env, event_id).ok_or(Error::EventNotFound)?; Ok(resolve_manager(env, event_id, &event.owner)) @@ -358,15 +409,26 @@ pub fn start_cancel(env: &Env, event_id: u64, op_id: BytesN<32>) -> Result<(), E && storage::unclaimed_prize_count(env, event_id) > 0 { let expiry = storage::get_prize_claim_expiry(env, event_id).unwrap_or(0); - if env.ledger().timestamp() <= expiry { + if admin::open_time(env) <= expiry { return Err(Error::WinnersAlreadySelected); } } + // A grant award ends milestone by milestone, released or forfeited, each + // on the record. Cancelling over an owed award would end it silently. + if matches!(event.pillar, Pillar::Grant) && storage::owed_total(env, event_id) > 0 { + return Err(Error::AwardsOutstanding); + } let manager = resolve_manager(env, event_id, &event.owner); manager.require_auth(); idempotency::require_unseen(env, &manager, &op_id)?; + // Cancelling supersedes every award: both claim paths require Active, so + // from here nothing can be claimed and the reservation must be released + // rather than withheld. Withholding it would strand the funds with no + // path back out. The guards above are what protect awards still claimable. + storage::set_owed_total(env, event_id, 0); + let remaining = event.remaining_escrow; let count = storage::contributor_count(env, event_id); let non_owner_total = get_or_init_non_owner_total(env, event_id)?; @@ -378,6 +440,13 @@ pub fn start_cancel(env: &Env, event_id: u64, op_id: BytesN<32>) -> Result<(), E } else { CancellationBranch::ProRataPartners }; + evt::CancellationStarted { + event_id, + branch, + remaining, + non_owner_total, + } + .publish(env); if matches!(branch, CancellationBranch::OwnerOnly) { if remaining > 0 { @@ -420,8 +489,13 @@ pub fn process_cancel_batch( op_id: BytesN<32>, ) -> Result { admin::require_not_paused(env)?; + // An empty batch would still spend the op_id, letting a stranger burn the + // id the backend is about to use. + if max_refunds == 0 { + return Err(Error::InvalidBatchSize); + } // Permissionless crank: no caller to authorize, so namespace under the - // contract's own address โ€” isolated from every user/privileged domain. + // contract's own address, isolated from every user/privileged domain. let domain = env.current_contract_address(); idempotency::require_unseen(env, &domain, &op_id)?; @@ -462,16 +536,32 @@ pub fn process_cancel_batch( CancellationBranch::OwnerOnly => 0, }; - if payout > 0 { - escrow::release(env, &event.token, &c, payout); + storage::set_contributor_amount(env, event_id, &c, 0); + if payout <= 0 { + // A pro-rata share can floor to nothing; say so rather than skip. evt::ContributorRefunded { + event_id, + contributor: c.clone(), + amount: 0, + } + .publish(env); + } else if escrow::try_release(env, &event.token, &c, payout) { + evt::ContributorRefunded { + event_id, + contributor: c.clone(), + amount: payout, + } + .publish(env); + } else { + let held = storage::unclaimed_refund(env, event_id, &c).saturating_add(payout); + storage::set_unclaimed_refund(env, event_id, &c, held); + evt::RefundDeferred { event_id, contributor: c.clone(), amount: payout, } .publish(env); } - storage::set_contributor_amount(env, event_id, &c, 0); } storage::set_cancellation_state(env, event_id, &state); @@ -523,106 +613,37 @@ pub fn finalize_cancel(env: &Env, event_id: u64, op_id: BytesN<32>) -> Result<() Ok(()) } -// ============================================================ -// SUBMIT -// ============================================================ -pub fn submit( +pub fn claim_refund( env: &Env, event_id: u64, - applicant: Address, - content_uri: String, + contributor: Address, op_id: BytesN<32>, ) -> Result<(), Error> { admin::require_not_paused(env)?; - let event = storage::get_event(env, event_id).ok_or(Error::EventNotFound)?; - if !matches!(event.status, EventStatus::Active) { - return Err(Error::EventNotActive); - } - if matches!(event.pillar, Pillar::Crowdfunding) { - return Err(Error::InvalidPillar); - } - - applicant.require_auth(); - idempotency::require_unseen(env, &applicant, &op_id)?; - - // Reused rather than adding a new variant โ€” stays inside the - // contracterror 50-variant cap (see BACKLOG.md L7 for precedent). - if content_uri.len() > MAX_CONTENT_URI_LEN { - return Err(Error::TitleTooLong); - } + contributor.require_auth(); + idempotency::require_unseen(env, &contributor, &op_id)?; - let existing = storage::get_submission(env, event_id, &applicant); - - if existing.is_none() { - let needs_application = matches!(event.pillar, Pillar::Bounty | Pillar::Grant); - if needs_application && storage::applicant_slot(env, event_id, &applicant) == 0 { - return Err(Error::ApplicantNotApplied); - } + let amount = storage::unclaimed_refund(env, event_id, &contributor); + if amount <= 0 { + return Err(Error::NoRefundOwed); } + storage::set_unclaimed_refund(env, event_id, &contributor, 0); + idempotency::mark_seen(env, &contributor, &op_id); - // Count the submission before writing. There is no cap: each submission - // is its own ledger entry whose write and rent are paid by the - // submitter's transaction, so spam addresses fund their own storage and - // cannot lock real participants out of a full event. - storage::append_submission(env, event_id, &applicant)?; - - let submitted_at = existing - .as_ref() - .map(|s| s.submitted_at) - .unwrap_or_else(|| env.ledger().timestamp()); - - let submission = Submission { - applicant: applicant.clone(), - content_uri: content_uri.clone(), - submitted_at, - }; - storage::set_submission(env, event_id, &applicant, &submission); - - evt::Submitted { + escrow::release(env, &event.token, &contributor, amount); + evt::ContributorRefunded { event_id, - applicant: applicant.clone(), - content_uri, + contributor, + amount, } .publish(env); - - idempotency::mark_seen(env, &applicant, &op_id); Ok(()) } -// ============================================================ -// WITHDRAW SUBMISSION -// ============================================================ -pub fn withdraw_submission( - env: &Env, - event_id: u64, - applicant: Address, - op_id: BytesN<32>, -) -> Result<(), Error> { - admin::require_not_paused(env)?; - - let event = storage::get_event(env, event_id).ok_or(Error::EventNotFound)?; - if !matches!(event.status, EventStatus::Active) { - return Err(Error::EventNotActive); - } - - applicant.require_auth(); - idempotency::require_unseen(env, &applicant, &op_id)?; - - if storage::get_submission(env, event_id, &applicant).is_none() { - return Err(Error::SubmissionNotFound); - } - - storage::remove_submission(env, event_id, &applicant); - - evt::SubmissionWithdrawn { - event_id, - applicant: applicant.clone(), - } - .publish(env); - - idempotency::mark_seen(env, &applicant, &op_id); - Ok(()) +pub fn get_unclaimed_refund(env: &Env, event_id: u64, contributor: Address) -> Result { + storage::get_event(env, event_id).ok_or(Error::EventNotFound)?; + Ok(storage::unclaimed_refund(env, event_id, &contributor)) } // ============================================================ @@ -649,31 +670,28 @@ pub fn select_winners( idempotency::require_unseen(env, &manager, &op_id)?; let existing_count = storage::winner_count(env, event_id); - match event.release_kind { - ReleaseKind::Single => { - // Winner rows but no base-escrow key means a pre-1.3.0 push-model - // event: keep it one-shot. New events award each position once. - if existing_count > 0 && storage::get_prize_base_escrow(env, event_id).is_none() { - return Err(Error::WinnersAlreadySelected); - } - } - ReleaseKind::Multi(_) => { - for idx in 0..existing_count { - if let Some(w) = storage::winner_at(env, event_id, idx) { - if w.milestone.is_none() { - return Err(Error::WinnersAlreadySelected); - } - } - } - } + // A grant selects once, and only a selection gives it winner records. + // Single events award in batches; each position may be awarded once, + // enforced per position below. + if matches!(event.release_kind, ReleaseKind::Multi(_)) && existing_count > 0 { + return Err(Error::WinnersAlreadySelected); } if winners.is_empty() { return Err(Error::NoSubmissions); } - if winners.len() > MAX_WINNERS_PER_SELECT { + let cap = match event.release_kind { + ReleaseKind::Single => MAX_AWARDS_PER_SELECT, + ReleaseKind::Multi(_) => MAX_GRANT_AWARDS, + }; + if winners.len() > cap { return Err(Error::InvalidWinnerPosition); } + for spec in winners.iter() { + if spec.reputation_bump > MAX_REPUTATION_BUMP { + return Err(Error::ReputationBumpTooLarge); + } + } let mut seen_positions: Vec = Vec::new(env); for spec in winners.iter() { @@ -687,54 +705,50 @@ pub fn select_winners( if already { return Err(Error::DuplicateWinnerPosition); } - if event.winner_distribution.get(spec.position).is_none() { - return Err(Error::InvalidWinnerPosition); - } seen_positions.push_back(spec.position); } - let now = env.ledger().timestamp(); + let now = admin::open_time(env); match event.release_kind { ReleaseKind::Single => { - // Amounts are fixed against the escrow baseline captured at the - // first selection; claim_prize does the transfer and profile calls. - let base_escrow = match storage::get_prize_base_escrow(env, event_id) { - Some(b) => b, - None => { - let b = event.remaining_escrow; - storage::set_prize_base_escrow(env, event_id, b); - b - } - }; + // `remaining_escrow` only drops at claim time, so a prize named by + // an earlier selection is still sitting in it. Reserving the owed + // total is what stops a later selection promising the same funds + // twice and leaving the second winner unable to claim. + let owed_before = storage::owed_total(env, event_id); - let mut total_owed: i128 = 0; + let mut batch_total: i128 = 0; for spec in winners.iter() { if storage::get_prize_award(env, event_id, spec.position).is_some() { return Err(Error::DuplicateWinnerPosition); } - let percent = event - .winner_distribution - .get(spec.position) - .ok_or(Error::InvalidDistribution)? as i128; - let amount = base_escrow.saturating_mul(percent) / 100_i128; - if amount <= 0 { + if spec.amount <= 0 { return Err(Error::InvalidDistribution); } - total_owed = total_owed.saturating_add(amount); + if let Some(floor) = event.prize_floors.get(spec.position) { + if spec.amount < floor { + return Err(Error::InvalidDistribution); + } + } + batch_total = batch_total + .checked_add(spec.amount) + .ok_or(Error::InsufficientEscrow)?; } - if total_owed > event.remaining_escrow { + let committed = batch_total + .checked_add(owed_before) + .ok_or(Error::InsufficientEscrow)?; + if committed > event.remaining_escrow { return Err(Error::InsufficientEscrow); } + storage::set_owed_total(env, event_id, committed); for (idx, spec) in winners.iter().enumerate() { - let percent = event - .winner_distribution - .get(spec.position) - .ok_or(Error::InvalidDistribution)? as i128; - let amount = base_escrow.saturating_mul(percent) / 100_i128; + let amount = spec.amount; - let anchor_idx = existing_count + (idx as u32); + let anchor_idx = existing_count + .checked_add(idx as u32) + .ok_or(Error::InvalidWinnerPosition)?; storage::append_winner( env, event_id, @@ -772,7 +786,49 @@ pub fn select_winners( storage::set_prize_claim_expiry(env, event_id, expiry); } } - ReleaseKind::Multi(_) => { + ReleaseKind::Multi(milestones) => { + // Same reservation as Single: milestone claims drain + // `remaining_escrow` gradually, so without it a second grantee + // could be awarded funds the first is still owed. + let owed_before = storage::owed_total(env, event_id); + let mut batch_total: i128 = 0; + let mut roster: Map = Map::new(env); + for spec in winners.iter() { + // Every milestone must pay something, or the award can never + // be released in full. + if spec.amount < milestones as i128 { + return Err(Error::InvalidDistribution); + } + // Releases are tracked per recipient, so a second award to the + // same address could never be paid. + if roster.contains_key(spec.recipient.clone()) { + return Err(Error::DuplicateRecipient); + } + roster.set( + spec.recipient.clone(), + GrantAward { + position: spec.position, + amount: spec.amount, + }, + ); + if let Some(floor) = event.prize_floors.get(spec.position) { + if spec.amount < floor { + return Err(Error::InvalidDistribution); + } + } + batch_total = batch_total + .checked_add(spec.amount) + .ok_or(Error::InsufficientEscrow)?; + } + let committed = batch_total + .checked_add(owed_before) + .ok_or(Error::InsufficientEscrow)?; + if committed > event.remaining_escrow { + return Err(Error::InsufficientEscrow); + } + storage::set_owed_total(env, event_id, committed); + storage::set_grant_roster(env, event_id, &roster); + for spec in winners.iter() { storage::append_winner( env, @@ -780,7 +836,7 @@ pub fn select_winners( &Winner { recipient: spec.recipient.clone(), position: spec.position, - amount: 0, + amount: spec.amount, milestone: None, paid_at: None, }, @@ -792,6 +848,15 @@ pub fn select_winners( let winners_count = winners.len(); storage::set_event(env, event_id, &event); + for spec in winners.iter() { + evt::WinnerAwarded { + event_id, + recipient: spec.recipient, + position: spec.position, + amount: spec.amount, + } + .publish(env); + } evt::WinnersSelected { event_id, count: winners_count, @@ -803,7 +868,7 @@ pub fn select_winners( } // ============================================================ -// CLAIM PRIZE (pull model for Single-release events; #61) +// CLAIM PRIZE (pull model for Single-release events) // ============================================================ pub fn claim_prize( env: &Env, @@ -859,6 +924,17 @@ pub fn claim_prize( let unclaimed = storage::unclaimed_prize_count(env, event_id); storage::set_unclaimed_prize_count(env, event_id, unclaimed.saturating_sub(1)); + // Claiming converts owed into paid; both balances drop together so the + // reservation in select_winners stays exact. Checked rather than clamped: + // owed dropping below a claim means the reservation has already drifted, + // and swallowing that would let the next selection over-promise the pool. + let owed = storage::owed_total(env, event_id); + let owed_after = owed.checked_sub(amount).ok_or(Error::InsufficientEscrow)?; + if owed_after < 0 { + return Err(Error::InsufficientEscrow); + } + storage::set_owed_total(env, event_id, owed_after); + event.remaining_escrow = event.remaining_escrow.saturating_sub(amount); if event.remaining_escrow == 0 { event.status = EventStatus::Completed; @@ -882,10 +958,10 @@ pub fn claim_prize( let profile = profile_client::client(env); let reason_win = Symbol::new(env, "win"); - let bootstrap_op = idempotency::derive_child(env, &op_id, tag::BOOTSTRAP); + let bootstrap_op = idempotency::derive_child(env, &award.recipient, &op_id, tag::BOOTSTRAP); let _ = profile.try_bootstrap(&award.recipient, &bootstrap_op); - let rep_op = idempotency::derive_child(env, &op_id, tag::BUMP_REP); + let rep_op = idempotency::derive_child(env, &award.recipient, &op_id, tag::BUMP_REP); let _ = profile.try_bump_reputation( &award.recipient, &award.reputation_bump, @@ -893,7 +969,8 @@ pub fn claim_prize( &rep_op, ); - let earnings_op = idempotency::derive_child(env, &op_id, tag::REGISTER_EARNINGS); + let earnings_op = + idempotency::derive_child(env, &award.recipient, &op_id, tag::REGISTER_EARNINGS); let _ = profile.try_register_earnings(&award.recipient, &event.token, &amount, &earnings_op); Ok(()) @@ -906,42 +983,6 @@ pub fn get_event(env: &Env, event_id: u64) -> Result { storage::get_event(env, event_id).ok_or(Error::EventNotFound) } -pub fn get_submission(env: &Env, event_id: u64, applicant: Address) -> Result { - storage::get_submission(env, event_id, &applicant).ok_or(Error::SubmissionNotFound) -} - -// Full-list getters return the first VIEW_PAGE_LIMIT entries; use the -// _page variants (or the per-index getters / the off-chain indexer) to -// read beyond that. -pub fn get_applicants(env: &Env, event_id: u64) -> Result, Error> { - get_applicants_page(env, event_id, 0, VIEW_PAGE_LIMIT) -} - -pub fn get_applicants_page( - env: &Env, - event_id: u64, - start: u32, - limit: u32, -) -> Result, Error> { - storage::get_event(env, event_id).ok_or(Error::EventNotFound)?; - Ok(storage::applicants_snapshot( - env, - event_id, - start, - limit.min(VIEW_PAGE_LIMIT), - )) -} - -pub fn get_applicant_count(env: &Env, event_id: u64) -> Result { - storage::get_event(env, event_id).ok_or(Error::EventNotFound)?; - Ok(storage::applicant_count(env, event_id)) -} - -pub fn get_applicant_at(env: &Env, event_id: u64, idx: u32) -> Result, Error> { - storage::get_event(env, event_id).ok_or(Error::EventNotFound)?; - Ok(storage::applicant_at(env, event_id, idx)) -} - pub fn get_winners(env: &Env, event_id: u64) -> Result, Error> { get_winners_page(env, event_id, 0, VIEW_PAGE_LIMIT) } @@ -1008,6 +1049,3 @@ pub fn get_contributor_amount( storage::get_event(env, event_id).ok_or(Error::EventNotFound)?; Ok(storage::get_contributor_amount(env, event_id, &contributor)) } - -#[allow(dead_code)] -const _MARK_USED: (Option,) = (None,); diff --git a/contracts/events/src/events.rs b/contracts/events/src/events.rs index ee6f240..7b70033 100644 --- a/contracts/events/src/events.rs +++ b/contracts/events/src/events.rs @@ -1,8 +1,6 @@ -#![allow(dead_code)] - use soroban_sdk::{contractevent, Address, BytesN, String}; -use crate::types::Pillar; +use crate::types::{CancellationBranch, Pillar}; #[contractevent] pub struct EventCreated { @@ -54,35 +52,51 @@ pub struct ContributorRefunded { } #[contractevent] -pub struct OwnerResidualRefunded { +pub struct WinnerAwarded { pub event_id: u64, - pub owner: Address, + pub recipient: Address, + pub position: u32, pub amount: i128, } #[contractevent] -pub struct Applied { +pub struct CancellationStarted { pub event_id: u64, - pub applicant: Address, + pub branch: CancellationBranch, + pub remaining: i128, + pub non_owner_total: i128, } +/// The fee withheld from a crowdfunding release. `MilestoneClaimed.amount` +/// stays gross; the creator received `amount - fee`. #[contractevent] -pub struct ApplicationWithdrawn { +pub struct MilestoneFeeCharged { pub event_id: u64, - pub applicant: Address, + pub recipient: Address, + pub milestone: u32, + pub fee: i128, } #[contractevent] -pub struct Submitted { +pub struct MilestoneForfeited { pub event_id: u64, - pub applicant: Address, - pub content_uri: String, + pub recipient: Address, + pub milestone: u32, + pub amount: i128, } #[contractevent] -pub struct SubmissionWithdrawn { +pub struct RefundDeferred { pub event_id: u64, - pub applicant: Address, + pub contributor: Address, + pub amount: i128, +} + +#[contractevent] +pub struct OwnerResidualRefunded { + pub event_id: u64, + pub owner: Address, + pub amount: i128, } #[contractevent] @@ -91,7 +105,9 @@ pub struct WinnersSelected { pub count: u32, } -#[contractevent] +// Published with every field, as before SDK 28: indexers read `milestone` as +// a fixed field and must see null, not a missing key. +#[contractevent(sparse = false)] pub struct WinnerPaid { pub event_id: u64, pub recipient: Address, @@ -133,6 +149,26 @@ pub struct FeeAccountUpdated { pub new_account: Address, } +#[contractevent] +pub struct ReleaseValidatorProposed { + pub target: Address, + pub expires_at_ledger: u32, +} + +#[contractevent] +pub struct ValidatorProposalCancelled {} + +#[contractevent(sparse = false)] +pub struct ReleaseValidatorUpdated { + pub validator: Option
, +} + +#[contractevent] +pub struct ManagementReclaimed { + pub event_id: u64, + pub owner: Address, +} + #[contractevent] pub struct FeeBpsUpdated { pub new_bps: u32, diff --git a/contracts/events/src/grant.rs b/contracts/events/src/grant.rs index 5d02524..bde3db7 100644 --- a/contracts/events/src/grant.rs +++ b/contracts/events/src/grant.rs @@ -3,19 +3,73 @@ use soroban_sdk::{Address, BytesN, Env, Symbol}; use crate::admin; use crate::errors::Error; use crate::escrow; +use crate::event_ops::MAX_REPUTATION_BUMP; use crate::events as evt; use crate::idempotency::{self, tag}; use crate::profile_client; use crate::storage; -use crate::types::{EventRecord, EventStatus, Pillar, ReleaseKind, Winner}; +use crate::types::{EventStatus, GrantProgress, Pillar, ReleaseKind, Winner}; -pub fn validate_create(_env: &Env, record: &EventRecord, _owner: &Address) -> Result<(), Error> { - match record.release_kind { - ReleaseKind::Multi(n) if n > 0 => Ok(()), - _ => Err(Error::InvalidReleaseKind), +struct Standing { + position: u32, + award: i128, + settled: u32, + settled_amount: i128, +} + +fn standing(env: &Env, event_id: u64, recipient: &Address) -> Result { + let roster = storage::get_grant_roster(env, event_id).ok_or(Error::NoSubmissions)?; + let award = roster.get(recipient.clone()).ok_or(Error::NoSubmissions)?; + let progress = storage::get_grant_progress(env, event_id, recipient); + Ok(Standing { + position: award.position, + award: award.amount, + settled: progress.settled, + settled_amount: progress.settled_amount, + }) +} + +/// An even share of the award, or what is left of it when this is the last +/// milestone the recipient has open. +fn share(standing: &Standing, total_milestones: u32) -> Result { + if standing.settled.saturating_add(1) == total_milestones { + standing + .award + .checked_sub(standing.settled_amount) + .ok_or(Error::InvalidDistribution) + } else { + Ok(standing.award / (total_milestones as i128)) } } +fn record_settlement( + env: &Env, + event_id: u64, + recipient: &Address, + standing: &Standing, + amount: i128, +) { + storage::set_grant_progress( + env, + event_id, + recipient, + &GrantProgress { + settled: standing.settled.saturating_add(1), + settled_amount: standing.settled_amount.saturating_add(amount), + }, + ); +} + +fn release_owed(env: &Env, event_id: u64, amount: i128) -> Result<(), Error> { + let owed = storage::owed_total(env, event_id); + let owed_after = owed.checked_sub(amount).ok_or(Error::InsufficientEscrow)?; + if owed_after < 0 { + return Err(Error::InsufficientEscrow); + } + storage::set_owed_total(env, event_id, owed_after); + Ok(()) +} + // ============================================================ // CLAIM MILESTONE // ============================================================ @@ -28,6 +82,9 @@ pub fn claim_milestone( op_id: BytesN<32>, ) -> Result<(), Error> { admin::require_not_paused(env)?; + if reputation_bump > MAX_REPUTATION_BUMP { + return Err(Error::ReputationBumpTooLarge); + } let mut event = storage::get_event(env, event_id).ok_or(Error::EventNotFound)?; if !matches!(event.status, EventStatus::Active) { @@ -46,39 +103,31 @@ pub fn claim_milestone( event.owner.require_auth(); idempotency::require_unseen(env, &event.owner, &op_id)?; - if matches!(event.pillar, Pillar::Crowdfunding) { - let admin = storage::get_admin(env)?; - admin.require_auth(); + let is_crowdfunding = matches!(event.pillar, Pillar::Crowdfunding); + if is_crowdfunding { + admin::release_cosigner(env)?.require_auth(); } if storage::is_milestone_claimed(env, event_id, &recipient, milestone) { return Err(Error::MilestoneAlreadyClaimed); } - let count = storage::winner_count(env, event_id); - let mut winner_position: Option = None; - let mut already_claimed_for_recipient: u32 = 0; - let mut already_paid_to_recipient: i128 = 0; - for idx in 0..count { - let w = match storage::winner_at(env, event_id, idx) { - Some(w) => w, - None => continue, - }; - if w.recipient != recipient { - continue; - } - match w.milestone { - None => winner_position = Some(w.position), - Some(_) => { - already_claimed_for_recipient = already_claimed_for_recipient.saturating_add(1); - already_paid_to_recipient = already_paid_to_recipient.saturating_add(w.amount); - } + // A campaign's only recipient is its owner, anchored at position 1 when the + // campaign was created. + let standing = if is_crowdfunding { + if recipient != event.owner { + return Err(Error::NoSubmissions); } - } - let position = winner_position.ok_or(Error::NoSubmissions)?; + None + } else { + Some(standing(env, event_id, &recipient)?) + }; - let is_crowdfunding = matches!(event.pillar, Pillar::Crowdfunding); - let amount: i128 = if is_crowdfunding { + let amount: i128 = if let Some(standing) = &standing { + // The award carries its own amount, set at selection. Milestones split + // that, and whichever settles last takes the rounding remainder. + share(standing, total_milestones)? + } else { let claimed_count = storage::get_crowdfunding_milestones_claimed(env, event_id); let remaining_milestones = total_milestones.saturating_sub(claimed_count); if remaining_milestones == 0 { @@ -92,19 +141,6 @@ pub fn claim_milestone( } else { event.remaining_escrow / (remaining_milestones as i128) } - } else { - let percent = event - .winner_distribution - .get(position) - .ok_or(Error::InvalidWinnerPosition)? as i128; - let total_share = event.total_budget.saturating_mul(percent) / 100_i128; - let per_milestone_floored = total_share / (total_milestones as i128); - - if already_claimed_for_recipient.saturating_add(1) == total_milestones { - total_share.saturating_sub(already_paid_to_recipient) - } else { - per_milestone_floored - } }; if amount <= 0 { return Err(Error::InvalidDistribution); @@ -113,56 +149,129 @@ pub fn claim_milestone( return Err(Error::InsufficientEscrow); } - if is_crowdfunding { - let bps = escrow::effective_fee_bps(env, event.fee_bps_override); - escrow::release_with_fee_at(env, &event.token, &recipient, amount, bps); - } else { - escrow::release(env, &event.token, &recipient, amount); - } event.remaining_escrow = event.remaining_escrow.saturating_sub(amount); storage::mark_milestone_claimed(env, event_id, &recipient, milestone); - if is_crowdfunding { + // Crowdfunding never reserves, since it has no winner selection. + if let Some(standing) = &standing { + release_owed(env, event_id, amount)?; + record_settlement(env, event_id, &recipient, standing, amount); + } else { let claimed = storage::get_crowdfunding_milestones_claimed(env, event_id); storage::set_crowdfunding_milestones_claimed(env, event_id, claimed.saturating_add(1)); } - - let profile = profile_client::client(env); - let reason = Symbol::new(env, "milestone"); - - let bootstrap_op = idempotency::derive_child(env, &op_id, tag::BOOTSTRAP); - profile.bootstrap(&recipient, &bootstrap_op); - - let rep_op = idempotency::derive_child(env, &op_id, tag::BUMP_REP); - profile.bump_reputation(&recipient, &reputation_bump, &reason, &rep_op); - - let earnings_op = idempotency::derive_child(env, &op_id, tag::REGISTER_EARNINGS); - profile.register_earnings(&recipient, &event.token, &amount, &earnings_op); - storage::append_winner( env, event_id, &Winner { recipient: recipient.clone(), - position, + position: standing.as_ref().map_or(1, |s| s.position), amount, milestone: Some(milestone), paid_at: Some(env.ledger().timestamp()), }, ); - if event.remaining_escrow == 0 { event.status = EventStatus::Completed; } storage::set_event(env, event_id, &event); + idempotency::mark_seen(env, &event.owner, &op_id); + + // State written above; release last so a reentrant token can't double-claim. + let fee = if is_crowdfunding { + let bps = escrow::effective_fee_bps(env, event.fee_bps_override); + escrow::release_with_fee_at(env, &event.token, &recipient, amount, bps); + escrow::compute_fee_at(amount, bps) + } else { + escrow::release(env, &event.token, &recipient, amount); + 0 + }; evt::MilestoneClaimed { event_id, - recipient, + recipient: recipient.clone(), milestone, amount, } .publish(env); + if fee > 0 { + evt::MilestoneFeeCharged { + event_id, + recipient: recipient.clone(), + milestone, + fee, + } + .publish(env); + } + + // Best-effort: the payout is final, so a profile failure must not revert it. + let profile = profile_client::client(env); + let reason = Symbol::new(env, "milestone"); + + let bootstrap_op = idempotency::derive_child(env, &event.owner, &op_id, tag::BOOTSTRAP); + let _ = profile.try_bootstrap(&recipient, &bootstrap_op); + + let rep_op = idempotency::derive_child(env, &event.owner, &op_id, tag::BUMP_REP); + let _ = profile.try_bump_reputation(&recipient, &reputation_bump, &reason, &rep_op); + + let earnings_op = idempotency::derive_child(env, &event.owner, &op_id, tag::REGISTER_EARNINGS); + let _ = profile.try_register_earnings(&recipient, &event.token, &amount, &earnings_op); + + Ok(()) +} + +// ============================================================ +// FORFEIT MILESTONE +// ============================================================ +/// Ends a milestone without paying it. Its share stays in escrow, no longer +/// owed to anyone, and goes back with the rest when the grant is closed. +pub fn forfeit_milestone( + env: &Env, + event_id: u64, + recipient: Address, + milestone: u32, + op_id: BytesN<32>, +) -> Result<(), Error> { + admin::require_not_paused(env)?; + + let event = storage::get_event(env, event_id).ok_or(Error::EventNotFound)?; + if !matches!(event.status, EventStatus::Active) { + return Err(Error::EventNotActive); + } + if !matches!(event.pillar, Pillar::Grant) { + return Err(Error::InvalidPillar); + } + let total_milestones = match event.release_kind { + ReleaseKind::Multi(n) if n > 0 => n, + _ => return Err(Error::InvalidReleaseKind), + }; + if milestone >= total_milestones { + return Err(Error::InvalidMilestone); + } + + event.owner.require_auth(); + idempotency::require_unseen(env, &event.owner, &op_id)?; + if storage::is_milestone_claimed(env, event_id, &recipient, milestone) { + return Err(Error::MilestoneAlreadyClaimed); + } + + let standing = standing(env, event_id, &recipient)?; + let amount = share(&standing, total_milestones)?; + if amount <= 0 { + return Err(Error::InvalidDistribution); + } + + release_owed(env, event_id, amount)?; + storage::mark_milestone_claimed(env, event_id, &recipient, milestone); + record_settlement(env, event_id, &recipient, &standing, amount); idempotency::mark_seen(env, &event.owner, &op_id); + + evt::MilestoneForfeited { + event_id, + recipient, + milestone, + amount, + } + .publish(env); Ok(()) } diff --git a/contracts/events/src/hackathon.rs b/contracts/events/src/hackathon.rs deleted file mode 100644 index f212590..0000000 --- a/contracts/events/src/hackathon.rs +++ /dev/null @@ -1,13 +0,0 @@ -#![allow(dead_code)] - -use soroban_sdk::{Address, Env}; - -use crate::errors::Error; -use crate::types::{EventRecord, ReleaseKind}; - -pub fn validate_create(_env: &Env, record: &EventRecord, _owner: &Address) -> Result<(), Error> { - if !matches!(record.release_kind, ReleaseKind::Single) { - return Err(Error::InvalidReleaseKind); - } - Ok(()) -} diff --git a/contracts/events/src/idempotency.rs b/contracts/events/src/idempotency.rs index c052cc5..a5be3c9 100644 --- a/contracts/events/src/idempotency.rs +++ b/contracts/events/src/idempotency.rs @@ -1,5 +1,3 @@ -#![allow(dead_code)] - use soroban_sdk::{xdr::ToXdr, Address, Bytes, BytesN, Env}; use crate::errors::Error; @@ -37,26 +35,35 @@ pub fn next_event_id(env: &Env) -> Result { pub mod tag { pub const BOOTSTRAP: u8 = 0xB0; pub const BUMP_REP: u8 = 0xD1; - pub const SLASH_REP: u8 = 0xD2; pub const REGISTER_EARNINGS: u8 = 0xE1; } /// Collision-resistant child op_id. /// -/// Invariant: `sha256(parent โ€– op_tag โ€– sub_idx โ€– callee_contract_id)`. +/// Invariant: `sha256(parent โ€– op_tag โ€– sub_idx โ€– callee_contract_id โ€– domain)`. /// XOR into parent bytes is malleable (reversible, squat-friendly); hashing with -/// the profile contract id as domain separator is not. -pub fn derive_child(env: &Env, parent: &BytesN<32>, op_tag: u8) -> BytesN<32> { - derive_child_indexed(env, parent, op_tag, 0) +/// the profile contract id as domain separator is not. `domain` is the address +/// that authorized the parent call: the profile keeps one seen-set for every +/// events caller, so without it anyone who learns an op_id could spend its +/// children first. +pub fn derive_child(env: &Env, domain: &Address, parent: &BytesN<32>, op_tag: u8) -> BytesN<32> { + derive_child_indexed(env, domain, parent, op_tag, 0) } -pub fn derive_child_indexed(env: &Env, parent: &BytesN<32>, op_tag: u8, sub_idx: u8) -> BytesN<32> { +pub fn derive_child_indexed( + env: &Env, + domain: &Address, + parent: &BytesN<32>, + op_tag: u8, + sub_idx: u8, +) -> BytesN<32> { let callee = storage::get_profile_contract(env); let mut payload = Bytes::new(env); payload.append(&Bytes::from_array(env, &parent.to_array())); payload.push_back(op_tag); payload.push_back(sub_idx); payload.append(&callee.to_xdr(env)); + payload.append(&domain.clone().to_xdr(env)); let digest = env.crypto().sha256(&payload); BytesN::from_array(env, &digest.to_array()) } diff --git a/contracts/events/src/lib.rs b/contracts/events/src/lib.rs index 2011462..5bd7ec2 100644 --- a/contracts/events/src/lib.rs +++ b/contracts/events/src/lib.rs @@ -4,19 +4,16 @@ use soroban_sdk::{contract, contractimpl, contractmeta, Address, BytesN, Env, String, Vec}; mod admin; -mod bounty; -mod crowdfunding; -mod errors; +pub mod errors; mod escrow; mod event_ops; mod events; mod grant; -mod hackathon; mod idempotency; mod profile_client; mod storage; mod token_whitelist; -mod types; +pub mod types; #[cfg(test)] mod tests; @@ -24,7 +21,7 @@ mod tests; use crate::errors::Error; use crate::types::*; -contractmeta!(key = "version", val = "1.6.0"); +contractmeta!(key = "version", val = "2.0.0"); contractmeta!( key = "description", val = "Boundless events contract: hackathon, bounty, grant + escrow" @@ -68,6 +65,30 @@ impl EventsContract { admin::set_fee_account(&env, new_account) } + pub fn propose_release_validator(env: Env, target: Address) -> Result<(), Error> { + admin::propose_release_validator(&env, target) + } + + pub fn accept_release_validator(env: Env) -> Result<(), Error> { + admin::accept_release_validator(&env) + } + + pub fn cancel_pending_release_validator(env: Env) -> Result<(), Error> { + admin::cancel_pending_release_validator(&env) + } + + pub fn clear_release_validator(env: Env) -> Result<(), Error> { + admin::clear_release_validator(&env) + } + + pub fn get_release_validator(env: Env) -> Option
{ + storage::get_release_validator(&env) + } + + pub fn get_pending_release_validator(env: Env) -> Option { + storage::get_pending_release_validator(&env) + } + pub fn set_profile_contract(env: Env, new_addr: Address) -> Result<(), Error> { admin::set_profile_contract(&env, new_addr) } @@ -96,6 +117,13 @@ impl EventsContract { admin::cancel_pending_upgrade(&env) } + /// Converts up to `max_events` pre-1.7.0 event records, returning how many + /// remain. Loop until it reports zero, then call `migrate`. Paged because + /// one invocation cannot touch every event of a deployment with history. + pub fn migrate_events(env: Env, max_events: u32) -> Result { + admin::migrate_events(&env, max_events) + } + pub fn migrate(env: Env) -> Result<(), Error> { admin::migrate(&env) } @@ -151,57 +179,31 @@ impl EventsContract { event_ops::finalize_cancel(&env, event_id, op_id) } - pub fn add_funds( + pub fn claim_refund( env: Env, event_id: u64, - from: Address, - amount: i128, - op_id: BytesN<32>, - ) -> Result<(), Error> { - event_ops::add_funds(&env, event_id, from, amount, op_id) - } - - // ============================================================ - // BOUNTY PARTICIPATION - // ============================================================ - pub fn apply_to_bounty( - env: Env, - bounty_id: u64, - applicant: Address, - op_id: BytesN<32>, - ) -> Result<(), Error> { - bounty::apply(&env, bounty_id, applicant, op_id) - } - - pub fn withdraw_application( - env: Env, - bounty_id: u64, - applicant: Address, + contributor: Address, op_id: BytesN<32>, ) -> Result<(), Error> { - bounty::withdraw_application(&env, bounty_id, applicant, op_id) + event_ops::claim_refund(&env, event_id, contributor, op_id) } - // ============================================================ - // SUBMISSION - // ============================================================ - pub fn submit( + pub fn get_unclaimed_refund( env: Env, event_id: u64, - applicant: Address, - content_uri: String, - op_id: BytesN<32>, - ) -> Result<(), Error> { - event_ops::submit(&env, event_id, applicant, content_uri, op_id) + contributor: Address, + ) -> Result { + event_ops::get_unclaimed_refund(&env, event_id, contributor) } - pub fn withdraw_submission( + pub fn add_funds( env: Env, event_id: u64, - applicant: Address, + from: Address, + amount: i128, op_id: BytesN<32>, ) -> Result<(), Error> { - event_ops::withdraw_submission(&env, event_id, applicant, op_id) + event_ops::add_funds(&env, event_id, from, amount, op_id) } // ============================================================ @@ -232,6 +234,10 @@ impl EventsContract { event_ops::propose_manager(&env, event_id, new_manager) } + pub fn reclaim_management(env: Env, event_id: u64) -> Result<(), Error> { + event_ops::reclaim_management(&env, event_id) + } + pub fn accept_manager(env: Env, event_id: u64) -> Result<(), Error> { event_ops::accept_manager(&env, event_id) } @@ -262,39 +268,18 @@ impl EventsContract { // ============================================================ // READS (id-keyed only; no linear scans) // ============================================================ - pub fn get_event(env: Env, event_id: u64) -> Result { - event_ops::get_event(&env, event_id) - } - - pub fn get_submission( - env: Env, - event_id: u64, - applicant: Address, - ) -> Result { - event_ops::get_submission(&env, event_id, applicant) - } - - // Full-list getters return the first page (VIEW_PAGE_LIMIT entries); - // page through the _page variants or the per-index getters for more. - pub fn get_applicants(env: Env, event_id: u64) -> Result, Error> { - event_ops::get_applicants(&env, event_id) - } - - pub fn get_applicants_page( + pub fn forfeit_milestone( env: Env, event_id: u64, - start: u32, - limit: u32, - ) -> Result, Error> { - event_ops::get_applicants_page(&env, event_id, start, limit) - } - - pub fn get_applicant_count(env: Env, event_id: u64) -> Result { - event_ops::get_applicant_count(&env, event_id) + recipient: Address, + milestone: u32, + op_id: BytesN<32>, + ) -> Result<(), Error> { + grant::forfeit_milestone(&env, event_id, recipient, milestone, op_id) } - pub fn get_applicant_at(env: Env, event_id: u64, idx: u32) -> Result, Error> { - event_ops::get_applicant_at(&env, event_id, idx) + pub fn get_event(env: Env, event_id: u64) -> Result { + event_ops::get_event(&env, event_id) } pub fn get_winners(env: Env, event_id: u64) -> Result, Error> { diff --git a/contracts/events/src/profile_client.rs b/contracts/events/src/profile_client.rs index ab4b1d9..8e1b04e 100644 --- a/contracts/events/src/profile_client.rs +++ b/contracts/events/src/profile_client.rs @@ -5,7 +5,6 @@ use soroban_sdk::{contractclient, Address, BytesN, Env, Symbol}; pub trait ProfileInterface { fn bootstrap(env: Env, user: Address, op_id: BytesN<32>); fn bump_reputation(env: Env, user: Address, delta: u32, reason: Symbol, op_id: BytesN<32>); - fn slash_reputation(env: Env, user: Address, delta: u32, reason: Symbol, op_id: BytesN<32>); fn register_earnings(env: Env, user: Address, token: Address, amount: i128, op_id: BytesN<32>); } diff --git a/contracts/events/src/storage.rs b/contracts/events/src/storage.rs index 7eeae1b..04c1af4 100644 --- a/contracts/events/src/storage.rs +++ b/contracts/events/src/storage.rs @@ -1,13 +1,9 @@ -#![allow(dead_code)] - -use soroban_sdk::{contracttype, Address, BytesN, Env, Vec}; - -use soroban_sdk::String; +use soroban_sdk::{Address, BytesN, Env, Map, String, Vec}; use crate::errors::Error; use crate::types::{ - CancellationState, DataKey, EventRecord, PendingAdmin, PendingManager, PendingUpgrade, - PrizeAward, Submission, Winner, + CancellationState, DataKey, EventRecord, GrantAward, GrantProgress, PendingAdmin, + PendingManager, PendingUpgrade, PendingValidator, PrizeAward, Winner, }; // ============================================================ @@ -19,11 +15,6 @@ const INSTANCE_TTL_BUMP: u32 = 518_400; const EVENT_TTL_THRESHOLD: u32 = 86_400; const EVENT_TTL_BUMP: u32 = 1_555_200; -#[contracttype(export = false)] -enum LegacyDataKey { - OpSeen(BytesN<32>), -} - pub fn touch_instance(env: &Env) { env.storage() .instance() @@ -110,6 +101,59 @@ pub fn set_paused(env: &Env, paused: bool) { env.storage().instance().set(&DataKey::Paused, &paused); } +pub fn get_release_validator(env: &Env) -> Option
{ + env.storage().instance().get(&DataKey::ReleaseValidator) +} + +pub fn set_release_validator(env: &Env, validator: &Option
) { + match validator { + Some(v) => env.storage().instance().set(&DataKey::ReleaseValidator, v), + None => env.storage().instance().remove(&DataKey::ReleaseValidator), + } +} + +pub fn get_pending_release_validator(env: &Env) -> Option { + env.storage() + .instance() + .get(&DataKey::PendingReleaseValidator) +} + +pub fn set_pending_release_validator(env: &Env, pending: &PendingValidator) { + env.storage() + .instance() + .set(&DataKey::PendingReleaseValidator, pending); +} + +pub fn clear_pending_release_validator(env: &Env) { + env.storage() + .instance() + .remove(&DataKey::PendingReleaseValidator); +} + +pub fn get_paused_at(env: &Env) -> Option { + env.storage().instance().get(&DataKey::PausedAt) +} + +pub fn set_paused_at(env: &Env, at: Option) { + match at { + Some(at) => env.storage().instance().set(&DataKey::PausedAt, &at), + None => env.storage().instance().remove(&DataKey::PausedAt), + } +} + +pub fn get_paused_seconds(env: &Env) -> u64 { + env.storage() + .instance() + .get(&DataKey::PausedSeconds) + .unwrap_or(0) +} + +pub fn set_paused_seconds(env: &Env, seconds: u64) { + env.storage() + .instance() + .set(&DataKey::PausedSeconds, &seconds); +} + pub fn get_deployment_seq(env: &Env) -> u32 { env.storage() .instance() @@ -122,7 +166,7 @@ pub fn set_deployment_seq(env: &Env, seq: u32) { } // ============================================================ -// VERSION / UPGRADE / MIGRATION (instance; H6) +// VERSION / UPGRADE / MIGRATION (instance) // ============================================================ pub fn get_version(env: &Env) -> Option { env.storage().instance().get(&DataKey::Version) @@ -146,6 +190,14 @@ pub fn clear_pending_upgrade(env: &Env) { env.storage().instance().remove(&DataKey::PendingUpgrade); } +pub fn get_migration_cursor(env: &Env) -> Option { + env.storage().instance().get(&DataKey::MigrationCursor) +} + +pub fn set_migration_cursor(env: &Env, id: u64) { + env.storage().instance().set(&DataKey::MigrationCursor, &id); +} + pub fn get_migrated_to_version(env: &Env) -> Option { env.storage().instance().get(&DataKey::MigratedToVersion) } @@ -292,6 +344,12 @@ pub fn set_event_manager(env: &Env, id: u64, manager: &Address) { touch_event_persistent(env, &key); } +pub fn clear_event_manager(env: &Env, id: u64) { + env.storage() + .persistent() + .remove(&DataKey::EventManager(id)); +} + pub fn get_pending_manager(env: &Env, id: u64) -> Option { let key = DataKey::PendingManager(id); let p: Option = env.storage().persistent().get(&key); @@ -313,178 +371,6 @@ pub fn clear_pending_manager(env: &Env, id: u64) { .remove(&DataKey::PendingManager(id)); } -// ============================================================ -// APPLICANTS (paged, persistent) -// ============================================================ -pub fn applicant_count(env: &Env, id: u64) -> u32 { - let key = DataKey::EventApplicantCount(id); - let n: Option = env.storage().persistent().get(&key); - if n.is_some() { - touch_event_persistent(env, &key); - } - n.unwrap_or(0) -} - -pub fn applicant_at(env: &Env, id: u64, idx: u32) -> Option
{ - let key = DataKey::EventApplicantAt(id, idx); - let addr: Option
= env.storage().persistent().get(&key); - if addr.is_some() { - touch_event_persistent(env, &key); - } - addr -} - -pub fn applicant_slot(env: &Env, id: u64, addr: &Address) -> u32 { - let key = DataKey::EventApplicantSlot(id, addr.clone()); - let slot: Option = env.storage().persistent().get(&key); - if slot.is_some() { - touch_event_persistent(env, &key); - } - slot.unwrap_or(0) -} - -pub fn append_applicant(env: &Env, id: u64, addr: &Address) -> Result { - if applicant_slot(env, id, addr) != 0 { - return Err(Error::ApplicantAlreadyApplied); - } - let cur = applicant_count(env, id); - // No product cap: each applicant is its own ledger entry paid for by the - // applicant's own transaction, so growth is O(1) per append. Only guard - // the u32 counter itself. - let slot = cur.checked_add(1).ok_or(Error::TooManyApplicants)?; - let at_key = DataKey::EventApplicantAt(id, cur); - env.storage().persistent().set(&at_key, addr); - touch_event_persistent(env, &at_key); - - let slot_key = DataKey::EventApplicantSlot(id, addr.clone()); - env.storage().persistent().set(&slot_key, &slot); - touch_event_persistent(env, &slot_key); - - let count_key = DataKey::EventApplicantCount(id); - env.storage().persistent().set(&count_key, &slot); - touch_event_persistent(env, &count_key); - Ok(slot) -} - -pub fn remove_applicant(env: &Env, id: u64, addr: &Address) -> Result<(), Error> { - let slot = applicant_slot(env, id, addr); - if slot == 0 { - return Err(Error::ApplicantNotApplied); - } - let idx = slot.checked_sub(1).ok_or(Error::ApplicantNotApplied)?; - let count = applicant_count(env, id); - let last_idx = count.checked_sub(1).ok_or(Error::EventNotFound)?; - - if idx != last_idx { - let last_addr = applicant_at(env, id, last_idx).ok_or(Error::EventNotFound)?; - let at_key = DataKey::EventApplicantAt(id, idx); - env.storage().persistent().set(&at_key, &last_addr); - touch_event_persistent(env, &at_key); - - let last_slot_key = DataKey::EventApplicantSlot(id, last_addr.clone()); - env.storage().persistent().set(&last_slot_key, &slot); - touch_event_persistent(env, &last_slot_key); - } - - env.storage() - .persistent() - .remove(&DataKey::EventApplicantAt(id, last_idx)); - env.storage() - .persistent() - .remove(&DataKey::EventApplicantSlot(id, addr.clone())); - - let count_key = DataKey::EventApplicantCount(id); - let new_count = count.checked_sub(1).ok_or(Error::EventNotFound)?; - if new_count == 0 { - env.storage().persistent().remove(&count_key); - } else { - env.storage().persistent().set(&count_key, &new_count); - touch_event_persistent(env, &count_key); - } - Ok(()) -} - -pub fn applicants_snapshot(env: &Env, id: u64, start: u32, limit: u32) -> Vec
{ - let count = applicant_count(env, id); - let end = start.saturating_add(limit).min(count); - let mut out: Vec
= Vec::new(env); - for idx in start..end { - if let Some(addr) = applicant_at(env, id, idx) { - out.push_back(addr); - } - } - out -} - -// ============================================================ -// SUBMISSIONS (per-entry, persistent) -// ============================================================ -pub fn get_submission(env: &Env, id: u64, applicant: &Address) -> Option { - let key = DataKey::EventSubmission(id, applicant.clone()); - let s: Option = env.storage().persistent().get(&key); - if s.is_some() { - touch_event_persistent(env, &key); - } - s -} - -pub fn set_submission(env: &Env, id: u64, applicant: &Address, submission: &Submission) { - let key = DataKey::EventSubmission(id, applicant.clone()); - env.storage().persistent().set(&key, submission); - touch_event_persistent(env, &key); -} - -pub fn remove_submission(env: &Env, id: u64, applicant: &Address) { - // Idempotent: a no-op when there is nothing to remove, symmetrically - // with append_submission, so a caller that skips its own existence - // check can't silently corrupt the counter by decrementing for an - // applicant that never had a submission. - if get_submission(env, id, applicant).is_none() { - return; - } - - let key = DataKey::EventSubmission(id, applicant.clone()); - env.storage().persistent().remove(&key); - - let count_key = DataKey::EventSubmissionCount(id); - let next = submission_count(env, id).saturating_sub(1); - if next == 0 { - env.storage().persistent().remove(&count_key); - } else { - env.storage().persistent().set(&count_key, &next); - touch_event_persistent(env, &count_key); - } -} - -pub fn submission_count(env: &Env, id: u64) -> u32 { - let key = DataKey::EventSubmissionCount(id); - let n: Option = env.storage().persistent().get(&key); - if n.is_some() { - touch_event_persistent(env, &key); - } - n.unwrap_or(0) -} - -/// Count a new submission before writing the entry (mirrors -/// `append_contributor`/`append_applicant`). A no-op when the applicant -/// already has a submission โ€” re-submission updates the existing entry in -/// place and must not recount. -/// -/// Returns `Error::TooManyContributors` only on u32 counter overflow โ€” -/// reused rather than a new variant since the errors enum is at the -/// 50-case XDR cap. -pub fn append_submission(env: &Env, id: u64, addr: &Address) -> Result<(), Error> { - if get_submission(env, id, addr).is_some() { - return Ok(()); - } - let cur = submission_count(env, id); - let next = cur.checked_add(1).ok_or(Error::TooManyContributors)?; - let count_key = DataKey::EventSubmissionCount(id); - env.storage().persistent().set(&count_key, &next); - touch_event_persistent(env, &count_key); - Ok(()) -} - // ============================================================ // WINNERS (paged, persistent) // ============================================================ @@ -557,18 +443,18 @@ pub fn set_unclaimed_prize_count(env: &Env, id: u64, count: u32) { touch_event_persistent(env, &key); } -pub fn get_prize_base_escrow(env: &Env, id: u64) -> Option { - let key = DataKey::EventPrizeBaseEscrow(id); - let b: Option = env.storage().persistent().get(&key); - if b.is_some() { +pub fn owed_total(env: &Env, id: u64) -> i128 { + let key = DataKey::EventOwedTotal(id); + let t: Option = env.storage().persistent().get(&key); + if t.is_some() { touch_event_persistent(env, &key); } - b + t.unwrap_or(0) } -pub fn set_prize_base_escrow(env: &Env, id: u64, base: i128) { - let key = DataKey::EventPrizeBaseEscrow(id); - env.storage().persistent().set(&key, &base); +pub fn set_owed_total(env: &Env, id: u64, owed: i128) { + let key = DataKey::EventOwedTotal(id); + env.storage().persistent().set(&key, &owed); touch_event_persistent(env, &key); } @@ -710,6 +596,55 @@ pub fn mark_milestone_claimed(env: &Env, id: u64, recipient: &Address, milestone touch_event_persistent(env, &key); } +pub fn get_grant_roster(env: &Env, id: u64) -> Option> { + let key = DataKey::GrantRoster(id); + let roster: Option> = env.storage().persistent().get(&key); + if roster.is_some() { + touch_event_persistent(env, &key); + } + roster +} + +pub fn set_grant_roster(env: &Env, id: u64, roster: &Map) { + let key = DataKey::GrantRoster(id); + env.storage().persistent().set(&key, roster); + touch_event_persistent(env, &key); +} + +pub fn get_grant_progress(env: &Env, id: u64, recipient: &Address) -> GrantProgress { + let key = DataKey::GrantProgress(id, recipient.clone()); + let progress: Option = env.storage().persistent().get(&key); + if progress.is_some() { + touch_event_persistent(env, &key); + } + progress.unwrap_or_default() +} + +pub fn set_grant_progress(env: &Env, id: u64, recipient: &Address, progress: &GrantProgress) { + let key = DataKey::GrantProgress(id, recipient.clone()); + env.storage().persistent().set(&key, progress); + touch_event_persistent(env, &key); +} + +pub fn unclaimed_refund(env: &Env, id: u64, contributor: &Address) -> i128 { + let key = DataKey::UnclaimedRefund(id, contributor.clone()); + let amount: Option = env.storage().persistent().get(&key); + if amount.is_some() { + touch_event_persistent(env, &key); + } + amount.unwrap_or(0) +} + +pub fn set_unclaimed_refund(env: &Env, id: u64, contributor: &Address, amount: i128) { + let key = DataKey::UnclaimedRefund(id, contributor.clone()); + if amount > 0 { + env.storage().persistent().set(&key, &amount); + touch_event_persistent(env, &key); + } else { + env.storage().persistent().remove(&key); + } +} + // ============================================================ // CROWDFUNDING MILESTONES CLAIMED (persistent) // ============================================================ @@ -756,17 +691,10 @@ pub fn clear_cancellation_state(env: &Env, id: u64) { // IDEMPOTENCY (temporary; auto-TTL) // ============================================================ pub fn is_op_seen(env: &Env, domain: &Address, op_id: &BytesN<32>) -> bool { - let scoped_seen = env - .storage() + env.storage() .temporary() .get(&DataKey::OpSeen(domain.clone(), op_id.clone())) - .unwrap_or(false); - scoped_seen - || env - .storage() - .temporary() - .get(&LegacyDataKey::OpSeen(op_id.clone())) - .unwrap_or(false) + .unwrap_or(false) } pub fn mark_op_seen(env: &Env, domain: &Address, op_id: &BytesN<32>) { diff --git a/contracts/events/src/tests/admin.rs b/contracts/events/src/tests/admin.rs index 4199fd8..92bb7ea 100644 --- a/contracts/events/src/tests/admin.rs +++ b/contracts/events/src/tests/admin.rs @@ -2,11 +2,13 @@ use soroban_sdk::{ testutils::{Address as _, BytesN as _, Ledger}, - Address, BytesN, String, + Address, BytesN, Map, String, }; use super::common::setup; use crate::errors::Error; +use crate::storage; +use crate::types::{DataKey, EventStatus, Pillar, ReleaseKind}; const UPGRADE_TIMELOCK_LEDGERS: u32 = 17_280; const PENDING_UPGRADE_TTL_LEDGERS: u32 = 518_400; @@ -18,8 +20,8 @@ fn initializes_with_expected_config() { assert_eq!(ctx.client.get_fee_account(), ctx.fee_account); assert_eq!(ctx.client.get_fee_bps(), 250); assert_eq!(ctx.client.get_profile_contract(), ctx.profile_contract); - assert_eq!(ctx.client.is_paused(), false); - assert_eq!(ctx.client.version(), String::from_str(&ctx.env, "1.6.0")); + assert!(!ctx.client.is_paused()); + assert_eq!(ctx.client.version(), String::from_str(&ctx.env, "2.0.0")); assert_eq!(ctx.client.get_pending_upgrade(), None); assert_eq!(ctx.client.get_migrated_to_version(), None); } @@ -28,9 +30,9 @@ fn initializes_with_expected_config() { fn pause_and_unpause_round_trip() { let ctx = setup(250); ctx.client.pause(); - assert_eq!(ctx.client.is_paused(), true); + assert!(ctx.client.is_paused()); ctx.client.unpause(); - assert_eq!(ctx.client.is_paused(), false); + assert!(!ctx.client.is_paused()); } #[test] @@ -76,27 +78,34 @@ fn propose_upgrade_rejects_empty_version() { let err = ctx .client .try_propose_upgrade(&new_hash, &empty) - .err() - .expect("empty version rejected") + .expect_err("empty version rejected") .unwrap(); assert_eq!(err, Error::InvalidPillar); } #[test] -fn apply_upgrade_before_timelock_reverts() { +fn apply_upgrade_waits_out_the_timelock() { let ctx = setup(250); let new_hash: BytesN<32> = BytesN::random(&ctx.env); let new_version = String::from_str(&ctx.env, "0.3.0"); ctx.client.propose_upgrade(&new_hash, &new_version); - let err = ctx - .client - .try_apply_upgrade() - .err() - .expect("timelock blocks") - .unwrap(); - assert_eq!(err, Error::UpgradeTimelockNotElapsed); - assert_eq!(ctx.client.version(), String::from_str(&ctx.env, "1.6.0")); + let pending = ctx.client.get_pending_upgrade().expect("proposal"); + assert_eq!( + pending.available_at_ledger, + pending.proposed_at_ledger + UPGRADE_TIMELOCK_LEDGERS + ); + assert_eq!( + ctx.client.try_apply_upgrade().err().unwrap().unwrap(), + Error::UpgradeTimelockNotElapsed + ); + ctx.env.ledger().with_mut(|li| { + li.sequence_number = pending.available_at_ledger - 1; + }); + assert_eq!( + ctx.client.try_apply_upgrade().err().unwrap().unwrap(), + Error::UpgradeTimelockNotElapsed + ); } #[test] @@ -114,8 +123,7 @@ fn apply_upgrade_after_expiry_reverts() { let err = ctx .client .try_apply_upgrade() - .err() - .expect("expiry blocks") + .expect_err("expiry blocks") .unwrap(); assert_eq!(err, Error::UpgradeProposalExpired); } @@ -130,7 +138,7 @@ fn cancel_pending_upgrade_clears_proposal() { ctx.client.cancel_pending_upgrade(); assert_eq!(ctx.client.get_pending_upgrade(), None); - assert_eq!(ctx.client.version(), String::from_str(&ctx.env, "1.6.0")); + assert_eq!(ctx.client.version(), String::from_str(&ctx.env, "2.0.0")); } #[test] @@ -139,27 +147,259 @@ fn cancel_with_no_pending_reverts() { let err = ctx .client .try_cancel_pending_upgrade() - .err() - .expect("nothing to cancel") + .expect_err("nothing to cancel") .unwrap(); assert_eq!(err, Error::UpgradeNotProposed); } +/// The pre-1.7.0 record layout, written directly into storage so migrate has a +/// legacy row to convert. Mirrors what the two mainnet events look like. +#[soroban_sdk::contracttype] +#[derive(Clone)] +struct LegacyEventRecord { + pub id: u64, + pub pillar: Pillar, + pub owner: Address, + pub token: Address, + pub total_budget: i128, + pub remaining_escrow: i128, + pub release_kind: ReleaseKind, + pub status: EventStatus, + pub content_uri: String, + pub title: String, + pub created_at: u64, + pub deadline: Option, + pub winner_distribution: Map, + pub fee_bps_override: Option, +} + +#[test] +fn migrate_rewrites_legacy_percentages_as_prize_floors() { + let ctx = setup(250); + let budget = 1_000_0000000_i128; + + // Stand in for mainnet event ...610: a 60/40 split, already settled. + let mut dist = Map::new(&ctx.env); + dist.set(1, 60_u32); + dist.set(2, 40_u32); + + let id_base = ctx.client.id_base(); + let event_id = id_base + 1; + let legacy = LegacyEventRecord { + id: event_id, + pillar: Pillar::Bounty, + owner: Address::generate(&ctx.env), + token: Address::generate(&ctx.env), + total_budget: budget, + remaining_escrow: 0, + release_kind: ReleaseKind::Single, + status: EventStatus::Completed, + content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/legacy"), + title: String::from_str(&ctx.env, "Muwa Creator Bounty"), + created_at: 1, + deadline: None, + winner_distribution: dist, + fee_bps_override: None, + }; + + ctx.env.as_contract(&ctx.client.address, || { + ctx.env + .storage() + .persistent() + .set(&DataKey::Event(event_id), &legacy); + ctx.env + .storage() + .instance() + .set(&DataKey::NextEventId, &(event_id + 1)); + }); + + ctx.client.migrate_events(&8_u32); + ctx.client.migrate(); + + // Readable again through the current struct, which could not decode it + // before, and the percentages have become the amounts they always meant. + let migrated = ctx.client.get_event(&event_id); + assert_eq!(migrated.prize_floors.get(1), Some(budget * 60 / 100)); + assert_eq!(migrated.prize_floors.get(2), Some(budget * 40 / 100)); + assert_eq!(migrated.total_budget, budget); + assert_eq!(migrated.status, EventStatus::Completed); + assert_eq!( + migrated.title, + String::from_str(&ctx.env, "Muwa Creator Bounty") + ); +} + +#[test] +fn migrate_refuses_to_stamp_while_events_remain_unconverted() { + // One invocation may touch only 100 ledger entries, so a deployment with + // history is converted in slices. Stamping before the cursor reaches the + // end would strand the remainder in a layout nothing can decode, and + // migrate is one-shot. + let ctx = setup(250); + let base = ctx.client.id_base(); + ctx.env.as_contract(&ctx.client.address, || { + ctx.env + .storage() + .instance() + .set(&DataKey::NextEventId, &(base + 20)); + }); + + assert_eq!( + ctx.client.try_migrate().unwrap_err().unwrap(), + Error::MigrationIncomplete, + "must not stamp while events are unconverted" + ); + assert_eq!(ctx.client.get_migrated_to_version(), None); + + // Page through: 8 per call, so 19 events need three calls. + assert_eq!(ctx.client.migrate_events(&8_u32), 11); + assert_eq!(ctx.client.migrate_events(&8_u32), 3); + assert_eq!( + ctx.client.try_migrate().unwrap_err().unwrap(), + Error::MigrationIncomplete, + "still incomplete after two of three pages" + ); + assert_eq!(ctx.client.migrate_events(&8_u32), 0); + + ctx.client.migrate(); + assert_eq!( + ctx.client.get_migrated_to_version(), + Some(String::from_str(&ctx.env, "2.0.0")) + ); +} + +#[test] +fn migrate_events_caps_each_call_regardless_of_the_argument() { + let ctx = setup(250); + let base = ctx.client.id_base(); + ctx.env.as_contract(&ctx.client.address, || { + ctx.env + .storage() + .instance() + .set(&DataKey::NextEventId, &(base + 30)); + }); + + // Asking for more than the per-call ceiling must not blow the footprint. + assert_eq!(ctx.client.migrate_events(&1_000_u32), 21); + // 0 means "use the ceiling" rather than "do nothing". + assert_eq!(ctx.client.migrate_events(&0_u32), 13); +} + +#[test] +fn migrate_skips_rows_already_in_the_current_layout() { + // A fresh 2.0.0 deployment writes new-layout events, and the runbook still + // calls migrate() after apply. Decoding those as the legacy shape used to + // abort the whole invocation. + let ctx = setup(250); + let event_id = ctx.client.id_base() + 1; + let mut floors = Map::new(&ctx.env); + floors.set(1, 500_i128); + let current = crate::types::EventRecord { + id: event_id, + pillar: Pillar::Bounty, + owner: Address::generate(&ctx.env), + token: Address::generate(&ctx.env), + total_budget: 1_000_i128, + remaining_escrow: 1_000_i128, + release_kind: ReleaseKind::Single, + status: EventStatus::Active, + content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/new"), + title: String::from_str(&ctx.env, "Already Migrated"), + created_at: 1, + deadline: None, + prize_floors: floors, + fee_bps_override: None, + }; + ctx.env.as_contract(&ctx.client.address, || { + ctx.env + .storage() + .persistent() + .set(&DataKey::Event(event_id), ¤t); + ctx.env + .storage() + .instance() + .set(&DataKey::NextEventId, &(event_id + 1)); + }); + + ctx.client.migrate_events(&8_u32); + ctx.client.migrate(); + + let after = ctx.client.get_event(&event_id); + assert_eq!(after.prize_floors.get(1), Some(500_i128)); + assert_eq!(after.title, String::from_str(&ctx.env, "Already Migrated")); +} + +#[test] +fn migrate_runs_regardless_of_how_the_version_was_spelled() { + // propose_upgrade accepts any non-empty string. Gating the rewrite on an + // exact match would silently skip it and still stamp the marker. + let ctx = setup(250); + let event_id = ctx.client.id_base() + 1; + let budget = 1_000_0000000_i128; + let mut dist = Map::new(&ctx.env); + dist.set(1, 100_u32); + let legacy = LegacyEventRecord { + id: event_id, + pillar: Pillar::Bounty, + owner: Address::generate(&ctx.env), + token: Address::generate(&ctx.env), + total_budget: budget, + remaining_escrow: 0, + release_kind: ReleaseKind::Single, + status: EventStatus::Completed, + content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/legacy"), + title: String::from_str(&ctx.env, "Oddly Versioned"), + created_at: 1, + deadline: None, + winner_distribution: dist, + fee_bps_override: None, + }; + ctx.env.as_contract(&ctx.client.address, || { + ctx.env + .storage() + .persistent() + .set(&DataKey::Event(event_id), &legacy); + ctx.env + .storage() + .instance() + .set(&DataKey::NextEventId, &(event_id + 1)); + // The operator proposed the upgrade as "v2.0.0" rather than "2.0.0". + storage::set_version(&ctx.env, &String::from_str(&ctx.env, "v2.0.0")); + }); + + ctx.client.migrate_events(&8_u32); + ctx.client.migrate(); + + let migrated = ctx.client.get_event(&event_id); + assert_eq!(migrated.prize_floors.get(1), Some(budget)); +} + +#[test] +fn migrate_is_a_no_op_on_a_fresh_deployment() { + let ctx = setup(250); + ctx.client.migrate_events(&8_u32); + ctx.client.migrate(); + assert_eq!( + ctx.client.get_migrated_to_version(), + Some(String::from_str(&ctx.env, "2.0.0")) + ); +} + #[test] fn migrate_marks_current_version_and_blocks_replay() { let ctx = setup(250); + ctx.client.migrate_events(&8_u32); ctx.client.migrate(); assert_eq!( ctx.client.get_migrated_to_version(), - Some(String::from_str(&ctx.env, "1.6.0")) + Some(String::from_str(&ctx.env, "2.0.0")) ); let err = ctx .client .try_migrate() - .err() - .expect("second migrate rejected") + .expect_err("second migrate rejected") .unwrap(); assert_eq!(err, Error::MigrationAlreadyApplied); } @@ -167,7 +407,7 @@ fn migrate_marks_current_version_and_blocks_replay() { // AUTH REGRESSION GUARDS (#73) // // setup() mocks all auths for every address, so a call succeeding is not -// proof that require_admin() ran โ€” it succeeds identically whether the +// proof that require_admin() ran: it succeeds identically whether the // check is present or was deleted. These tests replace the mock with an // empty auth set so the call can only succeed if the contract explicitly // requests and receives the admin's authorization. If require_admin() is @@ -277,7 +517,7 @@ fn migrate_reverts_without_admin_auth() { } // ============================================================ -// ACCEPT_ADMIN โ€” target-auth guard +// ACCEPT_ADMIN: target-auth guard // // accept_admin does not call require_admin(); it authorizes against the // pending target address instead (pending.target.require_auth()). These diff --git a/contracts/events/src/tests/bounty_pillar.rs b/contracts/events/src/tests/bounty_pillar.rs index 923c1b0..3a6b98c 100644 --- a/contracts/events/src/tests/bounty_pillar.rs +++ b/contracts/events/src/tests/bounty_pillar.rs @@ -5,9 +5,8 @@ use soroban_sdk::{ token, Address, BytesN, Env, Map, String, }; -use super::common::drive_cancel; use crate::errors::Error; -use crate::types::{CreateEventParams, DataKey, EventStatus, Pillar, ReleaseKind, WinnerSpec}; +use crate::types::{CreateEventParams, Pillar, ReleaseKind}; use crate::{EventsContract, EventsContractClient}; use boundless_profile::{ProfileContract, ProfileContractClient}; @@ -18,9 +17,7 @@ const TOTAL_BUDGET: i128 = 10_000_0000000_i128; struct Ctx<'a> { env: Env, events: EventsContractClient<'a>, - profile: ProfileContractClient<'a>, owner: Address, - applicant: Address, token_addr: Address, } @@ -57,64 +54,20 @@ fn setup<'a>() -> Ctx<'a> { events.register_supported_token(&token_addr); - let applicant = Address::generate(&env); - Ctx { env, events, - profile, owner, - applicant, token_addr, } } -fn one_winner_distribution(env: &Env) -> Map { +fn one_winner_distribution(env: &Env) -> Map { let mut m = Map::new(env); - m.set(1, 100); + m.set(1, 100000000000_i128); m } -fn create_bounty(ctx: &Ctx) -> u64 { - create_bounty_with_deadline(ctx, ctx.env.ledger().timestamp() + 86_400) -} - -fn create_bounty_with_deadline(ctx: &Ctx, deadline: u64) -> u64 { - let params = CreateEventParams { - pillar: Pillar::Bounty, - owner: ctx.owner.clone(), - token: ctx.token_addr.clone(), - total_budget: TOTAL_BUDGET, - release_kind: ReleaseKind::Single, - content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/events/draft/x"), - title: String::from_str(&ctx.env, "Test Bounty"), - deadline: Some(deadline), - winner_distribution: one_winner_distribution(&ctx.env), - fee_bps_override: None, - manager: None, - }; - let op_id = BytesN::random(&ctx.env); - ctx.events.create_event(¶ms, &op_id) -} - -fn create_hackathon(ctx: &Ctx) -> u64 { - let params = CreateEventParams { - pillar: Pillar::Hackathon, - owner: ctx.owner.clone(), - token: ctx.token_addr.clone(), - total_budget: TOTAL_BUDGET, - release_kind: ReleaseKind::Single, - content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/hackathon"), - title: String::from_str(&ctx.env, "Test Hackathon"), - deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: one_winner_distribution(&ctx.env), - fee_bps_override: None, - manager: None, - }; - let op = BytesN::random(&ctx.env); - ctx.events.create_event(¶ms, &op) -} - fn expect_op_err( result: Result, Result>, ) -> Error { @@ -140,7 +93,7 @@ fn create_rejects_multi_release_kind() { content_uri: String::from_str(&ctx.env, "uri"), title: String::from_str(&ctx.env, "Bad Bounty"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: one_winner_distribution(&ctx.env), + prize_floors: one_winner_distribution(&ctx.env), fee_bps_override: None, manager: None, }; @@ -148,381 +101,3 @@ fn create_rejects_multi_release_kind() { let err = expect_op_err(ctx.events.try_create_event(¶ms, &op)); assert_eq!(err, Error::InvalidReleaseKind); } - -// ============================================================ -// apply_to_bounty โ€” happy path -// ============================================================ - -#[test] -fn apply_bootstraps_profile_and_records_applicant() { - let ctx = setup(); - let bounty_id = create_bounty(&ctx); - - assert!(ctx.profile.get_profile(&ctx.applicant).is_none()); - - let op_id = BytesN::random(&ctx.env); - ctx.events - .apply_to_bounty(&bounty_id, &ctx.applicant, &op_id); - - assert!(ctx.profile.get_profile(&ctx.applicant).is_some()); - - let applicants = ctx.events.get_applicants(&bounty_id); - assert_eq!(applicants.len(), 1); - assert_eq!(applicants.get(0).unwrap(), ctx.applicant); -} - -// ============================================================ -// apply_to_bounty โ€” errors + idempotency -// ============================================================ - -#[test] -fn duplicate_apply_reverts() { - let ctx = setup(); - let bounty_id = create_bounty(&ctx); - - let op_a = BytesN::random(&ctx.env); - ctx.events - .apply_to_bounty(&bounty_id, &ctx.applicant, &op_a); - - let op_b = BytesN::random(&ctx.env); - let err = expect_op_err( - ctx.events - .try_apply_to_bounty(&bounty_id, &ctx.applicant, &op_b), - ); - assert_eq!(err, Error::ApplicantAlreadyApplied); -} - -#[test] -fn replayed_apply_reverts_idempotently() { - let ctx = setup(); - let bounty_id = create_bounty(&ctx); - - let op_id = BytesN::random(&ctx.env); - ctx.events - .apply_to_bounty(&bounty_id, &ctx.applicant, &op_id); - - let err = expect_op_err( - ctx.events - .try_apply_to_bounty(&bounty_id, &ctx.applicant, &op_id), - ); - assert_eq!(err, Error::OpAlreadySeen); -} - -#[test] -fn apply_on_nonexistent_event_reverts() { - let ctx = setup(); - let op_id = BytesN::random(&ctx.env); - let err = expect_op_err( - ctx.events - .try_apply_to_bounty(&9999, &ctx.applicant, &op_id), - ); - assert_eq!(err, Error::EventNotFound); -} - -#[test] -fn apply_on_wrong_pillar_reverts() { - let ctx = setup(); - let hackathon_id = create_hackathon(&ctx); - let op_id = BytesN::random(&ctx.env); - let err = expect_op_err( - ctx.events - .try_apply_to_bounty(&hackathon_id, &ctx.applicant, &op_id), - ); - assert_eq!(err, Error::InvalidPillar); -} - -#[test] -fn apply_on_cancelled_event_reverts() { - let ctx = setup(); - let bounty_id = create_bounty(&ctx); - drive_cancel(&ctx.env, &ctx.events, bounty_id); - - let op_id = BytesN::random(&ctx.env); - let err = expect_op_err( - ctx.events - .try_apply_to_bounty(&bounty_id, &ctx.applicant, &op_id), - ); - assert_eq!(err, Error::EventNotActive); -} - -#[test] -fn apply_on_completed_event_reverts() { - let ctx = setup(); - let bounty_id = create_bounty(&ctx); - - let op_apply = BytesN::random(&ctx.env); - ctx.events - .apply_to_bounty(&bounty_id, &ctx.applicant, &op_apply); - - let winners = soroban_sdk::vec![ - &ctx.env, - WinnerSpec { - recipient: ctx.applicant.clone(), - position: 1, - reputation_bump: 0, - }, - ]; - let op_select = BytesN::random(&ctx.env); - ctx.events.select_winners(&bounty_id, &winners, &op_select); - - // Pull model: claim the sole prize to drain escrow and complete. - ctx.events - .claim_prize(&bounty_id, &1_u32, &BytesN::random(&ctx.env)); - - let event = ctx.events.get_event(&bounty_id); - assert_eq!(event.status, EventStatus::Completed); - - let op_retry = BytesN::random(&ctx.env); - let err = expect_op_err( - ctx.events - .try_apply_to_bounty(&bounty_id, &ctx.applicant, &op_retry), - ); - assert_eq!(err, Error::EventNotActive); -} - -#[test] -fn apply_when_paused_reverts() { - let ctx = setup(); - let bounty_id = create_bounty(&ctx); - ctx.events.pause(); - - let op_id = BytesN::random(&ctx.env); - let err = expect_op_err( - ctx.events - .try_apply_to_bounty(&bounty_id, &ctx.applicant, &op_id), - ); - assert_eq!(err, Error::Paused); -} - -#[test] -fn apply_beyond_former_cap_succeeds() { - let ctx = setup(); - let bounty_id = create_bounty(&ctx); - - // Fast-forward the per-event counter past the former 5,000 cap instead - // of performing that many real applications from distinct addresses. - ctx.env.as_contract(&ctx.events.address, || { - ctx.env - .storage() - .persistent() - .set(&DataKey::EventApplicantCount(bounty_id), &5_000_u32); - }); - - let op_id = BytesN::random(&ctx.env); - ctx.events - .apply_to_bounty(&bounty_id, &ctx.applicant, &op_id); - - assert_eq!( - ctx.events.get_applicant_count(&bounty_id), - 5_001, - "applications are unbounded; the counter must keep advancing past the former cap" - ); - assert_eq!( - ctx.events.get_applicant_at(&bounty_id, &5_000), - Some(ctx.applicant.clone()), - "the new applicant must land in the next slot" - ); -} - -#[test] -fn apply_at_counter_overflow_reverts() { - let ctx = setup(); - let bounty_id = create_bounty(&ctx); - - ctx.env.as_contract(&ctx.events.address, || { - ctx.env - .storage() - .persistent() - .set(&DataKey::EventApplicantCount(bounty_id), &u32::MAX); - }); - - let op_id = BytesN::random(&ctx.env); - let err = expect_op_err( - ctx.events - .try_apply_to_bounty(&bounty_id, &ctx.applicant, &op_id), - ); - assert_eq!( - err, - Error::TooManyApplicants, - "an application that would overflow the u32 counter must revert" - ); -} - -#[test] -fn applicants_page_respects_start_and_limit() { - let ctx = setup(); - let bounty_id = create_bounty(&ctx); - - let second = Address::generate(&ctx.env); - let third = Address::generate(&ctx.env); - for applicant in [&ctx.applicant, &second, &third] { - ctx.events - .apply_to_bounty(&bounty_id, applicant, &BytesN::random(&ctx.env)); - } - - let tail = ctx.events.get_applicants_page(&bounty_id, &1, &10); - assert_eq!(tail.len(), 2); - assert_eq!(tail.get(0).unwrap(), second); - assert_eq!(tail.get(1).unwrap(), third); - - assert_eq!( - ctx.events.get_applicants_page(&bounty_id, &0, &0).len(), - 0, - "limit 0 must return an empty page" - ); - assert_eq!( - ctx.events.get_applicants_page(&bounty_id, &10, &5).len(), - 0, - "a start past the end must return an empty page" - ); - assert_eq!( - ctx.events.get_applicants_page(&bounty_id, &0, &1_000).len(), - 3, - "an oversized limit is clamped, not an error" - ); -} - -#[test] -fn apply_requires_applicant_auth() { - let ctx = setup(); - let bounty_id = create_bounty(&ctx); - let op_id = BytesN::random(&ctx.env); - ctx.events - .apply_to_bounty(&bounty_id, &ctx.applicant, &op_id); - - let auths = ctx.env.auths(); - let applicant_required = auths.iter().any(|(addr, _)| *addr == ctx.applicant); - assert!(applicant_required, "apply must demand applicant auth"); -} - -// ============================================================ -// withdraw_application โ€” happy path -// ============================================================ - -#[test] -fn withdraw_removes_the_applicant() { - let ctx = setup(); - let bounty_id = create_bounty(&ctx); - - let op_apply = BytesN::random(&ctx.env); - ctx.events - .apply_to_bounty(&bounty_id, &ctx.applicant, &op_apply); - assert_eq!(ctx.events.get_applicants(&bounty_id).len(), 1); - - let op_wd = BytesN::random(&ctx.env); - ctx.events - .withdraw_application(&bounty_id, &ctx.applicant, &op_wd); - - let applicants = ctx.events.get_applicants(&bounty_id); - assert_eq!(applicants.len(), 0); -} - -// ============================================================ -// withdraw_application โ€” errors + idempotency -// ============================================================ - -#[test] -fn withdraw_without_apply_reverts() { - let ctx = setup(); - let bounty_id = create_bounty(&ctx); - let op_id = BytesN::random(&ctx.env); - let err = expect_op_err(ctx.events.try_withdraw_application( - &bounty_id, - &ctx.applicant, - &op_id, - )); - assert_eq!(err, Error::ApplicantNotApplied); -} - -#[test] -fn withdraw_after_submit_reverts() { - let ctx = setup(); - let bounty_id = create_bounty(&ctx); - - let op_apply = BytesN::random(&ctx.env); - ctx.events - .apply_to_bounty(&bounty_id, &ctx.applicant, &op_apply); - - let uri = String::from_str(&ctx.env, "ipfs://Qm.../bounty.json"); - let op_submit = BytesN::random(&ctx.env); - ctx.events - .submit(&bounty_id, &ctx.applicant, &uri, &op_submit); - - let op_wd = BytesN::random(&ctx.env); - let err = expect_op_err(ctx.events.try_withdraw_application( - &bounty_id, - &ctx.applicant, - &op_wd, - )); - assert_eq!(err, Error::SubmissionAlreadyExists); -} - -#[test] -fn replayed_withdraw_reverts_idempotently() { - let ctx = setup(); - let bounty_id = create_bounty(&ctx); - - let op_apply = BytesN::random(&ctx.env); - ctx.events - .apply_to_bounty(&bounty_id, &ctx.applicant, &op_apply); - - let op_wd = BytesN::random(&ctx.env); - ctx.events - .withdraw_application(&bounty_id, &ctx.applicant, &op_wd); - - let err = expect_op_err(ctx.events.try_withdraw_application( - &bounty_id, - &ctx.applicant, - &op_wd, - )); - assert_eq!(err, Error::OpAlreadySeen); -} - -#[test] -fn withdraw_on_nonexistent_event_reverts() { - let ctx = setup(); - let op_id = BytesN::random(&ctx.env); - let err = expect_op_err( - ctx.events - .try_withdraw_application(&9999, &ctx.applicant, &op_id), - ); - assert_eq!(err, Error::EventNotFound); -} - -#[test] -fn withdraw_when_paused_reverts() { - let ctx = setup(); - let bounty_id = create_bounty(&ctx); - - let op_apply = BytesN::random(&ctx.env); - ctx.events - .apply_to_bounty(&bounty_id, &ctx.applicant, &op_apply); - - ctx.events.pause(); - - let op_wd = BytesN::random(&ctx.env); - let err = expect_op_err(ctx.events.try_withdraw_application( - &bounty_id, - &ctx.applicant, - &op_wd, - )); - assert_eq!(err, Error::Paused); -} - -#[test] -fn withdraw_requires_applicant_auth() { - let ctx = setup(); - let bounty_id = create_bounty(&ctx); - - let op_apply = BytesN::random(&ctx.env); - ctx.events - .apply_to_bounty(&bounty_id, &ctx.applicant, &op_apply); - - let op_wd = BytesN::random(&ctx.env); - ctx.events - .withdraw_application(&bounty_id, &ctx.applicant, &op_wd); - - let auths = ctx.env.auths(); - let applicant_required = auths.iter().any(|(addr, _)| *addr == ctx.applicant); - assert!(applicant_required, "withdraw must demand applicant auth"); -} diff --git a/contracts/events/src/tests/cancel_refund.rs b/contracts/events/src/tests/cancel_refund.rs index 7fed1b3..f364448 100644 --- a/contracts/events/src/tests/cancel_refund.rs +++ b/contracts/events/src/tests/cancel_refund.rs @@ -16,12 +16,10 @@ const FEE_BPS: u32 = 250; const TOTAL_BUDGET: i128 = 1_000_0000000_i128; const MIN_CONTRIB: i128 = 100_000_000_i128; -#[allow(dead_code)] struct Ctx<'a> { env: Env, events: EventsContractClient<'a>, events_id: Address, - profile: ProfileContractClient<'a>, owner: Address, token_addr: Address, token_admin: token::StellarAssetClient<'a>, @@ -67,7 +65,6 @@ fn setup_with_env<'a>(env: Env) -> Ctx<'a> { env, events, events_id, - profile, owner, token_addr, token_admin, @@ -75,9 +72,9 @@ fn setup_with_env<'a>(env: Env) -> Ctx<'a> { } } -fn single_dist(env: &Env) -> Map { +fn single_dist(env: &Env) -> Map { let mut m = Map::new(env); - m.set(1, 100); + m.set(1, 10000000000_i128); m } @@ -91,7 +88,7 @@ fn create_hackathon(ctx: &Ctx) -> u64 { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/cancel-test"), title: String::from_str(&ctx.env, "Cancel Test"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist(&ctx.env), + prize_floors: single_dist(&ctx.env), fee_bps_override: None, manager: None, }; @@ -380,16 +377,14 @@ fn missing_running_total_with_contributors_fails_closed() { let add_funds_err = ctx .events .try_add_funds(&id, &partner, &100_0000000_i128, &BytesN::random(&ctx.env)) - .err() - .expect("missing total rejected") + .expect_err("missing total rejected") .unwrap(); assert_eq!(add_funds_err, Error::CancellationTotalMissing); let cancel_err = ctx .events .try_start_cancel(&id, &BytesN::random(&ctx.env)) - .err() - .expect("missing total rejected") + .expect_err("missing total rejected") .unwrap(); assert_eq!(cancel_err, Error::CancellationTotalMissing); assert_eq!(ctx.events.get_event(&id).status, EventStatus::Active); @@ -403,8 +398,8 @@ fn missing_running_total_with_contributors_fails_closed() { fn cancel_prorata_splits_remaining_across_partners_no_owner_residual() { let ctx = setup(); let mut dist = Map::new(&ctx.env); - dist.set(1, 60); - dist.set(2, 40); + dist.set(1, 600_0000000_i128); + dist.set(2, 400_0000000_i128); let params = CreateEventParams { pillar: Pillar::Hackathon, owner: ctx.owner.clone(), @@ -414,7 +409,7 @@ fn cancel_prorata_splits_remaining_across_partners_no_owner_residual() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/boundary"), title: String::from_str(&ctx.env, "ProRata Cancel"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: dist, + prize_floors: dist, fee_bps_override: None, manager: None, }; @@ -433,14 +428,17 @@ fn cancel_prorata_splits_remaining_across_partners_no_owner_residual() { WinnerSpec { recipient: w.clone(), position: 1, + // The pool is 2000 after both contributions; the manager awards + // 1200 of it, leaving 800 to split pro-rata on cancel. + amount: 1_200_0000000_i128, reputation_bump: 0 }, ]; ctx.events .select_winners(&id, &winners, &BytesN::random(&ctx.env)); - // Pull model: the winner claims (60% of 2000 = 1200) before the - // manager can cancel; the remainder splits pro-rata below. + // Pull model: the winner claims before the manager can cancel; the + // remainder splits pro-rata below. ctx.events .claim_prize(&id, &1_u32, &BytesN::random(&ctx.env)); diff --git a/contracts/events/src/tests/common.rs b/contracts/events/src/tests/common.rs index 653da2e..4845642 100644 --- a/contracts/events/src/tests/common.rs +++ b/contracts/events/src/tests/common.rs @@ -9,7 +9,6 @@ use crate::event_ops::MAX_REFUNDS_PER_BATCH; use crate::types::EventStatus; use crate::{EventsContract, EventsContractClient}; -#[allow(dead_code)] pub fn drive_cancel<'a>(env: &Env, client: &EventsContractClient<'a>, id: u64) { let op_start = BytesN::random(env); client.start_cancel(&id, &op_start); @@ -32,7 +31,6 @@ pub fn drive_cancel<'a>(env: &Env, client: &EventsContractClient<'a>, id: u64) { } pub struct TestCtx<'a> { - #[allow(dead_code)] pub env: Env, pub admin: Address, pub fee_account: Address, diff --git a/contracts/events/src/tests/contributions.rs b/contracts/events/src/tests/contributions.rs index 2652f84..5da0afa 100644 --- a/contracts/events/src/tests/contributions.rs +++ b/contracts/events/src/tests/contributions.rs @@ -20,8 +20,6 @@ const TOTAL_BUDGET: i128 = 1_000_0000000_i128; struct Ctx<'a> { env: Env, events: EventsContractClient<'a>, - #[allow(dead_code)] - profile: ProfileContractClient<'a>, owner: Address, token_addr: Address, fee_account: Address, @@ -64,7 +62,6 @@ fn setup<'a>() -> Ctx<'a> { Ctx { env, events, - profile, owner, token_addr, fee_account, @@ -72,9 +69,9 @@ fn setup<'a>() -> Ctx<'a> { } } -fn single_dist(env: &Env) -> Map { +fn single_dist(env: &Env) -> Map { let mut m = Map::new(env); - m.set(1, 100); + m.set(1, 10000000000_i128); m } @@ -88,7 +85,7 @@ fn create_hackathon(ctx: &Ctx) -> u64 { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/contrib-hack"), title: String::from_str(&ctx.env, "Contrib Hack"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist(&ctx.env), + prize_floors: single_dist(&ctx.env), fee_bps_override: None, manager: None, }; @@ -336,7 +333,7 @@ fn cancel_at_boundary_pays_partners_full_no_owner_residual() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/boundary"), title: String::from_str(&ctx.env, "Boundary Cancel"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: dist, + prize_floors: dist, fee_bps_override: None, manager: None, }; @@ -362,6 +359,7 @@ fn cancel_at_boundary_pays_partners_full_no_owner_residual() { WinnerSpec { recipient: winner_a.clone(), position: 1, + amount: 1_000_0000000_i128, reputation_bump: 50, }, ]; diff --git a/contracts/events/src/tests/cross_contract.rs b/contracts/events/src/tests/cross_contract.rs index f4ab428..e6ff2ce 100644 --- a/contracts/events/src/tests/cross_contract.rs +++ b/contracts/events/src/tests/cross_contract.rs @@ -72,9 +72,11 @@ fn setup<'a>() -> Ctx<'a> { } } -fn one_winner_distribution(env: &Env) -> Map { +fn one_winner_distribution(env: &Env) -> Map { let mut m = Map::new(env); - m.set(1, 100); + // Nominal: a floor is a minimum, so 1 stroop never constrains an + // award. Tests that exercise the floor rule set a real one. + m.set(1, 1_i128); m } @@ -88,7 +90,7 @@ fn create_bounty(ctx: &Ctx) -> u64 { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/events/draft/x"), title: String::from_str(&ctx.env, "Test Bounty"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: one_winner_distribution(&ctx.env), + prize_floors: one_winner_distribution(&ctx.env), fee_bps_override: None, manager: None, }; @@ -108,15 +110,12 @@ fn select_winners_pays_recipient_and_bumps_profile() { let ctx = setup(); let bounty_id = create_bounty(&ctx); - let op_apply = BytesN::random(&ctx.env); - ctx.events - .apply_to_bounty(&bounty_id, &ctx.applicant, &op_apply); - let winners = soroban_sdk::vec![ &ctx.env, WinnerSpec { recipient: ctx.applicant.clone(), position: 1, + amount: TOTAL_BUDGET, reputation_bump: 50, }, ]; @@ -152,7 +151,7 @@ fn select_winners_pays_recipient_and_bumps_profile() { } #[test] -fn select_winners_requires_position_in_distribution() { +fn select_winners_rejects_an_award_larger_than_the_pool() { let ctx = setup(); let bounty_id = create_bounty(&ctx); @@ -160,7 +159,8 @@ fn select_winners_requires_position_in_distribution() { &ctx.env, WinnerSpec { recipient: ctx.applicant.clone(), - position: 2, // distribution only has position 1 + position: 2, + amount: TOTAL_BUDGET + 1, reputation_bump: 50, }, ]; @@ -168,7 +168,10 @@ fn select_winners_requires_position_in_distribution() { let res = ctx .events .try_select_winners(&bounty_id, &winners, &op_select); - assert!(res.is_err(), "invalid position should revert"); + assert!( + res.is_err(), + "a position with no floor is allowed, but not one the pool cannot cover" + ); } #[test] @@ -177,8 +180,8 @@ fn select_winners_rejects_duplicate_position() { let owner = ctx.owner.clone(); let token_addr = ctx.token_addr.clone(); let mut dist = Map::new(&ctx.env); - dist.set(1, 60); - dist.set(2, 40); + dist.set(1, 6_000_0000000_i128); + dist.set(2, 4_000_0000000_i128); let params = CreateEventParams { pillar: Pillar::Bounty, owner, @@ -188,7 +191,7 @@ fn select_winners_rejects_duplicate_position() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/x"), title: String::from_str(&ctx.env, "Test Bounty 2"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: dist, + prize_floors: dist, fee_bps_override: None, manager: None, }; @@ -201,11 +204,13 @@ fn select_winners_rejects_duplicate_position() { WinnerSpec { recipient: ctx.applicant.clone(), position: 1, + amount: TOTAL_BUDGET, reputation_bump: 50, }, WinnerSpec { recipient: other_recipient, position: 1, // duplicate + amount: TOTAL_BUDGET, reputation_bump: 25, }, ]; @@ -220,8 +225,8 @@ fn select_winners_rejects_duplicate_position() { fn select_winners_handles_multi_recipient_distribution() { let ctx = setup(); let mut dist = Map::new(&ctx.env); - dist.set(1, 60); - dist.set(2, 40); + dist.set(1, 6_000_0000000_i128); + dist.set(2, 4_000_0000000_i128); let params = CreateEventParams { pillar: Pillar::Bounty, owner: ctx.owner.clone(), @@ -231,7 +236,7 @@ fn select_winners_handles_multi_recipient_distribution() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/multi"), title: String::from_str(&ctx.env, "Multi Winner"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: dist, + prize_floors: dist, fee_bps_override: None, manager: None, }; @@ -245,11 +250,13 @@ fn select_winners_handles_multi_recipient_distribution() { WinnerSpec { recipient: winner_a.clone(), position: 1, + amount: 6_000_0000000_i128, reputation_bump: 50, }, WinnerSpec { recipient: winner_b.clone(), position: 2, + amount: 4_000_0000000_i128, reputation_bump: 25, }, ]; @@ -288,6 +295,7 @@ fn select_winners_replayed_reverts() { WinnerSpec { recipient: ctx.applicant.clone(), position: 1, + amount: TOTAL_BUDGET, reputation_bump: 50, }, ]; @@ -338,8 +346,8 @@ fn cancel_already_cancelled_reverts() { fn cancel_after_select_winners_refunds_only_remaining() { let ctx = setup(); let mut dist = Map::new(&ctx.env); - dist.set(1, 60); - dist.set(2, 40); + dist.set(1, 6_000_0000000_i128); + dist.set(2, 4_000_0000000_i128); let params = CreateEventParams { pillar: Pillar::Bounty, owner: ctx.owner.clone(), @@ -349,7 +357,7 @@ fn cancel_after_select_winners_refunds_only_remaining() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/partial"), title: String::from_str(&ctx.env, "Partial Pay Bounty"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: dist, + prize_floors: dist, fee_bps_override: None, manager: None, }; @@ -362,6 +370,7 @@ fn cancel_after_select_winners_refunds_only_remaining() { WinnerSpec { recipient: winner_a.clone(), position: 1, + amount: TOTAL_BUDGET * 60 / 100, reputation_bump: 50, }, ]; @@ -391,7 +400,7 @@ fn cancel_after_select_winners_refunds_only_remaining() { fn create_grant(ctx: &Ctx, n_milestones: u32) -> u64 { let mut dist = Map::new(&ctx.env); - dist.set(1, 100); + dist.set(1, TOTAL_BUDGET * 100 / 100); let params = CreateEventParams { pillar: Pillar::Grant, owner: ctx.owner.clone(), @@ -401,7 +410,7 @@ fn create_grant(ctx: &Ctx, n_milestones: u32) -> u64 { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/grant"), title: String::from_str(&ctx.env, "Test Grant"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: dist, + prize_floors: dist, fee_bps_override: None, manager: None, }; @@ -415,6 +424,7 @@ fn select_grant_winner(ctx: &Ctx, grant_id: u64, recipient: &Address) { WinnerSpec { recipient: recipient.clone(), position: 1, + amount: TOTAL_BUDGET * 100 / 100, reputation_bump: 0, }, ]; @@ -496,6 +506,7 @@ fn claim_milestone_rejects_non_grant_events() { WinnerSpec { recipient: ctx.applicant.clone(), position: 1, + amount: TOTAL_BUDGET, reputation_bump: 0, }, ]; @@ -533,140 +544,6 @@ fn claim_milestone_final_milestone_marks_event_completed() { assert_eq!(after.remaining_escrow, 0); } -// ============================================================ -// submit / withdraw_submission -// ============================================================ - -fn create_hackathon(ctx: &Ctx) -> u64 { - let mut dist = Map::new(&ctx.env); - dist.set(1, 100); - let params = CreateEventParams { - pillar: Pillar::Hackathon, - owner: ctx.owner.clone(), - token: ctx.token_addr.clone(), - total_budget: TOTAL_BUDGET, - release_kind: ReleaseKind::Single, - content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/hackathon"), - title: String::from_str(&ctx.env, "Test Hackathon"), - deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: dist, - fee_bps_override: None, - manager: None, - }; - let op_create = BytesN::random(&ctx.env); - ctx.events.create_event(¶ms, &op_create) -} - -#[test] -fn hackathon_submit_creates_anchor_without_prior_apply() { - let ctx = setup(); - let id = create_hackathon(&ctx); - - let uri = String::from_str(&ctx.env, "ipfs://Qm.../project.json"); - let op = BytesN::random(&ctx.env); - ctx.events.submit(&id, &ctx.applicant, &uri, &op); - - let sub = ctx.events.get_submission(&id, &ctx.applicant); - assert_eq!(sub.applicant, ctx.applicant); - assert_eq!(sub.content_uri, uri); - assert_eq!(sub.submitted_at, ctx.env.ledger().timestamp()); -} - -#[test] -fn bounty_submit_requires_prior_application() { - let ctx = setup(); - let id = create_bounty(&ctx); - - let uri = String::from_str(&ctx.env, "ipfs://Qm.../bounty.json"); - let op = BytesN::random(&ctx.env); - let res = ctx.events.try_submit(&id, &ctx.applicant, &uri, &op); - assert!(res.is_err(), "submit before apply on bounty should revert"); -} - -#[test] -fn bounty_submit_succeeds_after_apply() { - let ctx = setup(); - let id = create_bounty(&ctx); - - let op_apply = BytesN::random(&ctx.env); - ctx.events.apply_to_bounty(&id, &ctx.applicant, &op_apply); - - let uri = String::from_str(&ctx.env, "ipfs://Qm.../bounty.json"); - let op_submit = BytesN::random(&ctx.env); - ctx.events.submit(&id, &ctx.applicant, &uri, &op_submit); - - let sub = ctx.events.get_submission(&id, &ctx.applicant); - assert_eq!(sub.content_uri, uri); -} - -#[test] -fn resubmit_preserves_original_submitted_at_and_updates_uri() { - let ctx = setup(); - let id = create_hackathon(&ctx); - - let uri_a = String::from_str(&ctx.env, "ipfs://Qm.../v1.json"); - let op_a = BytesN::random(&ctx.env); - ctx.events.submit(&id, &ctx.applicant, &uri_a, &op_a); - - let first = ctx.events.get_submission(&id, &ctx.applicant); - let first_time = first.submitted_at; - - let uri_b = String::from_str(&ctx.env, "ipfs://Qm.../v2.json"); - let op_b = BytesN::random(&ctx.env); - ctx.events.submit(&id, &ctx.applicant, &uri_b, &op_b); - - let second = ctx.events.get_submission(&id, &ctx.applicant); - assert_eq!(second.content_uri, uri_b); - assert_eq!( - second.submitted_at, first_time, - "submitted_at must be preserved across re-submit" - ); -} - -#[test] -fn submit_replayed_reverts() { - let ctx = setup(); - let id = create_hackathon(&ctx); - - let uri = String::from_str(&ctx.env, "ipfs://Qm.../v1.json"); - let op = BytesN::random(&ctx.env); - ctx.events.submit(&id, &ctx.applicant, &uri, &op); - - let res = ctx.events.try_submit(&id, &ctx.applicant, &uri, &op); - assert!(res.is_err(), "replayed submit should revert"); -} - -#[test] -fn withdraw_submission_removes_anchor() { - let ctx = setup(); - let id = create_hackathon(&ctx); - - let uri = String::from_str(&ctx.env, "ipfs://Qm.../v1.json"); - let op_submit = BytesN::random(&ctx.env); - ctx.events.submit(&id, &ctx.applicant, &uri, &op_submit); - - let op_wd = BytesN::random(&ctx.env); - ctx.events.withdraw_submission(&id, &ctx.applicant, &op_wd); - - let res = ctx.events.try_get_submission(&id, &ctx.applicant); - assert!(res.is_err(), "withdrawn submission should not be readable"); -} - -#[test] -fn withdraw_submission_without_submission_reverts() { - let ctx = setup(); - let id = create_hackathon(&ctx); - - let op_wd = BytesN::random(&ctx.env); - let res = ctx - .events - .try_withdraw_submission(&id, &ctx.applicant, &op_wd); - assert!( - res.is_err(), - "withdraw without prior submission should revert" - ); -} - // ============================================================ // Per-event fee_bps_override // ============================================================ @@ -690,7 +567,7 @@ fn create_event_charges_override_rate_when_provided() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/hackathon"), title: String::from_str(&ctx.env, "Hackathon at 1.5%"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: one_winner_distribution(&ctx.env), + prize_floors: one_winner_distribution(&ctx.env), fee_bps_override: Some(override_bps), manager: None, }; @@ -723,7 +600,7 @@ fn add_funds_uses_event_override_not_global() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/hackathon"), title: String::from_str(&ctx.env, "Promo Hackathon"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: one_winner_distribution(&ctx.env), + prize_floors: one_winner_distribution(&ctx.env), fee_bps_override: Some(override_bps), manager: None, }; @@ -769,7 +646,7 @@ fn create_event_with_waiver_charges_no_fee() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/hackathon"), title: String::from_str(&ctx.env, "Comped Hackathon"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: one_winner_distribution(&ctx.env), + prize_floors: one_winner_distribution(&ctx.env), fee_bps_override: Some(0), manager: None, }; @@ -795,7 +672,7 @@ fn create_event_rejects_override_above_max_fee_bps() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/hackathon"), title: String::from_str(&ctx.env, "Bad rate"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: one_winner_distribution(&ctx.env), + prize_floors: one_winner_distribution(&ctx.env), fee_bps_override: Some(6000), manager: None, }; @@ -822,7 +699,7 @@ fn create_event_omitted_override_falls_back_to_global_default() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/hackathon"), title: String::from_str(&ctx.env, "Default rate hackathon"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: one_winner_distribution(&ctx.env), + prize_floors: one_winner_distribution(&ctx.env), fee_bps_override: None, manager: None, }; @@ -851,6 +728,7 @@ fn select_winners_rejects_second_call_winners_already_selected() { WinnerSpec { recipient: r2.clone(), position: 1, + amount: TOTAL_BUDGET, reputation_bump: 0, }, ]; @@ -919,7 +797,7 @@ fn grant_last_milestone_sweeps_rounding_residue() { // ============================================================ #[test] -fn select_winners_pays_against_remaining_escrow_including_top_ups() { +fn a_top_up_before_selection_enlarges_the_pool_not_the_award() { let ctx = setup(); let bounty_id = create_bounty(&ctx); @@ -940,22 +818,26 @@ fn select_winners_pays_against_remaining_escrow_including_top_ups() { WinnerSpec { recipient: ctx.applicant.clone(), position: 1, + amount: TOTAL_BUDGET, reputation_bump: 50, }, ]; let op_select = BytesN::random(&ctx.env); ctx.events.select_winners(&bounty_id, &winners, &op_select); - // Pull model: claim; the pre-selection top-up is in the baseline. ctx.events .claim_prize(&bounty_id, &1_u32, &BytesN::random(&ctx.env)); let token = token::Client::new(&ctx.env, &ctx.token_addr); - assert_eq!(token.balance(&ctx.applicant), TOTAL_BUDGET + top_up); + assert_eq!( + token.balance(&ctx.applicant), + TOTAL_BUDGET, + "the award is what the selection named, regardless of the top-up" + ); let event_post = ctx.events.get_event(&bounty_id); - assert_eq!(event_post.remaining_escrow, 0); - assert_eq!(event_post.status, EventStatus::Completed); + assert_eq!(event_post.remaining_escrow, top_up); + assert_eq!(event_post.status, EventStatus::Active); } // ============================================================ @@ -971,7 +853,7 @@ fn create_bounty_with_manager(ctx: &Ctx, manager: &Address) -> u64 { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/events/draft/m"), title: String::from_str(&ctx.env, "Managed Bounty"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: one_winner_distribution(&ctx.env), + prize_floors: one_winner_distribution(&ctx.env), fee_bps_override: None, manager: Some(manager.clone()), }; @@ -985,6 +867,7 @@ fn win_one(ctx: &Ctx) -> soroban_sdk::Vec { WinnerSpec { recipient: ctx.applicant.clone(), position: 1, + amount: TOTAL_BUDGET, reputation_bump: 0, }, ] @@ -1027,8 +910,6 @@ fn unaccepted_proposal_leaves_owner_in_authority() { let attacker = Address::generate(&ctx.env); let id = create_bounty_with_manager(&ctx, &attacker); - ctx.events - .apply_to_bounty(&id, &ctx.applicant, &BytesN::random(&ctx.env)); ctx.events .select_winners(&id, &win_one(&ctx), &BytesN::random(&ctx.env)); @@ -1045,8 +926,6 @@ fn accepted_manager_holds_select_winners_authority() { let id = create_bounty_with_manager(&ctx, &manager); ctx.events.accept_manager(&id); - ctx.events - .apply_to_bounty(&id, &ctx.applicant, &BytesN::random(&ctx.env)); ctx.events .select_winners(&id, &win_one(&ctx), &BytesN::random(&ctx.env)); diff --git a/contracts/events/src/tests/crowdfunding.rs b/contracts/events/src/tests/crowdfunding.rs index 9ff55de..551363d 100644 --- a/contracts/events/src/tests/crowdfunding.rs +++ b/contracts/events/src/tests/crowdfunding.rs @@ -18,8 +18,6 @@ const FUNDING_GOAL: i128 = 1_000_0000000_i128; struct Ctx<'a> { env: Env, events: EventsContractClient<'a>, - #[allow(dead_code)] - profile: ProfileContractClient<'a>, builder: Address, events_admin: Address, fee_account: Address, @@ -62,7 +60,6 @@ fn setup<'a>() -> Ctx<'a> { Ctx { env, events, - profile, builder, events_admin, fee_account, @@ -71,9 +68,9 @@ fn setup<'a>() -> Ctx<'a> { } } -fn single_dist_100_at_1(env: &Env) -> Map { +fn single_dist_100_at_1(env: &Env) -> Map { let mut m = Map::new(env); - m.set(1, 100); + m.set(1, 10000000000_i128); m } @@ -87,7 +84,7 @@ fn create_campaign(ctx: &Ctx, milestones: u32) -> u64 { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/cf/1"), title: String::from_str(&ctx.env, "Open-Source Crawler"), deadline: Some(ctx.env.ledger().timestamp() + 30 * 86_400), - winner_distribution: single_dist_100_at_1(&ctx.env), + prize_floors: single_dist_100_at_1(&ctx.env), fee_bps_override: None, manager: None, }; @@ -149,7 +146,7 @@ fn create_rejects_single_release_kind() { content_uri: String::from_str(&ctx.env, "uri"), title: String::from_str(&ctx.env, "Bad CF"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist_100_at_1(&ctx.env), + prize_floors: single_dist_100_at_1(&ctx.env), fee_bps_override: None, manager: None, }; @@ -159,11 +156,11 @@ fn create_rejects_single_release_kind() { } #[test] -fn create_rejects_distribution_with_multiple_positions() { +fn create_rejects_floors_above_the_funding_goal() { let ctx = setup(); let mut dist = Map::new(&ctx.env); - dist.set(1, 60); - dist.set(2, 40); + dist.set(1, FUNDING_GOAL); + dist.set(2, 1_i128); let params = CreateEventParams { pillar: Pillar::Crowdfunding, owner: ctx.builder.clone(), @@ -173,7 +170,7 @@ fn create_rejects_distribution_with_multiple_positions() { content_uri: String::from_str(&ctx.env, "uri"), title: String::from_str(&ctx.env, "Bad CF"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: dist, + prize_floors: dist, fee_bps_override: None, manager: None, }; @@ -324,6 +321,29 @@ fn claim_milestone_out_of_range_reverts() { assert!(res.is_err()); } +#[test] +fn claim_milestone_pays_only_the_campaign_owner() { + let ctx = setup(); + let id = create_campaign(&ctx, 2); + let backer = Address::generate(&ctx.env); + back(&ctx, id, &backer, 400_0000000_i128); + + let stranger = Address::generate(&ctx.env); + let err = ctx + .events + .try_claim_milestone(&id, &stranger, &0_u32, &0, &BytesN::random(&ctx.env)) + .unwrap_err() + .unwrap(); + assert_eq!(err, crate::errors::Error::NoSubmissions); + + ctx.events + .claim_milestone(&id, &ctx.builder, &0_u32, &0, &BytesN::random(&ctx.env)); + let paid = ctx.events.get_winner_at(&id, &1).unwrap(); + assert_eq!(paid.recipient, ctx.builder); + assert_eq!(paid.position, 1); + assert_eq!(paid.milestone, Some(0)); +} + #[test] fn claim_milestone_with_empty_escrow_reverts() { let ctx = setup(); @@ -392,6 +412,7 @@ fn select_winners_on_crowdfunding_reverts() { let spec = WinnerSpec { recipient: ctx.builder.clone(), position: 1, + amount: 1_000_0000000_i128, reputation_bump: 0, }; let mut winners = SorobanVec::new(&ctx.env); @@ -402,17 +423,6 @@ fn select_winners_on_crowdfunding_reverts() { assert!(res.is_err()); } -#[test] -fn submit_on_crowdfunding_reverts() { - let ctx = setup(); - let id = create_campaign(&ctx, 3); - - let op = BytesN::random(&ctx.env); - let uri = String::from_str(&ctx.env, "ipfs://nope"); - let res = ctx.events.try_submit(&id, &ctx.builder, &uri, &op); - assert!(res.is_err()); -} - // ============================================================ // cancel_event // ============================================================ @@ -511,3 +521,285 @@ fn crowdfunding_claim_milestone_requires_admin_auth() { ); assert!(builder_required, "builder auth still required"); } + +#[test] +fn a_release_records_the_fee_it_withheld() { + use soroban_sdk::{testutils::Events as _, Event as _}; + + let ctx = setup(); + let id = create_campaign(&ctx, 3); + let backer = Address::generate(&ctx.env); + back(&ctx, id, &backer, 900_0000000_i128); + + ctx.events + .claim_milestone(&id, &ctx.builder, &0_u32, &0_u32, &BytesN::random(&ctx.env)); + let wanted = crate::events::MilestoneFeeCharged { + event_id: id, + recipient: ctx.builder.clone(), + milestone: 0, + fee: 7_5000000_i128, + } + .to_xdr(&ctx.env, &ctx.events.address); + let emitted = ctx.env.events().all(); + assert!(emitted + .filter_by_contract(&ctx.events.address) + .events() + .contains(&wanted)); +} + +fn only_these_sign_the_release(ctx: &Ctx, id: u64, signers: &[&Address], op: &BytesN<32>) { + only_these_sign_the_release_of(ctx, id, 0, signers, op); +} + +fn only_these_sign_the_release_of( + ctx: &Ctx, + id: u64, + milestone: u32, + signers: &[&Address], + op: &BytesN<32>, +) { + extern crate std; + use soroban_sdk::{ + testutils::{MockAuth, MockAuthInvoke}, + IntoVal, + }; + let args: SorobanVec = + (id, ctx.builder.clone(), milestone, 0_u32, op.clone()).into_val(&ctx.env); + let invoke = MockAuthInvoke { + contract: &ctx.events.address, + fn_name: "claim_milestone", + args, + sub_invokes: &[], + }; + let mocks: std::vec::Vec = signers + .iter() + .map(|address| MockAuth { + address, + invoke: &invoke, + }) + .collect(); + ctx.env.mock_auths(&mocks); +} + +fn appoint_validator(ctx: &Ctx) -> Address { + let validator = Address::generate(&ctx.env); + ctx.events.propose_release_validator(&validator); + ctx.events.accept_release_validator(); + validator +} + +#[test] +fn a_release_validator_co_signs_instead_of_the_admin() { + let ctx = setup(); + let id = create_campaign(&ctx, 2); + let p = Address::generate(&ctx.env); + back(&ctx, id, &p, 200_0000000_i128); + + let validator = appoint_validator(&ctx); + assert_eq!(ctx.events.get_release_validator(), Some(validator.clone())); + + let op = BytesN::random(&ctx.env); + only_these_sign_the_release(&ctx, id, &[&ctx.builder, &ctx.events_admin], &op); + assert!(ctx + .events + .try_claim_milestone(&id, &ctx.builder, &0_u32, &0, &op) + .is_err()); + + only_these_sign_the_release(&ctx, id, &[&ctx.builder, &validator], &op); + ctx.events + .claim_milestone(&id, &ctx.builder, &0_u32, &0, &op); + ctx.env.mock_all_auths_allowing_non_root_auth(); + let token = token::Client::new(&ctx.env, &ctx.token_addr); + assert_eq!(token.balance(&ctx.builder), 97_5000000_i128); +} + +#[test] +fn a_proposed_validator_co_signs_nothing_until_it_accepts() { + let ctx = setup(); + let id = create_campaign(&ctx, 2); + let p = Address::generate(&ctx.env); + back(&ctx, id, &p, 200_0000000_i128); + + let proposed = Address::generate(&ctx.env); + ctx.events.propose_release_validator(&proposed); + assert_eq!(ctx.events.get_release_validator(), None); + assert_eq!( + ctx.events.get_pending_release_validator().unwrap().target, + proposed + ); + + let op = BytesN::random(&ctx.env); + only_these_sign_the_release(&ctx, id, &[&ctx.builder, &proposed], &op); + assert!(ctx + .events + .try_claim_milestone(&id, &ctx.builder, &0_u32, &0, &op) + .is_err()); + only_these_sign_the_release(&ctx, id, &[&ctx.builder, &ctx.events_admin], &op); + ctx.events + .claim_milestone(&id, &ctx.builder, &0_u32, &0, &op); +} + +#[test] +fn only_the_proposed_key_can_accept() { + use soroban_sdk::{ + testutils::{MockAuth, MockAuthInvoke}, + IntoVal, + }; + let ctx = setup(); + let proposed = Address::generate(&ctx.env); + ctx.events.propose_release_validator(&proposed); + + for signer in [&ctx.events_admin, &ctx.builder] { + ctx.env.mock_auths(&[MockAuth { + address: signer, + invoke: &MockAuthInvoke { + contract: &ctx.events.address, + fn_name: "accept_release_validator", + args: ().into_val(&ctx.env), + sub_invokes: &[], + }, + }]); + assert!(ctx.events.try_accept_release_validator().is_err()); + } + ctx.env.mock_auths(&[MockAuth { + address: &proposed, + invoke: &MockAuthInvoke { + contract: &ctx.events.address, + fn_name: "accept_release_validator", + args: ().into_val(&ctx.env), + sub_invokes: &[], + }, + }]); + ctx.events.accept_release_validator(); + ctx.env.mock_all_auths_allowing_non_root_auth(); + assert_eq!(ctx.events.get_release_validator(), Some(proposed)); + assert!(ctx.events.get_pending_release_validator().is_none()); +} + +#[test] +fn only_the_admin_proposes_cancels_or_clears() { + use soroban_sdk::{ + testutils::{MockAuth, MockAuthInvoke}, + IntoVal, + }; + let ctx = setup(); + let target = Address::generate(&ctx.env); + let as_builder = |fn_name: &'static str, args: SorobanVec| { + ctx.env.mock_auths(&[MockAuth { + address: &ctx.builder, + invoke: &MockAuthInvoke { + contract: &ctx.events.address, + fn_name, + args, + sub_invokes: &[], + }, + }]); + }; + as_builder( + "propose_release_validator", + (target.clone(),).into_val(&ctx.env), + ); + assert!(ctx.events.try_propose_release_validator(&target).is_err()); + + ctx.env.mock_all_auths_allowing_non_root_auth(); + ctx.events.propose_release_validator(&target); + as_builder("cancel_pending_release_validator", ().into_val(&ctx.env)); + assert!(ctx.events.try_cancel_pending_release_validator().is_err()); + as_builder("clear_release_validator", ().into_val(&ctx.env)); + assert!(ctx.events.try_clear_release_validator().is_err()); + ctx.env.mock_all_auths_allowing_non_root_auth(); + assert!(ctx.events.get_pending_release_validator().is_some()); +} + +#[test] +fn an_unaccepted_proposal_expires_or_can_be_withdrawn() { + use soroban_sdk::testutils::Ledger as _; + let ctx = setup(); + let target = Address::generate(&ctx.env); + + ctx.events.propose_release_validator(&target); + ctx.events.cancel_pending_release_validator(); + assert_eq!( + ctx.events + .try_accept_release_validator() + .err() + .unwrap() + .unwrap(), + crate::errors::Error::PendingRotationMismatch + ); + assert_eq!( + ctx.events + .try_cancel_pending_release_validator() + .err() + .unwrap() + .unwrap(), + crate::errors::Error::PendingRotationMismatch + ); + + ctx.events.propose_release_validator(&target); + let expires = ctx + .events + .get_pending_release_validator() + .unwrap() + .expires_at_ledger; + ctx.env + .ledger() + .with_mut(|l| l.sequence_number = expires + 1); + assert_eq!( + ctx.events + .try_accept_release_validator() + .err() + .unwrap() + .unwrap(), + crate::errors::Error::PendingRotationExpired + ); + assert_eq!(ctx.events.get_release_validator(), None); +} + +#[test] +fn replacing_a_validator_keeps_the_old_one_until_the_new_one_accepts() { + let ctx = setup(); + let id = create_campaign(&ctx, 3); + let p = Address::generate(&ctx.env); + back(&ctx, id, &p, 300_0000000_i128); + let old = appoint_validator(&ctx); + + let new = Address::generate(&ctx.env); + ctx.events.propose_release_validator(&new); + let op = BytesN::random(&ctx.env); + only_these_sign_the_release(&ctx, id, &[&ctx.builder, &old], &op); + ctx.events + .claim_milestone(&id, &ctx.builder, &0_u32, &0, &op); + + ctx.env.mock_all_auths_allowing_non_root_auth(); + ctx.events.accept_release_validator(); + let op = BytesN::random(&ctx.env); + only_these_sign_the_release_of(&ctx, id, 1, &[&ctx.builder, &old], &op); + assert!(ctx + .events + .try_claim_milestone(&id, &ctx.builder, &1_u32, &0, &op) + .is_err()); + only_these_sign_the_release_of(&ctx, id, 1, &[&ctx.builder, &new], &op); + ctx.events + .claim_milestone(&id, &ctx.builder, &1_u32, &0, &op); +} + +#[test] +fn clearing_the_validator_returns_co_signing_to_the_admin_at_once() { + let ctx = setup(); + let id = create_campaign(&ctx, 2); + let p = Address::generate(&ctx.env); + back(&ctx, id, &p, 200_0000000_i128); + appoint_validator(&ctx); + ctx.events + .propose_release_validator(&Address::generate(&ctx.env)); + + ctx.events.clear_release_validator(); + assert_eq!(ctx.events.get_release_validator(), None); + assert!(ctx.events.get_pending_release_validator().is_none()); + + ctx.events + .claim_milestone(&id, &ctx.builder, &0_u32, &0, &BytesN::random(&ctx.env)); + let auths = ctx.env.auths(); + assert!(auths.iter().any(|(addr, _)| *addr == ctx.events_admin)); +} diff --git a/contracts/events/src/tests/escrow_fee_math.rs b/contracts/events/src/tests/escrow_fee_math.rs index bb39254..dda957a 100644 --- a/contracts/events/src/tests/escrow_fee_math.rs +++ b/contracts/events/src/tests/escrow_fee_math.rs @@ -16,8 +16,6 @@ const TOTAL_BUDGET: i128 = 1_000_0000000_i128; // 1000 USDC at 7 decimals struct Ctx<'a> { env: Env, events: EventsContractClient<'a>, - #[allow(dead_code)] - profile: ProfileContractClient<'a>, owner: Address, token_addr: Address, fee_account: Address, @@ -60,7 +58,6 @@ fn setup_with_bps<'a>(fee_bps: u32) -> Ctx<'a> { Ctx { env, events, - profile, owner, token_addr, fee_account, @@ -72,9 +69,11 @@ fn setup<'a>() -> Ctx<'a> { setup_with_bps(FEE_BPS) } -fn single_dist(env: &Env) -> Map { +fn single_dist(env: &Env) -> Map { let mut m = Map::new(env); - m.set(1, 100); + // Nominal: a floor is a minimum, so 1 stroop never constrains an + // award. Tests that exercise the floor rule set a real one. + m.set(1, 1_i128); m } @@ -88,7 +87,7 @@ fn create_hackathon(ctx: &Ctx) -> u64 { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/fee-test"), title: String::from_str(&ctx.env, "Fee Math Test"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist(&ctx.env), + prize_floors: single_dist(&ctx.env), fee_bps_override: None, manager: None, }; @@ -106,7 +105,7 @@ fn create_hackathon_with_override(ctx: &Ctx, override_bps: u32) -> u64 { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/override"), title: String::from_str(&ctx.env, "Override BPS Test"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist(&ctx.env), + prize_floors: single_dist(&ctx.env), fee_bps_override: Some(override_bps), manager: None, }; @@ -114,7 +113,7 @@ fn create_hackathon_with_override(ctx: &Ctx, override_bps: u32) -> u64 { ctx.events.create_event(¶ms, &op) } -fn create_hackathon_with_dist(ctx: &Ctx, dist: Map) -> u64 { +fn create_hackathon_with_dist(ctx: &Ctx, dist: Map) -> u64 { let params = CreateEventParams { pillar: Pillar::Hackathon, owner: ctx.owner.clone(), @@ -124,7 +123,7 @@ fn create_hackathon_with_dist(ctx: &Ctx, dist: Map) -> u64 { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/dist-test"), title: String::from_str(&ctx.env, "Dist Test"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: dist, + prize_floors: dist, fee_bps_override: None, manager: None, }; @@ -142,7 +141,7 @@ fn create_grant(ctx: &Ctx, milestones: u32) -> u64 { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/grant"), title: String::from_str(&ctx.env, "Grant Test"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist(&ctx.env), + prize_floors: single_dist(&ctx.env), fee_bps_override: None, manager: None, }; @@ -214,7 +213,7 @@ fn override_bps_above_max_rejected() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/bad"), title: String::from_str(&ctx.env, "Bad Override"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist(&ctx.env), + prize_floors: single_dist(&ctx.env), fee_bps_override: Some(1001), // MAX_FEE_BPS = 1000 manager: None, }; @@ -252,7 +251,7 @@ fn fee_rounds_down_non_divisible_amount() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/tiny"), title: String::from_str(&ctx.env, "Tiny"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist(&ctx.env), + prize_floors: single_dist(&ctx.env), fee_bps_override: None, manager: None, }; @@ -280,7 +279,7 @@ fn fee_rounding_on_odd_amounts() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/odd"), title: String::from_str(&ctx.env, "Odd"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist(&ctx.env), + prize_floors: single_dist(&ctx.env), fee_bps_override: None, manager: None, }; @@ -359,7 +358,7 @@ fn zero_global_bps_no_override_charges_no_fee() { } // ============================================================ -// release math: select_winners Single โ€” percent of escrow +// release math: select_winners Single, percent of escrow // ============================================================ #[test] @@ -373,6 +372,7 @@ fn single_release_pays_full_escrow_for_100_percent() { WinnerSpec { recipient: winner.clone(), position: 1, + amount: 1_000_0000000_i128, reputation_bump: 50, }, ]; @@ -393,9 +393,9 @@ fn multi_position_split_pays_correct_amounts() { let ctx = setup(); let mut dist = Map::new(&ctx.env); - dist.set(1, 50); - dist.set(2, 30); - dist.set(3, 20); + dist.set(1, TOTAL_BUDGET * 50 / 100); + dist.set(2, TOTAL_BUDGET * 30 / 100); + dist.set(3, TOTAL_BUDGET * 20 / 100); let id = create_hackathon_with_dist(&ctx, dist); let w1 = Address::generate(&ctx.env); @@ -406,16 +406,19 @@ fn multi_position_split_pays_correct_amounts() { WinnerSpec { recipient: w1.clone(), position: 1, + amount: TOTAL_BUDGET * 50 / 100, reputation_bump: 50 }, WinnerSpec { recipient: w2.clone(), position: 2, + amount: TOTAL_BUDGET * 30 / 100, reputation_bump: 30 }, WinnerSpec { recipient: w3.clone(), position: 3, + amount: TOTAL_BUDGET * 20 / 100, reputation_bump: 20 }, ]; @@ -443,9 +446,9 @@ fn three_way_33_33_34_split_rounding() { let ctx = setup(); let mut dist = Map::new(&ctx.env); - dist.set(1, 33); - dist.set(2, 33); - dist.set(3, 34); + dist.set(1, TOTAL_BUDGET * 33 / 100); + dist.set(2, TOTAL_BUDGET * 33 / 100); + dist.set(3, TOTAL_BUDGET * 34 / 100); let id = create_hackathon_with_dist(&ctx, dist); let w1 = Address::generate(&ctx.env); @@ -456,16 +459,19 @@ fn three_way_33_33_34_split_rounding() { WinnerSpec { recipient: w1.clone(), position: 1, + amount: TOTAL_BUDGET * 33 / 100, reputation_bump: 50 }, WinnerSpec { recipient: w2.clone(), position: 2, + amount: TOTAL_BUDGET * 33 / 100, reputation_bump: 30 }, WinnerSpec { recipient: w3.clone(), position: 3, + amount: TOTAL_BUDGET * 34 / 100, reputation_bump: 20 }, ]; @@ -493,8 +499,8 @@ fn partial_position_fill_leaves_residual_escrow() { let ctx = setup(); let mut dist = Map::new(&ctx.env); - dist.set(1, 60); - dist.set(2, 40); + dist.set(1, TOTAL_BUDGET * 60 / 100); + dist.set(2, TOTAL_BUDGET * 40 / 100); let id = create_hackathon_with_dist(&ctx, dist); let w1 = Address::generate(&ctx.env); @@ -503,6 +509,7 @@ fn partial_position_fill_leaves_residual_escrow() { WinnerSpec { recipient: w1.clone(), position: 1, + amount: TOTAL_BUDGET * 60 / 100, reputation_bump: 50 }, ]; @@ -526,7 +533,7 @@ fn partial_position_fill_leaves_residual_escrow() { // ============================================================ #[test] -fn partner_funds_grow_winner_payout() { +fn partner_funds_enlarge_the_pool_without_repricing_awards() { let ctx = setup(); let id = create_hackathon(&ctx); @@ -538,15 +545,17 @@ fn partner_funds_grow_winner_payout() { ctx.events.add_funds(&id, &partner, &contrib, &op_add); let event = ctx.events.get_event(&id); - let escrow_at_select = event.remaining_escrow; - assert_eq!(escrow_at_select, TOTAL_BUDGET + contrib); + assert_eq!(event.remaining_escrow, TOTAL_BUDGET + contrib); + // A top-up has exactly one consequence: the pool is larger. Awards name + // their own amount, so nothing already advertised is silently repriced. let winner = Address::generate(&ctx.env); let winners = soroban_sdk::vec![ &ctx.env, WinnerSpec { recipient: winner.clone(), position: 1, + amount: TOTAL_BUDGET, reputation_bump: 50 }, ]; @@ -556,7 +565,111 @@ fn partner_funds_grow_winner_payout() { .claim_prize(&id, &1_u32, &BytesN::random(&ctx.env)); let token = token::Client::new(&ctx.env, &ctx.token_addr); - assert_eq!(token.balance(&winner), escrow_at_select); + assert_eq!(token.balance(&winner), TOTAL_BUDGET); + assert_eq!( + ctx.events.get_event(&id).remaining_escrow, + contrib, + "the top-up stays in the pool, available to award or reclaim" + ); +} + +#[test] +fn a_topped_up_pool_can_fund_a_position_that_had_no_floor() { + let ctx = setup(); + let id = create_hackathon(&ctx); + + let partner = Address::generate(&ctx.env); + let contrib = 500_0000000_i128; + let fee = contrib * FEE_BPS as i128 / 10_000; + fund(&ctx, &partner, contrib + fee); + ctx.events + .add_funds(&id, &partner, &contrib, &BytesN::random(&ctx.env)); + + let w1 = Address::generate(&ctx.env); + let w2 = Address::generate(&ctx.env); + ctx.events.select_winners( + &id, + &soroban_sdk::vec![ + &ctx.env, + WinnerSpec { + recipient: w1.clone(), + position: 1, + amount: TOTAL_BUDGET, + reputation_bump: 0 + }, + ], + &BytesN::random(&ctx.env), + ); + // Adding a prize after publish: position 2 carries no floor and is paid + // out of the headroom the top-up created. + ctx.events.select_winners( + &id, + &soroban_sdk::vec![ + &ctx.env, + WinnerSpec { + recipient: w2.clone(), + position: 2, + amount: contrib, + reputation_bump: 0 + }, + ], + &BytesN::random(&ctx.env), + ); + + ctx.events + .claim_prize(&id, &1_u32, &BytesN::random(&ctx.env)); + ctx.events + .claim_prize(&id, &2_u32, &BytesN::random(&ctx.env)); + + let token = token::Client::new(&ctx.env, &ctx.token_addr); + assert_eq!(token.balance(&w1), TOTAL_BUDGET); + assert_eq!(token.balance(&w2), contrib); + assert_eq!(ctx.events.get_event(&id).remaining_escrow, 0); +} + +#[test] +fn second_batch_cannot_promise_funds_an_unclaimed_winner_is_owed() { + let ctx = setup(); + let id = create_hackathon(&ctx); + + let w1 = Address::generate(&ctx.env); + ctx.events.select_winners( + &id, + &soroban_sdk::vec![ + &ctx.env, + WinnerSpec { + recipient: w1.clone(), + position: 1, + amount: TOTAL_BUDGET, + reputation_bump: 0 + }, + ], + &BytesN::random(&ctx.env), + ); + + // remaining_escrow still reads the full budget because w1 has not claimed. + // Without the owed reservation this second batch would be accepted and + // one of the two winners could never be paid. + let w2 = Address::generate(&ctx.env); + let res = ctx.events.try_select_winners( + &id, + &soroban_sdk::vec![ + &ctx.env, + WinnerSpec { + recipient: w2.clone(), + position: 2, + amount: 1_i128, + reputation_bump: 0 + }, + ], + &BytesN::random(&ctx.env), + ); + assert!(res.is_err(), "owed funds must not be promised twice"); + + ctx.events + .claim_prize(&id, &1_u32, &BytesN::random(&ctx.env)); + let token = token::Client::new(&ctx.env, &ctx.token_addr); + assert_eq!(token.balance(&w1), TOTAL_BUDGET); } // ============================================================ @@ -575,6 +688,7 @@ fn grant_milestone_pays_floored_per_milestone() { WinnerSpec { recipient: recipient.clone(), position: 1, + amount: 1_000_0000000_i128, reputation_bump: 50 }, ]; @@ -616,6 +730,7 @@ fn grant_milestone_double_claim_rejected() { WinnerSpec { recipient: recipient.clone(), position: 1, + amount: 1_000_0000000_i128, reputation_bump: 50 }, ]; @@ -644,6 +759,7 @@ fn grant_milestone_out_of_range_rejected() { WinnerSpec { recipient: recipient.clone(), position: 1, + amount: 1_000_0000000_i128, reputation_bump: 50 }, ]; @@ -667,7 +783,7 @@ fn crowdfunding_dynamic_milestone_split() { let milestones = 3_u32; let mut dist = Map::new(&ctx.env); - dist.set(1, 100); + dist.set(1, TOTAL_BUDGET * 100 / 100); let params = CreateEventParams { pillar: Pillar::Crowdfunding, owner: ctx.owner.clone(), @@ -677,7 +793,7 @@ fn crowdfunding_dynamic_milestone_split() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/crowd"), title: String::from_str(&ctx.env, "Crowd Test"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: dist, + prize_floors: dist, fee_bps_override: None, manager: None, }; @@ -725,7 +841,7 @@ fn crowdfunding_dynamic_rounding_no_dust() { let milestones = 3_u32; let mut dist = Map::new(&ctx.env); - dist.set(1, 100); + dist.set(1, TOTAL_BUDGET * 100 / 100); let params = CreateEventParams { pillar: Pillar::Crowdfunding, owner: ctx.owner.clone(), @@ -735,7 +851,7 @@ fn crowdfunding_dynamic_rounding_no_dust() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/dust"), title: String::from_str(&ctx.env, "Dust Test"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: dist, + prize_floors: dist, fee_bps_override: None, manager: None, }; @@ -803,7 +919,7 @@ fn replayed_create_event_reverts() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/replay"), title: String::from_str(&ctx.env, "Replay"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist(&ctx.env), + prize_floors: single_dist(&ctx.env), fee_bps_override: None, manager: None, }; @@ -825,6 +941,7 @@ fn replayed_select_winners_reverts() { WinnerSpec { recipient: winner.clone(), position: 1, + amount: 1_000_0000000_i128, reputation_bump: 50 }, ]; @@ -848,6 +965,7 @@ fn select_winners_on_nonexistent_event_reverts() { WinnerSpec { recipient: winner.clone(), position: 1, + amount: 1_000_0000000_i128, reputation_bump: 50 }, ]; @@ -860,8 +978,8 @@ fn select_winners_on_nonexistent_event_reverts() { fn select_winners_duplicate_position_reverts() { let ctx = setup(); let mut dist = Map::new(&ctx.env); - dist.set(1, 50); - dist.set(2, 50); + dist.set(1, TOTAL_BUDGET * 50 / 100); + dist.set(2, TOTAL_BUDGET * 50 / 100); let id = create_hackathon_with_dist(&ctx, dist); let w1 = Address::generate(&ctx.env); @@ -871,11 +989,13 @@ fn select_winners_duplicate_position_reverts() { WinnerSpec { recipient: w1.clone(), position: 1, + amount: TOTAL_BUDGET * 50 / 100, reputation_bump: 50 }, WinnerSpec { recipient: w2.clone(), position: 1, + amount: TOTAL_BUDGET * 50 / 100, reputation_bump: 30 }, ]; @@ -885,9 +1005,9 @@ fn select_winners_duplicate_position_reverts() { } #[test] -fn select_winners_invalid_position_reverts() { +fn select_winners_accepts_a_position_with_no_floor() { let ctx = setup(); - let id = create_hackathon(&ctx); // dist has only position 1 + let id = create_hackathon(&ctx); // floors cover position 1 only let w = Address::generate(&ctx.env); let winners = soroban_sdk::vec![ @@ -895,12 +1015,47 @@ fn select_winners_invalid_position_reverts() { WinnerSpec { recipient: w.clone(), position: 99, + amount: 10_0000000_i128, + reputation_bump: 50 + }, + ]; + let op = BytesN::random(&ctx.env); + ctx.events.select_winners(&id, &winners, &op); + ctx.events + .claim_prize(&id, &99_u32, &BytesN::random(&ctx.env)); + + let token = token::Client::new(&ctx.env, &ctx.token_addr); + assert_eq!( + token.balance(&w), + 10_0000000_i128, + "a position with no floor is payable at any positive amount; this is \ + how a prize is added after publish" + ); +} + +#[test] +fn select_winners_below_floor_reverts() { + let ctx = setup(); + let mut floors = Map::new(&ctx.env); + floors.set(1, TOTAL_BUDGET); + let id = create_hackathon_with_dist(&ctx, floors); + + let w = Address::generate(&ctx.env); + let winners = soroban_sdk::vec![ + &ctx.env, + WinnerSpec { + recipient: w.clone(), + position: 1, + amount: TOTAL_BUDGET - 1, reputation_bump: 50 }, ]; let op = BytesN::random(&ctx.env); let res = ctx.events.try_select_winners(&id, &winners, &op); - assert!(res.is_err(), "position not in distribution must revert"); + assert!( + res.is_err(), + "an award below its advertised floor must revert" + ); } #[test] @@ -925,6 +1080,7 @@ fn select_winners_twice_reverts() { WinnerSpec { recipient: w.clone(), position: 1, + amount: 1_000_0000000_i128, reputation_bump: 50 }, ]; @@ -959,7 +1115,7 @@ fn large_budget_fee_does_not_overflow() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/big"), title: String::from_str(&ctx.env, "Big"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist(&ctx.env), + prize_floors: single_dist(&ctx.env), fee_bps_override: None, manager: None, }; @@ -1019,6 +1175,7 @@ fn select_winners_on_cancelled_event_reverts() { WinnerSpec { recipient: w.clone(), position: 1, + amount: 1_000_0000000_i128, reputation_bump: 50 }, ]; @@ -1051,12 +1208,15 @@ fn fee_and_winner_balances_consistent() { let escrow = TOTAL_BUDGET + contrib; + // Awarding the whole pool, top-up included, is a deliberate choice the + // selection makes rather than something a percentage does for it. let winner = Address::generate(&ctx.env); let winners = soroban_sdk::vec![ &ctx.env, WinnerSpec { recipient: winner.clone(), position: 1, + amount: escrow, reputation_bump: 50 }, ]; @@ -1066,7 +1226,11 @@ fn fee_and_winner_balances_consistent() { .claim_prize(&id, &1_u32, &BytesN::random(&ctx.env)); assert_eq!(token.balance(&winner), escrow); - assert_eq!(token.balance(&ctx.fee_account), create_fee + contrib_fee); + assert_eq!( + token.balance(&ctx.fee_account), + create_fee + contrib_fee, + "fees are charged at funding, never at release" + ); let event = ctx.events.get_event(&id); assert_eq!(event.remaining_escrow, 0); diff --git a/contracts/events/src/tests/grant_pillar.rs b/contracts/events/src/tests/grant_pillar.rs index 40db2a0..b482e92 100644 --- a/contracts/events/src/tests/grant_pillar.rs +++ b/contracts/events/src/tests/grant_pillar.rs @@ -12,14 +12,12 @@ use boundless_profile::{ProfileContract, ProfileContractClient}; const FEE_BPS: u32 = 250; const TOTAL_BUDGET: i128 = 10_000_0000000_i128; -#[allow(dead_code)] struct Ctx<'a> { env: Env, events: EventsContractClient<'a>, profile: ProfileContractClient<'a>, owner: Address, token_addr: Address, - token_admin: token::StellarAssetClient<'a>, fee_account: Address, } @@ -61,14 +59,13 @@ fn setup<'a>() -> Ctx<'a> { profile, owner, token_addr, - token_admin, fee_account, } } -fn single_dist(env: &Env) -> Map { +fn single_dist(env: &Env) -> Map { let mut m = Map::new(env); - m.set(1, 100); + m.set(1, 100000000000_i128); m } @@ -82,7 +79,7 @@ fn create_grant(ctx: &Ctx, n: u32) -> u64 { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/grant/1"), title: String::from_str(&ctx.env, "Test Grant"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist(&ctx.env), + prize_floors: single_dist(&ctx.env), fee_bps_override: None, manager: None, }; @@ -95,6 +92,7 @@ fn select_winner(ctx: &Ctx, id: u64, recipient: &Address) { WinnerSpec { recipient: recipient.clone(), position: 1, + amount: 10_000_0000000_i128, reputation_bump: 0 }, ]; @@ -128,7 +126,7 @@ fn grant_create_with_single_release_reverts() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/grant"), title: String::from_str(&ctx.env, "Bad Grant"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist(&ctx.env), + prize_floors: single_dist(&ctx.env), fee_bps_override: None, manager: None, }; @@ -150,7 +148,7 @@ fn grant_create_with_zero_milestones_reverts() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/grant"), title: String::from_str(&ctx.env, "Zero Milestones"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist(&ctx.env), + prize_floors: single_dist(&ctx.env), fee_bps_override: None, manager: None, }; @@ -233,11 +231,11 @@ fn claim_milestone_marks_completed_on_last() { } // ============================================================ -// claim_milestone: credit/reputation side-effects +// claim_milestone: earnings/reputation side-effects // ============================================================ #[test] -fn claim_milestone_earns_credits_and_bumps_reputation() { +fn claim_milestone_records_earnings_and_bumps_reputation() { let ctx = setup(); let recipient = Address::generate(&ctx.env); let id = create_grant(&ctx, 4); @@ -310,7 +308,7 @@ fn claim_milestone_on_single_release_reverts() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/hack"), title: String::from_str(&ctx.env, "Single Release"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist(&ctx.env), + prize_floors: single_dist(&ctx.env), fee_bps_override: None, manager: None, }; @@ -345,8 +343,8 @@ fn claim_milestone_op_replay_reverts() { fn two_winner_grant_each_claims_their_share() { let ctx = setup(); let mut dist = Map::new(&ctx.env); - dist.set(1, 60); - dist.set(2, 40); + dist.set(1, TOTAL_BUDGET * 60 / 100); + dist.set(2, TOTAL_BUDGET * 40 / 100); let params = CreateEventParams { pillar: Pillar::Grant, owner: ctx.owner.clone(), @@ -356,7 +354,7 @@ fn two_winner_grant_each_claims_their_share() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/multi-grant"), title: String::from_str(&ctx.env, "Multi Winner Grant"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: dist, + prize_floors: dist, fee_bps_override: None, manager: None, }; @@ -369,11 +367,13 @@ fn two_winner_grant_each_claims_their_share() { WinnerSpec { recipient: w1.clone(), position: 1, + amount: TOTAL_BUDGET * 60 / 100, reputation_bump: 0 }, WinnerSpec { recipient: w2.clone(), position: 2, + amount: TOTAL_BUDGET * 40 / 100, reputation_bump: 0 }, ]; diff --git a/contracts/events/src/tests/grant_scenarios/auth.rs b/contracts/events/src/tests/grant_scenarios/auth.rs new file mode 100644 index 0000000..c8c40ac --- /dev/null +++ b/contracts/events/src/tests/grant_scenarios/auth.rs @@ -0,0 +1,313 @@ +use soroban_sdk::testutils::Ledger as _; + +use super::*; + +fn awarded<'a>() -> (G<'a>, u64, Address) { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(1_000))]); + (g, id, a) +} + +#[test] +fn publishing_is_signed_by_the_owner_alone() { + let g = setup(); + g.token_admin.mint(&g.owner, &usdc(2_000)); + g.events + .create_event(&g.params(&Spec::new(usdc(1_000), 2)), &g.op()); + assert_eq!(g.signers(), std::vec![g.owner.clone()]); +} + +#[test] +fn publishing_without_the_owner_fails() { + let g = setup(); + g.token_admin.mint(&g.owner, &usdc(2_000)); + g.env.mock_auths(&[]); + fails_auth( + g.events + .try_create_event(&g.params(&Spec::new(usdc(1_000), 2)), &g.op()), + ); + g.restore_auth(); + assert_eq!(g.balance(&g.owner), usdc(2_000)); +} + +#[test] +fn milestone_release_is_signed_by_the_owner_alone() { + let (g, id, a) = awarded(); + g.events.claim_milestone(&id, &a, &0, &0, &g.op()); + assert_eq!(g.signers(), std::vec![g.owner.clone()]); +} + +#[test] +fn owner_signature_is_sufficient_to_release() { + let (g, id, a) = awarded(); + let op = g.op(); + g.sign_only( + &g.owner, + "claim_milestone", + args(&g, (id, a.clone(), 0u32, 0u32, op.clone())), + ); + g.events.claim_milestone(&id, &a, &0, &0, &op); + g.restore_auth(); + assert_eq!(g.balance(&a), usdc(500)); +} + +#[test] +fn recipient_cannot_release_their_own_milestone() { + let (g, id, a) = awarded(); + let op = g.op(); + g.sign_only( + &a, + "claim_milestone", + args(&g, (id, a.clone(), 0u32, 0u32, op.clone())), + ); + fails_auth(g.events.try_claim_milestone(&id, &a, &0, &0, &op)); + g.restore_auth(); + assert_eq!(g.balance(&a), 0); + assert!(!g.milestone_claimed(id, &a, 0)); +} + +#[test] +fn admin_cannot_release_a_milestone() { + let (g, id, a) = awarded(); + let op = g.op(); + g.sign_only( + &g.admin, + "claim_milestone", + args(&g, (id, a.clone(), 0u32, 0u32, op.clone())), + ); + fails_auth(g.events.try_claim_milestone(&id, &a, &0, &0, &op)); + g.restore_auth(); + assert_eq!(g.balance(&a), 0); +} + +#[test] +fn delegated_manager_cannot_release_a_milestone() { + let g = setup(); + let manager = g.someone(); + let id = g.create(Spec::new(usdc(1_000), 2).manager(&manager)); + g.events.accept_manager(&id); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(1_000))]); + + let op = g.op(); + g.sign_only( + &manager, + "claim_milestone", + args(&g, (id, a.clone(), 0u32, 0u32, op.clone())), + ); + fails_auth(g.events.try_claim_milestone(&id, &a, &0, &0, &op)); + g.restore_auth(); + g.pay(id, &a, 0, usdc(500)); +} + +#[test] +fn selection_is_signed_by_the_owner_until_a_manager_accepts() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + g.events + .select_winners(&id, &g.specs(&[(g.someone(), 1, usdc(1_000))]), &g.op()); + assert_eq!(g.signers(), std::vec![g.owner.clone()]); +} + +#[test] +fn after_handover_only_the_manager_selects_and_cancels() { + let g = setup(); + let manager = g.someone(); + let id = g.create(Spec::new(usdc(1_000), 2).manager(&manager)); + g.events.accept_manager(&id); + assert_eq!(g.signers(), std::vec![manager.clone()]); + + let a = g.someone(); + let specs = g.specs(&[(a.clone(), 1, usdc(1_000))]); + let op = g.op(); + g.sign_only( + &g.owner, + "select_winners", + args(&g, (id, specs.clone(), op.clone())), + ); + fails_auth(g.events.try_select_winners(&id, &specs, &op)); + + g.sign_only( + &manager, + "select_winners", + args(&g, (id, specs.clone(), op.clone())), + ); + g.events.select_winners(&id, &specs, &op); + g.restore_auth(); + g.forfeit(id, &a, 0, usdc(500)); + g.forfeit(id, &a, 1, usdc(500)); + + let op = g.op(); + g.sign_only(&g.owner, "start_cancel", args(&g, (id, op.clone()))); + fails_auth(g.events.try_start_cancel(&id, &op)); + + g.restore_auth(); + g.events.start_cancel(&id, &op); + assert_eq!(g.signers(), std::vec![manager.clone()]); + assert_eq!( + g.balance(&g.owner), + usdc(1_000), + "refunds still go to the owner" + ); +} + +#[test] +fn a_stranger_cannot_select_or_cancel() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let stranger = g.someone(); + let specs = g.specs(&[(stranger.clone(), 1, usdc(1_000))]); + let op = g.op(); + g.sign_only( + &stranger, + "select_winners", + args(&g, (id, specs.clone(), op.clone())), + ); + fails_auth(g.events.try_select_winners(&id, &specs, &op)); + g.sign_only(&stranger, "start_cancel", args(&g, (id, op.clone()))); + fails_auth(g.events.try_start_cancel(&id, &op)); + g.restore_auth(); + assert_eq!(g.owed(id), 0); + assert_eq!(g.status(id), EventStatus::Active); +} + +#[test] +fn a_top_up_is_signed_by_the_contributor() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let partner = g.someone(); + g.token_admin.mint(&partner, &usdc(100)); + g.events.add_funds(&id, &partner, &usdc(10), &g.op()); + assert_eq!(g.signers(), std::vec![partner.clone()]); + + let other = g.someone(); + let op = g.op(); + g.sign_only( + &other, + "add_funds", + args(&g, (id, partner.clone(), usdc(10), op.clone())), + ); + fails_auth(g.events.try_add_funds(&id, &partner, &usdc(10), &op)); + g.restore_auth(); +} + +#[test] +fn the_refund_crank_needs_no_signature() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let partner = g.someone(); + g.contribute(id, &partner, usdc(10)); + g.events.start_cancel(&id, &g.op()); + + g.env.mock_auths(&[]); + assert_eq!(g.events.process_cancel_batch(&id, &25, &g.op()), 0); + g.events.finalize_cancel(&id, &g.op()); + g.restore_auth(); + assert_eq!(g.balance(&partner), usdc(10)); + assert_eq!(g.balance(&g.owner), usdc(1_000)); +} + +#[test] +fn manager_handover_needs_both_sides() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let manager = g.someone(); + + g.sign_only(&manager, "propose_manager", args(&g, (id, manager.clone()))); + fails_auth(g.events.try_propose_manager(&id, &manager)); + + g.sign_only(&g.owner, "propose_manager", args(&g, (id, manager.clone()))); + g.events.propose_manager(&id, &manager); + + g.sign_only(&g.owner, "accept_manager", args(&g, (id,))); + fails_auth(g.events.try_accept_manager(&id)); + + g.sign_only(&manager, "accept_manager", args(&g, (id,))); + g.events.accept_manager(&id); + g.restore_auth(); + assert_eq!(g.events.get_manager(&id), manager); +} + +#[test] +fn an_unaccepted_proposal_expires() { + let g = setup(); + let manager = g.someone(); + let id = g.create(Spec::new(usdc(1_000), 2).manager(&manager)); + let expires = g.events.get_pending_manager(&id).unwrap().expires_at_ledger; + g.env.ledger().with_mut(|l| l.sequence_number = expires + 1); + fails_with( + g.events.try_accept_manager(&id), + Error::PendingRotationExpired, + ); + assert_eq!(g.events.get_manager(&id), g.owner); +} + +#[test] +fn a_pending_proposal_can_be_withdrawn() { + let g = setup(); + let manager = g.someone(); + let id = g.create(Spec::new(usdc(1_000), 2).manager(&manager)); + g.events.cancel_pending_manager(&id); + assert_eq!(g.signers(), std::vec![g.owner.clone()]); + fails_with( + g.events.try_accept_manager(&id), + Error::PendingRotationMismatch, + ); +} + +#[test] +fn the_owner_takes_management_back_before_any_award() { + let g = setup(); + let manager = g.someone(); + let id = g.create(Spec::new(usdc(1_000), 2).manager(&manager)); + g.events.accept_manager(&id); + let next = g.someone(); + g.events.propose_manager(&id, &next); + + g.sign_only(&manager, "reclaim_management", args(&g, (id,))); + fails_auth(g.events.try_reclaim_management(&id)); + g.sign_only(&g.owner, "reclaim_management", args(&g, (id,))); + g.events.reclaim_management(&id); + g.capture(); + g.restore_auth(); + + assert_eq!(g.events.get_manager(&id), g.owner); + assert!(g.events.get_pending_manager(&id).is_none()); + assert!(g.emitted(crate::events::ManagementReclaimed { + event_id: id, + owner: g.owner.clone(), + })); + fails_with( + g.events.try_accept_manager(&id), + Error::PendingRotationMismatch, + ); + + // the owner runs it from here, cancel included + g.events.start_cancel(&id, &g.op()); + assert_eq!(g.signers(), std::vec![g.owner.clone()]); + assert_eq!(g.balance(&g.owner), usdc(1_000)); +} + +#[test] +fn after_selection_management_stays_with_the_manager() { + let g = setup(); + let manager = g.someone(); + let id = g.create(Spec::new(usdc(1_000), 2).manager(&manager)); + g.events.accept_manager(&id); + g.select(id, &[(g.someone(), 1, usdc(1_000))]); + fails_with( + g.events.try_reclaim_management(&id), + Error::WinnersAlreadySelected, + ); + assert_eq!(g.events.get_manager(&id), manager); +} + +#[test] +fn reclaiming_needs_an_open_event() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + g.cancel(id); + fails_with(g.events.try_reclaim_management(&id), Error::EventNotActive); +} diff --git a/contracts/events/src/tests/grant_scenarios/cancel.rs b/contracts/events/src/tests/grant_scenarios/cancel.rs new file mode 100644 index 0000000..5aa962f --- /dev/null +++ b/contracts/events/src/tests/grant_scenarios/cancel.rs @@ -0,0 +1,208 @@ +use super::*; +use crate::event_ops::MAX_REFUNDS_PER_BATCH; +use crate::events::{ContributorRefunded, EventCancelled, OwnerResidualRefunded}; + +#[test] +fn cancel_before_selection_returns_the_budget_but_not_the_fee() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + g.events.start_cancel(&id, &g.op()); + g.capture(); + + assert_eq!(g.status(id), EventStatus::Cancelled); + assert_eq!(g.balance(&g.owner), usdc(1_000)); + assert_eq!(g.balance(&g.fee_account), usdc(25)); + assert!(g.emitted(OwnerResidualRefunded { + event_id: id, + owner: g.owner.clone(), + amount: usdc(1_000), + })); + assert!(g.emitted(EventCancelled { id })); + g.books(); +} + +#[test] +fn partners_are_refunded_in_full_before_the_owner() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let (p1, p2) = (g.someone(), g.someone()); + g.contribute(id, &p1, usdc(200)); + g.contribute(id, &p2, usdc(300)); + + g.events.start_cancel(&id, &g.op()); + assert_eq!(g.status(id), EventStatus::Cancelling); + assert_eq!(g.owed(id), 0); + + let left = g + .events + .process_cancel_batch(&id, &MAX_REFUNDS_PER_BATCH, &g.op()); + assert_eq!(left, 0); + assert!(g.emitted(ContributorRefunded { + event_id: id, + contributor: p2.clone(), + amount: usdc(300), + })); + g.events.finalize_cancel(&id, &g.op()); + + assert_eq!(g.balance(&p1), usdc(200)); + assert_eq!(g.balance(&p2), usdc(300)); + assert_eq!(g.balance(&g.owner), usdc(1_000)); + assert_eq!(g.status(id), EventStatus::Cancelled); + assert_eq!(g.escrow_balance(), 0); + g.books(); +} + +#[test] +fn after_payouts_partners_share_what_is_left_pro_rata() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let (p1, p2) = (g.someone(), g.someone()); + g.contribute(id, &p1, usdc(300)); + g.contribute(id, &p2, usdc(200)); + + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(1_400))]); + g.pay(id, &a, 0, usdc(700)); + g.pay(id, &a, 1, usdc(700)); + // 100 left against 500 of partner money + g.cancel(id); + + assert_eq!(g.balance(&p1), usdc(60)); + assert_eq!(g.balance(&p2), usdc(40)); + assert_eq!(g.balance(&g.owner), 0); + assert_eq!(g.escrow_balance(), 0); +} + +#[test] +fn pro_rata_rounding_dust_stays_in_the_contract() { + let g = setup(); + let id = g.create(Spec::new(usdc(100), 1)); + let partners = [g.someone(), g.someone(), g.someone()]; + for p in partners.iter() { + g.contribute(id, p, usdc(10)); + } + let a = g.someone(); + // leave 20 USDC + 2 stroops against 30 USDC of partner money + let award = usdc(110) - 2; + g.select(id, &[(a.clone(), 1, award)]); + g.pay(id, &a, 0, award); + g.cancel(id); + + let each = usdc(10) * (usdc(20) + 2) / usdc(30); + for p in partners.iter() { + assert_eq!(g.balance(p), each); + } + let dust = usdc(20) + 2 - 3 * each; + assert!(dust > 0); + assert_eq!(g.escrow_balance(), dust); +} + +#[test] +fn many_partners_are_refunded_across_batches() { + let g = setup(); + let id = g.create(Spec::new(usdc(100), 1)); + let partners: std::vec::Vec
= (0..30).map(|_| g.someone()).collect(); + for p in partners.iter() { + g.contribute(id, p, usdc(10)); + } + g.events.start_cancel(&id, &g.op()); + + fails_with( + g.events.try_finalize_cancel(&id, &g.op()), + Error::CancellationNotFinished, + ); + assert_eq!( + g.events + .process_cancel_batch(&id, &MAX_REFUNDS_PER_BATCH, &g.op()), + 30 - MAX_REFUNDS_PER_BATCH + ); + // asking for more than the cap processes the cap + assert_eq!(g.events.process_cancel_batch(&id, &100, &g.op()), 0); + g.events.finalize_cancel(&id, &g.op()); + + for p in partners.iter() { + assert_eq!(g.balance(p), usdc(10)); + } + assert_eq!(g.balance(&g.owner), usdc(100)); + assert_eq!(g.escrow_balance(), 0); +} + +#[test] +fn nothing_is_paid_while_cancelling_or_after() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let a = g.someone(); + g.contribute(id, &g.someone(), usdc(10)); + g.select(id, &[(a.clone(), 1, usdc(1_000))]); + g.pay(id, &a, 0, usdc(500)); + g.forfeit(id, &a, 1, usdc(500)); + + g.events.start_cancel(&id, &g.op()); + fails_with( + g.events.try_claim_milestone(&id, &a, &1, &0, &g.op()), + Error::EventNotActive, + ); + g.finish_cancel(id); + fails_with( + g.events.try_claim_milestone(&id, &a, &1, &0, &g.op()), + Error::EventNotActive, + ); + assert_eq!(g.balance(&a), usdc(500)); +} + +#[test] +fn a_completed_grant_cannot_be_cancelled() { + let g = setup(); + let id = g.create(Spec::new(usdc(100), 1)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(100))]); + g.pay(id, &a, 0, usdc(100)); + fails_with( + g.events.try_start_cancel(&id, &g.op()), + Error::EventNotActive, + ); +} + +#[test] +fn cancel_starts_once() { + let g = setup(); + let id = g.create(Spec::new(usdc(100), 1)); + g.contribute(id, &g.someone(), usdc(10)); + g.events.start_cancel(&id, &g.op()); + fails_with( + g.events.try_start_cancel(&id, &g.op()), + Error::EventNotActive, + ); +} + +#[test] +fn crank_and_finalize_need_a_cancel_in_progress() { + let g = setup(); + let id = g.create(Spec::new(usdc(100), 1)); + fails_with( + g.events.try_process_cancel_batch(&id, &25, &g.op()), + Error::CancellationNotStarted, + ); + fails_with( + g.events.try_finalize_cancel(&id, &g.op()), + Error::CancellationNotStarted, + ); +} + +#[test] +fn residual_return_after_every_award_is_paid() { + let g = setup(); + let id = g.create(Spec::new(usdc(20_000), 2).floors(&[(1, usdc(5_000)), (2, usdc(5_000))])); + let (a, b) = (g.someone(), g.someone()); + g.select( + id, + &[(a.clone(), 1, usdc(6_000)), (b.clone(), 2, usdc(5_000))], + ); + for m in 0..2 { + g.pay(id, &a, m, usdc(3_000)); + g.pay(id, &b, m, usdc(2_500)); + } + assert_eq!(g.status(id), EventStatus::Active); + g.cancel(id); + assert_eq!(g.balance(&g.owner), usdc(9_000)); +} diff --git a/contracts/events/src/tests/grant_scenarios/claims.rs b/contracts/events/src/tests/grant_scenarios/claims.rs new file mode 100644 index 0000000..b04c671 --- /dev/null +++ b/contracts/events/src/tests/grant_scenarios/claims.rs @@ -0,0 +1,274 @@ +use soroban_sdk::testutils::Ledger as _; + +use super::*; +use crate::events::MilestoneClaimed; + +#[test] +fn even_split_pays_equal_parts_and_completes() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(1_000))]); + + g.pay(id, &a, 0, usdc(500)); + assert_eq!(g.status(id), EventStatus::Active); + assert!(g.emitted(MilestoneClaimed { + event_id: id, + recipient: a.clone(), + milestone: 0, + amount: usdc(500), + })); + + g.pay(id, &a, 1, usdc(500)); + assert_eq!(g.status(id), EventStatus::Completed); + assert_eq!(g.balance(&a), usdc(1_000)); + assert_eq!(g.escrow_balance(), 0); +} + +#[test] +fn one_milestone_pays_the_whole_award_at_once() { + let g = setup(); + let id = g.create(Spec::new(usdc(200), 1)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(200))]); + g.pay(id, &a, 0, usdc(200)); + assert_eq!(g.status(id), EventStatus::Completed); +} + +#[test] +fn rounding_remainder_goes_to_the_last_payment() { + let g = setup(); + // 100 USDC + 1 stroop over 3 milestones: 333333336, 333333336, 333333337... floored + let award = usdc(100) + 1; + let id = g.create(Spec::new(award, 3)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, award)]); + + let part = award / 3; + g.pay(id, &a, 0, part); + g.pay(id, &a, 1, part); + g.pay(id, &a, 2, award - 2 * part); + assert_eq!(g.balance(&a), award); + assert_eq!(g.status(id), EventStatus::Completed); +} + +#[test] +fn last_payment_is_decided_by_count_not_index() { + let g = setup(); + let award = usdc(10) + 2; + let id = g.create(Spec::new(award, 3)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, award)]); + + let part = award / 3; + g.pay(id, &a, 2, part); + g.pay(id, &a, 0, part); + g.pay(id, &a, 1, award - 2 * part); + assert_eq!(g.balance(&a), award); +} + +#[test] +fn ten_milestones_with_an_awkward_amount_pay_exactly() { + let g = setup(); + let award = usdc(6_000) + 7; + let id = g.create(Spec::new(award, 10)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, award)]); + let part = award / 10; + for m in 0..9 { + g.pay(id, &a, m, part); + } + g.pay(id, &a, 9, award - 9 * part); + assert_eq!(g.balance(&a), award); + assert_eq!(g.status(id), EventStatus::Completed); +} + +#[test] +fn tiered_recipients_are_paid_independently_and_interleaved() { + let g = setup(); + let id = g.create(Spec::new(usdc(25_000), 3).floors(&[ + (1, usdc(12_000)), + (2, usdc(8_000)), + (3, usdc(5_000)), + ])); + let (a, b, c) = (g.someone(), g.someone(), g.someone()); + g.select( + id, + &[ + (a.clone(), 1, usdc(12_000)), + (b.clone(), 2, usdc(8_000)), + (c.clone(), 3, usdc(5_000)), + ], + ); + + g.pay(id, &b, 0, usdc(8_000) / 3); + g.pay(id, &a, 0, usdc(4_000)); + g.pay(id, &c, 1, usdc(5_000) / 3); + g.pay(id, &b, 2, usdc(8_000) / 3); + g.pay(id, &a, 1, usdc(4_000)); + g.pay(id, &c, 0, usdc(5_000) / 3); + g.pay(id, &a, 2, usdc(4_000)); + assert_eq!(g.status(id), EventStatus::Active); + g.pay(id, &c, 2, usdc(5_000) - 2 * (usdc(5_000) / 3)); + g.pay(id, &b, 1, usdc(8_000) - 2 * (usdc(8_000) / 3)); + + assert_eq!(g.balance(&a), usdc(12_000)); + assert_eq!(g.balance(&b), usdc(8_000)); + assert_eq!(g.balance(&c), usdc(5_000)); + assert_eq!(g.status(id), EventStatus::Completed); + assert_eq!(g.escrow_balance(), 0); +} + +#[test] +fn every_payment_is_recorded_as_a_paid_row() { + let g = setup(); + let id = g.create(Spec::new(usdc(900), 3)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(900))]); + g.env.ledger().with_mut(|l| l.timestamp = 1_000); + g.pay(id, &a, 1, usdc(300)); + + assert_eq!(g.events.get_winner_count(&id), 2); + let paid = g.events.get_winner_at(&id, &1).unwrap(); + assert_eq!(paid.recipient, a); + assert_eq!(paid.position, 1); + assert_eq!(paid.amount, usdc(300)); + assert_eq!(paid.milestone, Some(1)); + assert_eq!(paid.paid_at, Some(1_000)); +} + +#[test] +fn payouts_register_earnings_and_reputation_on_the_profile() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(1_000))]); + g.events.claim_milestone(&id, &a, &0, &10, &g.op()); + g.events.claim_milestone(&id, &a, &1, &10, &g.op()); + + let profile = g.profile.get_profile(&a).unwrap(); + assert_eq!(profile.reputation, 20); + assert_eq!(g.profile.get_earnings(&a, &g.token.address), usdc(1_000)); +} + +#[test] +fn the_same_milestone_cannot_be_paid_twice() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(1_000))]); + g.pay(id, &a, 0, usdc(500)); + fails_with( + g.events.try_claim_milestone(&id, &a, &0, &0, &g.op()), + Error::MilestoneAlreadyClaimed, + ); + assert_eq!(g.balance(&a), usdc(500)); +} + +#[test] +fn milestone_index_must_be_in_range() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(1_000))]); + for m in [2, u32::MAX] { + fails_with( + g.events.try_claim_milestone(&id, &a, &m, &0, &g.op()), + Error::InvalidMilestone, + ); + } +} + +#[test] +fn only_a_selected_recipient_can_be_paid() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let a = g.someone(); + + fails_with( + g.events.try_claim_milestone(&id, &a, &0, &0, &g.op()), + Error::NoSubmissions, + ); + + g.select(id, &[(a, 1, usdc(1_000))]); + fails_with( + g.events + .try_claim_milestone(&id, &g.someone(), &0, &0, &g.op()), + Error::NoSubmissions, + ); + assert_eq!(g.owed(id), usdc(1_000)); +} + +#[test] +fn claim_op_id_cannot_be_replayed() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(1_000))]); + let op = g.op(); + g.events.claim_milestone(&id, &a, &0, &0, &op); + fails_with( + g.events.try_claim_milestone(&id, &a, &1, &0, &op), + Error::OpAlreadySeen, + ); +} + +#[test] +fn nothing_can_be_paid_after_completion() { + let g = setup(); + let id = g.create(Spec::new(usdc(100), 1)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(100))]); + g.pay(id, &a, 0, usdc(100)); + fails_with( + g.events.try_claim_milestone(&id, &a, &0, &0, &g.op()), + Error::EventNotActive, + ); +} + +#[test] +fn claim_prize_is_not_a_grant_path() { + let g = setup(); + let id = g.create(Spec::new(usdc(100), 1)); + let a = g.someone(); + g.select(id, &[(a, 1, usdc(100))]); + fails_with( + g.events.try_claim_prize(&id, &1, &g.op()), + Error::InvalidReleaseKind, + ); +} + +#[test] +fn unknown_grant_is_refused() { + let g = setup(); + fails_with( + g.events + .try_claim_milestone(&404, &g.someone(), &0, &0, &g.op()), + Error::EventNotFound, + ); +} + +#[test] +fn a_rejected_milestone_is_forfeited_and_comes_back_on_close() { + let g = setup(); + let award = usdc(10) + 1; + let id = g.create(Spec::new(award, 3)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, award)]); + + let part = award / 3; + g.pay(id, &a, 0, part); + g.forfeit(id, &a, 1, part); + // the last milestone settled still takes the rounding remainder + g.pay(id, &a, 2, award - 2 * part); + assert_eq!(g.owed(id), 0); + assert_eq!( + g.status(id), + EventStatus::Active, + "the forfeited share is still held" + ); + + g.cancel(id); + assert_eq!(g.balance(&g.owner), part); + assert_eq!(g.balance(&a), award - part); +} diff --git a/contracts/events/src/tests/grant_scenarios/contributions.rs b/contracts/events/src/tests/grant_scenarios/contributions.rs new file mode 100644 index 0000000..c00b766 --- /dev/null +++ b/contracts/events/src/tests/grant_scenarios/contributions.rs @@ -0,0 +1,180 @@ +use super::*; +use crate::events::FundsAdded; + +#[test] +fn partner_money_before_selection_can_fund_bigger_awards() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2).floors(&[(1, usdc(500))])); + let partner = g.someone(); + g.contribute(id, &partner, usdc(500)); + assert!(g.emitted(FundsAdded { + event_id: id, + contributor: partner.clone(), + amount: usdc(500), + new_remaining: usdc(1_500), + })); + + let (a, b) = (g.someone(), g.someone()); + g.select(id, &[(a.clone(), 1, usdc(900)), (b.clone(), 2, usdc(600))]); + g.pay(id, &a, 0, usdc(450)); + g.pay(id, &a, 1, usdc(450)); + g.pay(id, &b, 0, usdc(300)); + g.pay(id, &b, 1, usdc(300)); + assert_eq!(g.status(id), EventStatus::Completed); + assert_eq!(g.escrow_balance(), 0); +} + +#[test] +fn partners_are_tracked_and_the_owner_is_not() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 1)); + let (p1, p2) = (g.someone(), g.someone()); + g.contribute(id, &p1, usdc(100)); + g.contribute(id, &p2, usdc(50)); + g.contribute(id, &p1, usdc(25)); + g.contribute(id, &g.owner, usdc(10)); + + assert_eq!(g.events.get_contributor_count(&id), 2); + assert_eq!(g.events.get_contributor_amount(&id, &p1), usdc(125)); + assert_eq!(g.events.get_contributor_amount(&id, &p2), usdc(50)); + assert_eq!(g.events.get_contributor_amount(&id, &g.owner), 0); + assert_eq!(g.event(id).remaining_escrow, usdc(1_185)); + assert_eq!( + g.event(id).total_budget, + usdc(1_000), + "budget is the publish amount" + ); +} + +#[test] +fn contributions_below_ten_usdc_are_refused() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 1)); + let partner = g.someone(); + g.token_admin.mint(&partner, &usdc(100)); + fails_with( + g.events + .try_add_funds(&id, &partner, &(usdc(10) - 1), &g.op()), + Error::BelowMinimumContribution, + ); + for amount in [0, -1] { + fails_with( + g.events.try_add_funds(&id, &partner, &amount, &g.op()), + Error::InvalidContributionAmount, + ); + } + g.contribute(id, &partner, usdc(10)); +} + +#[test] +fn money_added_after_selection_cannot_be_awarded_and_comes_back_first() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(1_000))]); + + let partner = g.someone(); + g.contribute(id, &partner, usdc(300)); + g.pay(id, &a, 0, usdc(500)); + g.pay(id, &a, 1, usdc(500)); + + assert_eq!( + g.status(id), + EventStatus::Active, + "the top-up keeps it open" + ); + assert_eq!(g.event(id).remaining_escrow, usdc(300)); + assert_eq!(g.owed(id), 0); + + g.cancel(id); + assert_eq!(g.balance(&partner), usdc(300)); + assert_eq!(g.balance(&g.owner), 0); +} + +#[test] +fn no_contributions_once_the_grant_is_closed() { + let g = setup(); + let partner = g.someone(); + g.token_admin.mint(&partner, &usdc(1_000)); + + let done = g.create(Spec::new(usdc(100), 1)); + let a = g.someone(); + g.select(done, &[(a.clone(), 1, usdc(100))]); + g.pay(done, &a, 0, usdc(100)); + fails_with( + g.events.try_add_funds(&done, &partner, &usdc(10), &g.op()), + Error::EventNotActive, + ); + + let cancelled = g.create(Spec::new(usdc(100), 1)); + g.cancel(cancelled); + fails_with( + g.events + .try_add_funds(&cancelled, &partner, &usdc(10), &g.op()), + Error::EventNotActive, + ); + + let cancelling = g.create(Spec::new(usdc(100), 1)); + g.contribute(cancelling, &g.someone(), usdc(10)); + g.events.start_cancel(&cancelling, &g.op()); + assert_eq!(g.status(cancelling), EventStatus::Cancelling); + fails_with( + g.events + .try_add_funds(&cancelling, &partner, &usdc(10), &g.op()), + Error::EventNotActive, + ); + + fails_with( + g.events.try_add_funds(&777, &partner, &usdc(10), &g.op()), + Error::EventNotFound, + ); +} + +#[test] +fn fee_override_applies_to_top_ups() { + let g = setup(); + let free = g.create(Spec::new(usdc(1_000), 1).fee_override(0)); + let fee_before = g.balance(&g.fee_account); + g.contribute(free, &g.someone(), usdc(100)); + assert_eq!(g.balance(&g.fee_account), fee_before); +} + +#[test] +fn top_ups_follow_the_current_global_fee() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 1)); + g.events.set_fee_bps(&500); + let fee_before = g.balance(&g.fee_account); + g.contribute(id, &g.someone(), usdc(100)); + assert_eq!(g.balance(&g.fee_account) - fee_before, usdc(5)); +} + +#[test] +fn top_up_op_id_cannot_be_replayed() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 1)); + let partner = g.someone(); + g.token_admin.mint(&partner, &usdc(100)); + let op = g.op(); + g.events.add_funds(&id, &partner, &usdc(10), &op); + fails_with( + g.events.try_add_funds(&id, &partner, &usdc(10), &op), + Error::OpAlreadySeen, + ); +} + +#[test] +fn a_partner_without_the_funds_moves_nothing() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 1)); + let partner = g.someone(); + g.token_admin.mint(&partner, &usdc(10)); + // the fee on top is missing + assert!(g + .events + .try_add_funds(&id, &partner, &usdc(10), &g.op()) + .is_err()); + assert_eq!(g.balance(&partner), usdc(10)); + assert_eq!(g.events.get_contributor_count(&id), 0); + assert_eq!(g.event(id).remaining_escrow, usdc(1_000)); +} diff --git a/contracts/events/src/tests/grant_scenarios/create.rs b/contracts/events/src/tests/grant_scenarios/create.rs new file mode 100644 index 0000000..1561dbe --- /dev/null +++ b/contracts/events/src/tests/grant_scenarios/create.rs @@ -0,0 +1,202 @@ +use soroban_sdk::{testutils::Address as _, Address, Map, String}; + +use super::*; +use crate::events::EventCreated; + +#[test] +fn publish_escrows_the_budget_and_charges_the_fee_on_top() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + + let event = g.event(id); + assert_eq!(event.pillar, Pillar::Grant); + assert_eq!(event.release_kind, ReleaseKind::Multi(2)); + assert_eq!(event.total_budget, usdc(1_000)); + assert_eq!(g.balance(&g.fee_account), usdc(25)); + assert_eq!(g.owed(id), 0); + assert!(g.emitted(EventCreated { + id, + pillar: Pillar::Grant, + owner: g.owner.clone(), + token: g.token.address.clone(), + total_budget: usdc(1_000), + content_uri: String::from_str(&g.env, "https://api.boundless.fi/grants/x/content"), + title: String::from_str(&g.env, "Community grants"), + })); +} + +#[test] +fn every_preset_shape_publishes() { + let g = setup(); + // micro: 5 x 200, one milestone + g.create(Spec::new(usdc(1_000), 1).floors(&[ + (1, usdc(200)), + (2, usdc(200)), + (3, usdc(200)), + (4, usdc(200)), + (5, usdc(200)), + ])); + // builder: tiered, three milestones + g.create(Spec::new(usdc(25_000), 3).floors(&[ + (1, usdc(12_000)), + (2, usdc(8_000)), + (3, usdc(5_000)), + ])); + // infrastructure: one award, five milestones + g.create(Spec::new(usdc(100_000), 5)); + // research: floors below the budget leave headroom + g.create(Spec::new(usdc(20_000), 2).floors(&[(1, usdc(5_000)), (2, usdc(5_000))])); + // backend clamp: ten milestones + g.create(Spec::new(usdc(6_000), 10)); +} + +#[test] +fn fee_override_applies_to_the_grant_only() { + let g = setup(); + g.create(Spec::new(usdc(1_000), 2).fee_override(0)); + assert_eq!(g.balance(&g.fee_account), 0); + + g.create(Spec::new(usdc(1_000), 2).fee_override(1_000)); + assert_eq!(g.balance(&g.fee_account), usdc(100)); +} + +#[test] +fn fee_override_above_the_cap_is_refused() { + let g = setup(); + let spec = Spec::new(usdc(1_000), 2).fee_override(1_001); + g.token_admin.mint(&g.owner, &usdc(2_000)); + fails_with( + g.events.try_create_event(&g.params(&spec), &g.op()), + Error::InvalidFeeBps, + ); +} + +#[test] +fn single_release_is_not_a_grant() { + let g = setup(); + g.token_admin.mint(&g.owner, &usdc(2_000)); + let mut params = g.params(&Spec::new(usdc(1_000), 2)); + params.release_kind = ReleaseKind::Single; + fails_with( + g.events.try_create_event(¶ms, &g.op()), + Error::InvalidReleaseKind, + ); +} + +#[test] +fn zero_milestones_is_refused() { + let g = setup(); + g.token_admin.mint(&g.owner, &usdc(2_000)); + fails_with( + g.events + .try_create_event(&g.params(&Spec::new(usdc(1_000), 0)), &g.op()), + Error::InvalidReleaseKind, + ); +} + +#[test] +fn budget_must_be_positive() { + let g = setup(); + for budget in [0, -1] { + let mut params = g.params(&Spec::new(usdc(1_000), 1)); + params.total_budget = budget; + fails_with( + g.events.try_create_event(¶ms, &g.op()), + Error::InvalidBudget, + ); + } +} + +#[test] +fn floors_must_be_present_positive_and_within_budget() { + let g = setup(); + g.token_admin.mint(&g.owner, &usdc(10_000)); + + let mut empty = g.params(&Spec::new(usdc(1_000), 1)); + empty.prize_floors = Map::new(&g.env); + fails_with( + g.events.try_create_event(&empty, &g.op()), + Error::InvalidDistribution, + ); + + let zero = g.params(&Spec::new(usdc(1_000), 1).floors(&[(1, 0)])); + fails_with( + g.events.try_create_event(&zero, &g.op()), + Error::InvalidDistribution, + ); + + let over = g.params(&Spec::new(usdc(1_000), 1).floors(&[(1, usdc(600)), (2, usdc(401))])); + fails_with( + g.events.try_create_event(&over, &g.op()), + Error::DistributionMismatch, + ); + + let exact = g.params(&Spec::new(usdc(1_000), 1).floors(&[(1, usdc(600)), (2, usdc(400))])); + assert!(g.events.try_create_event(&exact, &g.op()).is_ok()); +} + +#[test] +fn unlisted_token_is_refused() { + let g = setup(); + let other = g + .env + .register_stellar_asset_contract_v2(Address::generate(&g.env)); + let mut params = g.params(&Spec::new(usdc(1_000), 1)); + params.token = other.address(); + fails_with( + g.events.try_create_event(¶ms, &g.op()), + Error::TokenNotSupported, + ); +} + +#[test] +fn title_over_120_characters_is_refused() { + let g = setup(); + let mut params = g.params(&Spec::new(usdc(1_000), 1)); + params.title = String::from_str(&g.env, &"x".repeat(121)); + fails_with( + g.events.try_create_event(¶ms, &g.op()), + Error::TitleTooLong, + ); +} + +#[test] +fn owner_without_funds_cannot_publish() { + let g = setup(); + g.token_admin.mint(&g.owner, &usdc(1_000)); + // budget is there, the fee on top is not + assert!(g + .events + .try_create_event(&g.params(&Spec::new(usdc(1_000), 1)), &g.op()) + .is_err()); + assert_eq!(g.balance(&g.owner), usdc(1_000)); + assert_eq!(g.escrow_balance(), 0); +} + +#[test] +fn publish_op_id_cannot_be_replayed() { + let g = setup(); + g.token_admin.mint(&g.owner, &usdc(5_000)); + let op = g.op(); + let params = g.params(&Spec::new(usdc(1_000), 1)); + g.events.create_event(¶ms, &op); + fails_with( + g.events.try_create_event(¶ms, &op), + Error::OpAlreadySeen, + ); +} + +#[test] +fn naming_a_manager_only_proposes_it() { + let g = setup(); + let manager = g.someone(); + let id = g.create(Spec::new(usdc(1_000), 1).manager(&manager)); + + assert_eq!(g.events.get_manager(&id), g.owner); + let pending = g.events.get_pending_manager(&id).unwrap(); + assert_eq!(pending.target, manager); + + g.events.accept_manager(&id); + assert_eq!(g.events.get_manager(&id), manager); + assert!(g.events.get_pending_manager(&id).is_none()); +} diff --git a/contracts/events/src/tests/grant_scenarios/forfeits.rs b/contracts/events/src/tests/grant_scenarios/forfeits.rs new file mode 100644 index 0000000..149fa94 --- /dev/null +++ b/contracts/events/src/tests/grant_scenarios/forfeits.rs @@ -0,0 +1,209 @@ +use super::*; +use crate::events::{MilestoneForfeited, OwnerResidualRefunded}; + +#[test] +fn a_forfeit_frees_the_share_without_moving_tokens() { + let g = setup(); + let id = g.create(Spec::new(usdc(900), 3)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(900))]); + g.forfeit(id, &a, 1, usdc(300)); + assert!(g.emitted(MilestoneForfeited { + event_id: id, + recipient: a.clone(), + milestone: 1, + amount: usdc(300), + })); + assert_eq!(g.owed(id), usdc(600)); + assert_eq!(g.event(id).remaining_escrow, usdc(900)); + assert_eq!( + g.events.get_winner_count(&id), + 1, + "no paid row for a forfeit" + ); +} + +#[test] +fn a_forfeited_last_milestone_takes_the_remainder_with_it() { + let g = setup(); + let award = usdc(10) + 2; + let id = g.create(Spec::new(award, 3)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, award)]); + let part = award / 3; + g.pay(id, &a, 0, part); + g.pay(id, &a, 2, part); + g.forfeit(id, &a, 1, award - 2 * part); + assert_eq!(g.owed(id), 0); + g.cancel(id); + assert_eq!(g.balance(&g.owner), award - 2 * part); + assert!(g.emitted(OwnerResidualRefunded { + event_id: id, + owner: g.owner.clone(), + amount: award - 2 * part, + })); +} + +#[test] +fn a_migration_pass_after_a_forfeit_keeps_it_released() { + let g = setup(); + let id = g.create(Spec::new(usdc(900), 3)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(900))]); + g.forfeit(id, &a, 0, usdc(300)); + + // Every upgrade pages migrate_events over the events created since the + // last stamp, so a live grant is always in its path. + assert_eq!(g.events.migrate_events(&8_u32), 0); + assert_eq!(g.owed(id), usdc(600)); + + g.pay(id, &a, 1, usdc(300)); + g.pay(id, &a, 2, usdc(300)); + assert_eq!(g.owed(id), 0); + g.cancel(id); + assert_eq!(g.balance(&g.owner), usdc(300)); +} + +#[test] +fn ending_a_whole_award_returns_it_on_close_while_others_continue() { + let g = setup(); + let id = g.create(Spec::new(usdc(2_000), 2).floors(&[(1, usdc(1_000)), (2, usdc(1_000))])); + let (a, b) = (g.someone(), g.someone()); + g.select( + id, + &[(a.clone(), 1, usdc(1_000)), (b.clone(), 2, usdc(1_000))], + ); + + g.forfeit(id, &a, 0, usdc(500)); + g.forfeit(id, &a, 1, usdc(500)); + fails_with( + g.events.try_start_cancel(&id, &g.op()), + Error::AwardsOutstanding, + ); + g.pay(id, &b, 0, usdc(500)); + g.pay(id, &b, 1, usdc(500)); + g.cancel(id); + assert_eq!(g.balance(&b), usdc(1_000)); + assert_eq!(g.balance(&a), 0); + assert_eq!(g.balance(&g.owner), usdc(1_000)); +} + +#[test] +fn a_settled_milestone_cannot_be_settled_again_either_way() { + let g = setup(); + let id = g.create(Spec::new(usdc(900), 3)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(900))]); + g.pay(id, &a, 0, usdc(300)); + g.forfeit(id, &a, 1, usdc(300)); + + fails_with( + g.events.try_forfeit_milestone(&id, &a, &0, &g.op()), + Error::MilestoneAlreadyClaimed, + ); + fails_with( + g.events.try_claim_milestone(&id, &a, &1, &0, &g.op()), + Error::MilestoneAlreadyClaimed, + ); + fails_with( + g.events.try_forfeit_milestone(&id, &a, &1, &g.op()), + Error::MilestoneAlreadyClaimed, + ); +} + +#[test] +fn forfeits_are_signed_by_the_owner_alone() { + let g = setup(); + let manager = g.someone(); + let id = g.create(Spec::new(usdc(900), 3).manager(&manager)); + g.events.accept_manager(&id); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(900))]); + + for signer in [a.clone(), manager.clone(), g.admin.clone()] { + let op = g.op(); + g.sign_only( + &signer, + "forfeit_milestone", + args(&g, (id, a.clone(), 0u32, op.clone())), + ); + fails_auth(g.events.try_forfeit_milestone(&id, &a, &0, &op)); + } + let op = g.op(); + g.sign_only( + &g.owner, + "forfeit_milestone", + args(&g, (id, a.clone(), 0u32, op.clone())), + ); + g.events.forfeit_milestone(&id, &a, &0, &op); + g.restore_auth(); + assert_eq!(g.owed(id), usdc(600)); +} + +#[test] +fn forfeits_check_the_same_things_releases_do() { + let g = setup(); + let id = g.create(Spec::new(usdc(900), 3)); + let a = g.someone(); + fails_with( + g.events.try_forfeit_milestone(&id, &a, &0, &g.op()), + Error::NoSubmissions, + ); + g.select(id, &[(a.clone(), 1, usdc(900))]); + fails_with( + g.events.try_forfeit_milestone(&id, &a, &3, &g.op()), + Error::InvalidMilestone, + ); + fails_with( + g.events.try_forfeit_milestone(&99, &a, &0, &g.op()), + Error::EventNotFound, + ); + let op = g.op(); + g.events.forfeit_milestone(&id, &a, &0, &op); + fails_with( + g.events.try_forfeit_milestone(&id, &a, &1, &op), + Error::OpAlreadySeen, + ); + g.events.pause(); + fails_with( + g.events.try_forfeit_milestone(&id, &a, &1, &g.op()), + Error::Paused, + ); +} + +#[test] +fn only_grants_forfeit() { + let g = setup(); + g.token_admin.mint(&g.owner, &usdc(1_000)); + let mut params = g.params(&Spec::new(usdc(100), 1)); + params.pillar = Pillar::Hackathon; + params.release_kind = ReleaseKind::Single; + let hackathon = g.events.create_event(¶ms, &g.op()); + fails_with( + g.events + .try_forfeit_milestone(&hackathon, &g.someone(), &0, &g.op()), + Error::InvalidPillar, + ); + + let mut params = g.params(&Spec::new(usdc(100), 2)); + params.pillar = Pillar::Crowdfunding; + let campaign = g.events.create_event(¶ms, &g.op()); + fails_with( + g.events + .try_forfeit_milestone(&campaign, &g.owner, &0, &g.op()), + Error::InvalidPillar, + ); +} + +#[test] +fn nothing_settles_once_the_grant_is_closed() { + let g = setup(); + let id = g.create(Spec::new(usdc(100), 1)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(100))]); + g.pay(id, &a, 0, usdc(100)); + fails_with( + g.events.try_forfeit_milestone(&id, &a, &0, &g.op()), + Error::EventNotActive, + ); +} diff --git a/contracts/events/src/tests/grant_scenarios/hardening.rs b/contracts/events/src/tests/grant_scenarios/hardening.rs new file mode 100644 index 0000000..f5abea2 --- /dev/null +++ b/contracts/events/src/tests/grant_scenarios/hardening.rs @@ -0,0 +1,358 @@ +//! Threat-model findings on the grant path. Each test states the behaviour +//! the fix guarantees; the mapping to findings lives in docs/threat-model.md. + +use super::*; +use crate::event_ops::MAX_REPUTATION_BUMP; +use crate::events::{ManagerProposed, PendingManagerCancelled}; + +#[test] +fn one_recipient_cannot_hold_two_awards_in_a_grant() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2).floors(&[(1, usdc(300)), (2, usdc(400))])); + let a = g.someone(); + fails_with( + g.events.try_select_winners( + &id, + &g.specs(&[(a.clone(), 1, usdc(300)), (a.clone(), 2, usdc(400))]), + &g.op(), + ), + Error::DuplicateRecipient, + ); + assert_eq!(g.owed(id), 0); + assert_eq!(g.events.get_winner_count(&id), 0); +} + +#[test] +fn an_award_too_small_to_split_is_refused() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 10).floors(&[(1, 1)])); + fails_with( + g.events + .try_select_winners(&id, &g.specs(&[(g.someone(), 1, 9)]), &g.op()), + Error::InvalidDistribution, + ); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, 10)]); + for m in 0..10 { + g.pay(id, &a, m, 1); + } +} + +#[test] +fn a_release_costs_the_same_however_large_the_grant_grows() { + let g = setup(); + let n = 4u32; + let people: std::vec::Vec
= (0..crate::event_ops::MAX_GRANT_AWARDS) + .map(|_| g.someone()) + .collect(); + let id = g.create(Spec::new(usdc(4_000), n).floors(&[(1, usdc(100))])); + let awards: std::vec::Vec<(Address, u32, i128)> = people + .iter() + .enumerate() + .map(|(i, p)| (p.clone(), i as u32 + 1, usdc(100))) + .collect(); + g.select(id, &awards); + + let mut first = None; + let mut last = None; + for m in 0..n { + for p in people.iter() { + g.events.claim_milestone(&id, p, &m, &0, &g.op()); + let reads = g.env.cost_estimate().resources().memory_read_entries; + first.get_or_insert(reads); + last = Some(reads); + } + } + let (first, last) = (first.unwrap(), last.unwrap()); + assert!( + last <= first + 2, + "the 160th release read {last} entries against {first} for the first" + ); + assert!( + last < 45, + "a release must stay far inside the read limit: {last}" + ); + assert_eq!(g.status(id), EventStatus::Completed); + for p in people.iter() { + assert_eq!(g.balance(p), usdc(100)); + } +} + +#[test] +fn a_paused_profile_does_not_hold_up_payouts() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(1_000))]); + + g.profile.pause(); + g.events.claim_milestone(&id, &a, &0, &10, &g.op()); + assert_eq!(g.balance(&a), usdc(500)); + assert!(g.profile.get_profile(&a).is_none()); + + g.profile.unpause(); + g.events.claim_milestone(&id, &a, &1, &10, &g.op()); + assert_eq!(g.balance(&a), usdc(1_000)); + assert_eq!(g.profile.get_profile(&a).unwrap().reputation, 10); + assert_eq!(g.status(id), EventStatus::Completed); +} + +#[test] +fn a_broken_profile_binding_does_not_hold_up_payouts() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 1)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(1_000))]); + g.events.set_profile_contract(&g.someone()); + g.pay(id, &a, 0, usdc(1_000)); +} + +#[test] +fn someone_reusing_an_op_id_cannot_block_or_strip_another_payout() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(1_000))]); + + let attacker = g.someone(); + g.token_admin.mint(&attacker, &usdc(20)); + let mut params = g.params(&Spec::new(usdc(10), 1)); + params.owner = attacker.clone(); + let own = g.events.create_event(¶ms, &g.op()); + g.events + .select_winners(&own, &g.specs(&[(attacker.clone(), 1, usdc(10))]), &g.op()); + + let shared = g.op(); + g.events.claim_milestone(&own, &attacker, &0, &5, &shared); + g.events.claim_milestone(&id, &a, &0, &5, &shared); + + assert_eq!(g.balance(&a), usdc(500)); + assert_eq!(g.profile.get_profile(&a).unwrap().reputation, 5); + assert_eq!(g.profile.get_earnings(&a, &g.token.address), usdc(500)); +} + +#[test] +fn reputation_per_award_and_per_release_is_capped() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let a = g.someone(); + + let mut specs = g.specs(&[(a.clone(), 1, usdc(1_000))]); + let mut spec = specs.get(0).unwrap(); + spec.reputation_bump = MAX_REPUTATION_BUMP + 1; + specs.set(0, spec.clone()); + fails_with( + g.events.try_select_winners(&id, &specs, &g.op()), + Error::ReputationBumpTooLarge, + ); + spec.reputation_bump = MAX_REPUTATION_BUMP; + specs.set(0, spec); + g.events.select_winners(&id, &specs, &g.op()); + + fails_with( + g.events + .try_claim_milestone(&id, &a, &0, &(MAX_REPUTATION_BUMP + 1), &g.op()), + Error::ReputationBumpTooLarge, + ); + fails_with( + g.events + .try_claim_milestone(&id, &a, &0, &u32::MAX, &g.op()), + Error::ReputationBumpTooLarge, + ); + g.events + .claim_milestone(&id, &a, &0, &MAX_REPUTATION_BUMP, &g.op()); + assert_eq!( + g.profile.get_profile(&a).unwrap().reputation, + MAX_REPUTATION_BUMP as u64 + ); +} + +#[test] +fn an_empty_refund_batch_cannot_burn_the_crank_op_id() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 1)); + let partner = g.someone(); + g.contribute(id, &partner, usdc(10)); + g.events.start_cancel(&id, &g.op()); + + let op = g.op(); + fails_with( + g.events.try_process_cancel_batch(&id, &0, &op), + Error::InvalidBatchSize, + ); + assert_eq!(g.events.process_cancel_batch(&id, &25, &op), 0); + g.events.finalize_cancel(&id, &g.op()); + assert_eq!(g.balance(&partner), usdc(10)); +} + +#[test] +fn replacing_a_pending_manager_is_on_the_record() { + let g = setup(); + let first = g.someone(); + let id = g.create(Spec::new(usdc(1_000), 1).manager(&first)); + let second = g.someone(); + g.events.propose_manager(&id, &second); + + assert!(g.emitted(PendingManagerCancelled { event_id: id })); + let expires = g.events.get_pending_manager(&id).unwrap().expires_at_ledger; + assert!(g.emitted(ManagerProposed { + event_id: id, + target: second, + expires_at_ledger: expires, + })); +} + +#[test] +fn a_frozen_recipient_is_not_marked_paid_and_can_be_paid_later() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(1_000))]); + g.token_admin.set_authorized(&a, &false); + + assert!(g + .events + .try_claim_milestone(&id, &a, &0, &0, &g.op()) + .is_err()); + assert!(!g.milestone_claimed(id, &a, 0)); + assert_eq!(g.owed(id), usdc(1_000)); + assert_eq!(g.event(id).remaining_escrow, usdc(1_000)); + + g.token_admin.set_authorized(&a, &true); + g.pay(id, &a, 0, usdc(500)); +} + +#[test] +fn a_frozen_partner_cannot_stall_everyone_else_s_refund() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let (p1, frozen, p3) = (g.someone(), g.someone(), g.someone()); + g.contribute(id, &p1, usdc(100)); + g.contribute(id, &frozen, usdc(100)); + g.contribute(id, &p3, usdc(100)); + g.token_admin.set_authorized(&frozen, &false); + + g.cancel(id); + assert!(g.emitted(crate::events::RefundDeferred { + event_id: id, + contributor: frozen.clone(), + amount: usdc(100), + })); + assert_eq!(g.balance(&p1), usdc(100)); + assert_eq!(g.balance(&p3), usdc(100)); + assert_eq!(g.balance(&g.owner), usdc(1_000)); + assert_eq!(g.events.get_unclaimed_refund(&id, &frozen), usdc(100)); + assert_eq!(g.escrow_balance(), usdc(100), "held for the frozen partner"); + + assert!(g.events.try_claim_refund(&id, &frozen, &g.op()).is_err()); + g.token_admin.set_authorized(&frozen, &true); + + let op = g.op(); + g.sign_only( + &p1, + "claim_refund", + args(&g, (id, frozen.clone(), op.clone())), + ); + fails_auth(g.events.try_claim_refund(&id, &frozen, &op)); + g.restore_auth(); + + g.events.claim_refund(&id, &frozen, &g.op()); + assert_eq!(g.signers(), std::vec![frozen.clone()]); + assert_eq!(g.balance(&frozen), usdc(100)); + assert_eq!(g.escrow_balance(), 0); + fails_with( + g.events.try_claim_refund(&id, &frozen, &g.op()), + Error::NoRefundOwed, + ); + fails_with( + g.events.try_claim_refund(&id, &p1, &g.op()), + Error::NoRefundOwed, + ); +} + +#[test] +fn each_award_and_each_cancel_branch_is_on_the_record() { + let g = setup(); + let id = g.create(Spec::new(usdc(100), 1)); + let partners = [g.someone(), g.someone(), g.someone()]; + for p in partners.iter() { + g.contribute(id, p, usdc(10)); + } + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(130) - 2)]); + assert!(g.emitted(crate::events::WinnerAwarded { + event_id: id, + recipient: a.clone(), + position: 1, + amount: usdc(130) - 2, + })); + g.pay(id, &a, 0, usdc(130) - 2); + + g.events.start_cancel(&id, &g.op()); + assert!(g.emitted(crate::events::CancellationStarted { + event_id: id, + branch: crate::types::CancellationBranch::ProRataPartners, + remaining: 2, + non_owner_total: usdc(30), + })); + g.finish_cancel(id); + for p in partners.iter() { + assert!(g.emitted(crate::events::ContributorRefunded { + event_id: id, + contributor: p.clone(), + amount: 0, + })); + } + assert_eq!( + g.escrow_balance(), + 2, + "two stroops of dust, each share floored to zero" + ); +} + +#[test] +fn a_partner_who_dropped_their_trustline_cannot_stall_the_others() { + use super::refusing_token::{RefusingToken, RefusingTokenClient}; + + let g = setup(); + let token_id = g.env.register(RefusingToken, ()); + let token = RefusingTokenClient::new(&g.env, &token_id); + g.events.register_supported_token(&token_id); + + let budget = usdc(1_000); + token.mint(&g.owner, &(budget + fee_on(budget, FEE_BPS))); + let mut params = g.params(&Spec::new(budget, 2)); + params.token = token_id.clone(); + let id = g.events.create_event(¶ms, &g.op()); + + let (p1, gone, p3) = (g.someone(), g.someone(), g.someone()); + for p in [&p1, &gone, &p3] { + token.mint(p, &(usdc(100) + fee_on(usdc(100), FEE_BPS))); + g.events.add_funds(&id, p, &usdc(100), &g.op()); + } + token.refuse(&gone, &true); + + g.events.start_cancel(&id, &g.op()); + assert_eq!(g.events.process_cancel_batch(&id, &15, &g.op()), 0); + assert!(g.emitted(crate::events::RefundDeferred { + event_id: id, + contributor: gone.clone(), + amount: usdc(100), + })); + g.events.finalize_cancel(&id, &g.op()); + + assert_eq!(token.balance(&p1), usdc(100)); + assert_eq!(token.balance(&p3), usdc(100)); + assert_eq!(token.balance(&g.owner), budget); + assert_eq!(token.balance(&gone), 0); + assert_eq!(g.events.get_unclaimed_refund(&id, &gone), usdc(100)); + assert_eq!(token.balance(&g.events_id), usdc(100), "held for them"); + + assert!(g.events.try_claim_refund(&id, &gone, &g.op()).is_err()); + assert_eq!(g.events.get_unclaimed_refund(&id, &gone), usdc(100)); + + token.refuse(&gone, &false); + g.events.claim_refund(&id, &gone, &g.op()); + assert_eq!(token.balance(&gone), usdc(100)); + assert_eq!(token.balance(&g.events_id), 0); +} diff --git a/contracts/events/src/tests/grant_scenarios/lifecycle.rs b/contracts/events/src/tests/grant_scenarios/lifecycle.rs new file mode 100644 index 0000000..589ab34 --- /dev/null +++ b/contracts/events/src/tests/grant_scenarios/lifecycle.rs @@ -0,0 +1,184 @@ +//! The grant shapes the organizer wizard offers, run start to finish the way +//! the backend drives them. + +use super::*; + +#[test] +fn micro_grants_five_recipients_paid_in_one_go() { + let g = setup(); + let floors: std::vec::Vec<(u32, i128)> = (1..=5).map(|p| (p, usdc(200))).collect(); + let id = g.create(Spec::new(usdc(1_000), 1).floors(&floors)); + let people: std::vec::Vec
= (0..5).map(|_| g.someone()).collect(); + let awards: std::vec::Vec<(Address, u32, i128)> = people + .iter() + .enumerate() + .map(|(i, p)| (p.clone(), i as u32 + 1, usdc(200))) + .collect(); + g.select(id, &awards); + for p in people.iter() { + g.pay(id, p, 0, usdc(200)); + } + assert_eq!(g.status(id), EventStatus::Completed); + assert_eq!(g.escrow_balance(), 0); +} + +#[test] +fn builder_grant_with_a_rejected_milestone_and_a_returned_remainder() { + let g = setup(); + let id = g.create(Spec::new(usdc(25_000), 3).floors(&[ + (1, usdc(12_000)), + (2, usdc(8_000)), + (3, usdc(5_000)), + ])); + let (a, b, c) = (g.someone(), g.someone(), g.someone()); + g.select( + id, + &[ + (a.clone(), 1, usdc(12_000)), + (b.clone(), 2, usdc(8_000)), + (c.clone(), 3, usdc(5_000)), + ], + ); + let b_part = usdc(8_000) / 3; + let c_part = usdc(5_000) / 3; + for m in 0..3 { + g.pay(id, &a, m, usdc(4_000)); + } + g.pay(id, &b, 0, b_part); + g.pay(id, &b, 1, b_part); + g.pay(id, &b, 2, usdc(8_000) - 2 * b_part); + // c delivers the first milestone, then the organizer rejects the rest + g.pay(id, &c, 0, c_part); + g.forfeit(id, &c, 1, c_part); + g.forfeit(id, &c, 2, usdc(5_000) - 2 * c_part); + + assert_eq!(g.status(id), EventStatus::Active); + assert_eq!(g.owed(id), 0); + g.cancel(id); + assert_eq!(g.balance(&g.owner), usdc(5_000) - c_part); + assert_eq!(g.balance(&a), usdc(12_000)); + assert_eq!(g.balance(&b), usdc(8_000)); + assert_eq!(g.balance(&c), c_part); +} + +#[test] +fn infrastructure_grant_topped_up_by_a_partner_mid_way() { + let g = setup(); + let id = g.create(Spec::new(usdc(100_000), 5)); + let partner = g.someone(); + g.contribute(id, &partner, usdc(20_000)); + + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(110_000))]); + for m in 0..5 { + g.pay(id, &a, m, usdc(22_000)); + } + assert_eq!(g.balance(&a), usdc(110_000)); + assert_eq!(g.event(id).remaining_escrow, usdc(10_000)); + + g.cancel(id); + assert_eq!( + g.balance(&partner), + usdc(10_000), + "partner shares the shortfall" + ); + assert_eq!(g.balance(&g.owner), 0); +} + +#[test] +fn research_grant_awards_above_floors_from_headroom() { + let g = setup(); + let id = g.create(Spec::new(usdc(20_000), 2).floors(&[ + (1, usdc(5_000)), + (2, usdc(5_000)), + (3, usdc(5_000)), + ])); + let people = [g.someone(), g.someone(), g.someone()]; + g.select( + id, + &[ + (people[0].clone(), 1, usdc(7_000)), + (people[1].clone(), 2, usdc(6_500)), + (people[2].clone(), 3, usdc(6_500)), + ], + ); + for p in people.iter() { + let award = if *p == people[0] { + usdc(7_000) + } else { + usdc(6_500) + }; + g.pay(id, p, 1, award / 2); + g.pay(id, p, 0, award - award / 2); + } + assert_eq!(g.status(id), EventStatus::Completed); +} + +#[test] +fn org_treasury_funds_and_the_org_wallet_runs_it() { + let g = setup(); + let org_wallet = g.someone(); + let id = g.create(Spec::new(usdc(6_000), 2).floors(&[ + (1, usdc(1_500)), + (2, usdc(1_500)), + (3, usdc(1_500)), + (4, usdc(1_500)), + ])); + g.events.propose_manager(&id, &org_wallet); + g.events.accept_manager(&id); + + let people: std::vec::Vec
= (0..4).map(|_| g.someone()).collect(); + let awards: std::vec::Vec<(Address, u32, i128)> = people + .iter() + .enumerate() + .map(|(i, p)| (p.clone(), i as u32 + 1, usdc(1_500))) + .collect(); + g.events.select_winners(&id, &g.specs(&awards), &g.op()); + assert_eq!(g.signers(), std::vec![org_wallet.clone()]); + + for p in people.iter().take(3) { + g.pay(id, p, 0, usdc(750)); + g.pay(id, p, 1, usdc(750)); + } + g.pay(id, &people[3], 0, usdc(750)); + fails_with( + g.events.try_start_cancel(&id, &g.op()), + Error::AwardsOutstanding, + ); + g.forfeit(id, &people[3], 1, usdc(750)); + g.events.start_cancel(&id, &g.op()); + assert_eq!(g.signers(), std::vec![org_wallet.clone()]); + assert_eq!(g.balance(&g.owner), usdc(750)); + assert_eq!( + g.balance(&org_wallet), + 0, + "the manager never receives funds" + ); + g.books(); +} + +#[test] +fn many_grants_on_one_contract_keep_separate_books() { + let g = setup(); + let first = g.create(Spec::new(usdc(1_000), 2)); + let second = g.create(Spec::new(usdc(3_000), 3)); + let a = g.someone(); + let b = g.someone(); + g.select(first, &[(a.clone(), 1, usdc(1_000))]); + g.select(second, &[(a.clone(), 1, usdc(3_000))]); + + fails_with( + g.events.try_claim_milestone(&first, &b, &0, &0, &g.op()), + Error::NoSubmissions, + ); + g.pay(first, &a, 0, usdc(500)); + g.pay(second, &a, 0, usdc(1_000)); + g.forfeit(first, &a, 1, usdc(500)); + g.cancel(first); + assert_eq!(g.event(second).remaining_escrow, usdc(2_000)); + g.pay(second, &a, 1, usdc(1_000)); + g.pay(second, &a, 2, usdc(1_000)); + assert_eq!(g.balance(&a), usdc(3_500)); + assert_eq!(g.balance(&g.owner), usdc(500)); + assert_eq!(g.escrow_balance(), 0); +} diff --git a/contracts/events/src/tests/grant_scenarios/limits.rs b/contracts/events/src/tests/grant_scenarios/limits.rs new file mode 100644 index 0000000..d60916d --- /dev/null +++ b/contracts/events/src/tests/grant_scenarios/limits.rs @@ -0,0 +1,130 @@ +//! The test host enforces mainnet's per-transaction limits, so each scenario +//! here proves the largest call the contract accepts still fits on chain. + +use super::*; +use crate::event_ops::{ + MAX_AWARDS_PER_SELECT, MAX_GRANT_AWARDS, MAX_REFUNDS_PER_BATCH, VIEW_PAGE_LIMIT, +}; + +#[test] +fn the_largest_grant_selects_and_releases_every_milestone() { + let g = setup(); + let n = 10u32; + let people: std::vec::Vec
= (0..MAX_GRANT_AWARDS).map(|_| g.someone()).collect(); + let award = usdc(10) + 3; + let budget = award * MAX_GRANT_AWARDS as i128; + let id = g.create(Spec::new(budget, n).floors(&[(1, award)])); + let awards: std::vec::Vec<(Address, u32, i128)> = people + .iter() + .enumerate() + .map(|(i, p)| (p.clone(), i as u32 + 1, award)) + .collect(); + g.select(id, &awards); + + let mut heaviest = 0; + for m in 0..n { + for p in people.iter() { + g.events.claim_milestone(&id, p, &m, &5, &g.op()); + let r = g.env.cost_estimate().resources(); + heaviest = heaviest.max(r.memory_read_entries + r.write_entries); + } + } + assert!( + heaviest <= 60, + "heaviest release touched {heaviest} entries" + ); + for p in people.iter() { + assert_eq!(g.balance(p), award); + } + assert_eq!(g.status(id), EventStatus::Completed); + g.books(); +} + +#[test] +fn a_full_single_release_batch_fits() { + let g = setup(); + g.token_admin.mint(&g.owner, &usdc(1_000)); + let mut params = g.params(&Spec::new(usdc(100), 1).floors(&[(1, 1)])); + params.pillar = Pillar::Hackathon; + params.release_kind = ReleaseKind::Single; + let id = g.events.create_event(¶ms, &g.op()); + + let mut awards: std::vec::Vec<(Address, u32, i128)> = (1..=MAX_AWARDS_PER_SELECT + 1) + .map(|p| (g.someone(), p, usdc(1))) + .collect(); + fails_with( + g.events.try_select_winners(&id, &g.specs(&awards), &g.op()), + Error::InvalidWinnerPosition, + ); + awards.pop(); + g.events.select_winners(&id, &g.specs(&awards), &g.op()); + + let next: std::vec::Vec<(Address, u32, i128)> = (MAX_AWARDS_PER_SELECT + 1 + ..=2 * MAX_AWARDS_PER_SELECT) + .map(|p| (g.someone(), p, usdc(1))) + .collect(); + g.events.select_winners(&id, &g.specs(&next), &g.op()); + assert_eq!(g.events.get_winner_count(&id), 2 * MAX_AWARDS_PER_SELECT); +} + +#[test] +fn a_full_refund_batch_fits() { + let g = setup(); + let id = g.create(Spec::new(usdc(100), 1)); + let partners: std::vec::Vec
= + (0..MAX_REFUNDS_PER_BATCH).map(|_| g.someone()).collect(); + for p in partners.iter() { + g.contribute(id, p, usdc(10)); + } + g.events.start_cancel(&id, &g.op()); + assert_eq!( + g.events + .process_cancel_batch(&id, &MAX_REFUNDS_PER_BATCH, &g.op()), + 0 + ); + g.events.finalize_cancel(&id, &g.op()); + for p in partners.iter() { + assert_eq!(g.balance(p), usdc(10)); + } +} + +#[test] +fn a_full_page_of_winners_can_be_read() { + let g = setup(); + let people: std::vec::Vec
= (0..MAX_GRANT_AWARDS).map(|_| g.someone()).collect(); + let id = g.create(Spec::new(usdc(400), 3).floors(&[(1, usdc(10))])); + let awards: std::vec::Vec<(Address, u32, i128)> = people + .iter() + .enumerate() + .map(|(i, p)| (p.clone(), i as u32 + 1, usdc(10))) + .collect(); + g.select(id, &awards); + for m in 0..3 { + for p in people.iter() { + g.events.claim_milestone(&id, p, &m, &0, &g.op()); + } + } + let rows = g.events.get_winner_count(&id); + assert_eq!(rows, 4 * MAX_GRANT_AWARDS); + + let page = g.events.get_winners_page(&id, &0, &VIEW_PAGE_LIMIT); + assert_eq!(page.len(), VIEW_PAGE_LIMIT); + let all = g.events.get_winners(&id); + assert_eq!(all.len(), VIEW_PAGE_LIMIT); + let tail = g + .events + .get_winners_page(&id, &(rows - 5), &VIEW_PAGE_LIMIT); + assert_eq!(tail.len(), 5); +} + +#[test] +fn a_full_page_of_contributors_can_be_read() { + let g = setup(); + let id = g.create(Spec::new(usdc(100), 1)); + for _ in 0..VIEW_PAGE_LIMIT + 5 { + g.contribute(id, &g.someone(), usdc(10)); + } + let page = g.events.get_contributors_page(&id, &0, &VIEW_PAGE_LIMIT); + assert_eq!(page.len(), VIEW_PAGE_LIMIT); + assert_eq!(g.events.get_contributors(&id).len(), VIEW_PAGE_LIMIT); +} diff --git a/contracts/events/src/tests/grant_scenarios/mod.rs b/contracts/events/src/tests/grant_scenarios/mod.rs new file mode 100644 index 0000000..f7aed3c --- /dev/null +++ b/contracts/events/src/tests/grant_scenarios/mod.rs @@ -0,0 +1,469 @@ +#![cfg(test)] + +//! Grant lifecycle scenarios, end to end against a real profile contract and +//! a Stellar asset contract. Every helper that moves money asserts the exact +//! token deltas, and `books` checks the escrow invariants after a step. + +extern crate std; + +mod auth; +mod cancel; +mod claims; +mod contributions; +mod create; +mod forfeits; +mod hardening; +mod lifecycle; +mod limits; +mod pause; +mod randomized; +mod refusing_token; +mod selection; + +use soroban_sdk::{ + testutils::{ + Address as _, BytesN as _, EnvTestConfig, Events as _, IssuerFlags, MockAuth, + MockAuthInvoke, + }, + token, xdr, Address, BytesN, Env, Event, IntoVal, Map, String, Val, Vec, +}; + +use crate::errors::Error; +use crate::storage; +use crate::types::{CreateEventParams, EventRecord, EventStatus, Pillar, ReleaseKind, WinnerSpec}; +use crate::{EventsContract, EventsContractClient}; +use boundless_profile::{ProfileContract, ProfileContractClient}; + +pub const FEE_BPS: u32 = 250; +pub const USDC: i128 = 10_000_000; + +pub fn usdc(units: i128) -> i128 { + units * USDC +} + +pub fn fee_on(amount: i128, bps: u32) -> i128 { + amount * bps as i128 / 10_000 +} + +pub struct G<'a> { + pub env: Env, + pub events: EventsContractClient<'a>, + pub events_id: Address, + pub profile: ProfileContractClient<'a>, + pub admin: Address, + pub fee_account: Address, + pub token: token::Client<'a>, + pub token_admin: token::StellarAssetClient<'a>, + pub owner: Address, + pub ids: std::cell::RefCell>, + pub log: std::cell::RefCell>, +} + +pub fn setup<'a>() -> G<'a> { + let env = Env::new_with_config(EnvTestConfig { + capture_snapshot_at_drop: false, + }); + env.mock_all_auths_allowing_non_root_auth(); + + let profile_admin = Address::generate(&env); + let profile_id = env.register(ProfileContract, (profile_admin,)); + let profile = ProfileContractClient::new(&env, &profile_id); + + let admin = Address::generate(&env); + let fee_account = Address::generate(&env); + let events_id = env.register( + EventsContract, + ( + admin.clone(), + fee_account.clone(), + FEE_BPS, + profile_id.clone(), + ), + ); + let events = EventsContractClient::new(&env, &events_id); + profile.set_events_contract(&events_id); + + let sac = env.register_stellar_asset_contract_v2(Address::generate(&env)); + sac.issuer().set_flag(IssuerFlags::RevocableFlag); + let token = token::Client::new(&env, &sac.address()); + let token_admin = token::StellarAssetClient::new(&env, &sac.address()); + events.register_supported_token(&sac.address()); + + let owner = Address::generate(&env); + + G { + env, + events, + events_id, + profile, + admin, + fee_account, + token, + token_admin, + owner, + ids: std::cell::RefCell::new(std::vec::Vec::new()), + log: std::cell::RefCell::new(std::vec::Vec::new()), + } +} + +pub struct Spec { + pub budget: i128, + pub milestones: u32, + pub floors: std::vec::Vec<(u32, i128)>, + pub fee_bps_override: Option, + pub manager: Option
, +} + +impl Spec { + pub fn new(budget: i128, milestones: u32) -> Self { + Spec { + budget, + milestones, + floors: std::vec![(1, budget)], + fee_bps_override: None, + manager: None, + } + } + + pub fn floors(mut self, floors: &[(u32, i128)]) -> Self { + self.floors = floors.to_vec(); + self + } + + pub fn fee_override(mut self, bps: u32) -> Self { + self.fee_bps_override = Some(bps); + self + } + + pub fn manager(mut self, manager: &Address) -> Self { + self.manager = Some(manager.clone()); + self + } +} + +impl<'a> G<'a> { + pub fn op(&self) -> BytesN<32> { + BytesN::random(&self.env) + } + + pub fn someone(&self) -> Address { + Address::generate(&self.env) + } + + pub fn balance(&self, who: &Address) -> i128 { + self.token.balance(who) + } + + pub fn escrow_balance(&self) -> i128 { + self.token.balance(&self.events_id) + } + + pub fn params(&self, spec: &Spec) -> CreateEventParams { + let mut floors = Map::new(&self.env); + for (position, floor) in spec.floors.iter() { + floors.set(*position, *floor); + } + CreateEventParams { + pillar: Pillar::Grant, + owner: self.owner.clone(), + token: self.token.address.clone(), + total_budget: spec.budget, + release_kind: ReleaseKind::Multi(spec.milestones), + content_uri: String::from_str(&self.env, "https://api.boundless.fi/grants/x/content"), + title: String::from_str(&self.env, "Community grants"), + deadline: Some(self.env.ledger().timestamp() + 30 * 86_400), + prize_floors: floors, + fee_bps_override: spec.fee_bps_override, + manager: spec.manager.clone(), + } + } + + /// Mints exactly budget + fee to the owner, publishes, and checks that the + /// owner is drained, escrow holds the budget and the fee account the fee. + pub fn create(&self, spec: Spec) -> u64 { + let bps = spec.fee_bps_override.unwrap_or(self.events.get_fee_bps()); + let fee = fee_on(spec.budget, bps); + self.token_admin.mint(&self.owner, &(spec.budget + fee)); + let owner_before = self.balance(&self.owner); + let fee_before = self.balance(&self.fee_account); + let escrow_before = self.escrow_balance(); + + let id = self.events.create_event(&self.params(&spec), &self.op()); + self.capture(); + + assert_eq!(owner_before - self.balance(&self.owner), spec.budget + fee); + assert_eq!(self.balance(&self.fee_account) - fee_before, fee); + assert_eq!(self.escrow_balance() - escrow_before, spec.budget); + let event = self.events.get_event(&id); + assert_eq!(event.remaining_escrow, spec.budget); + assert_eq!(event.status, EventStatus::Active); + self.ids.borrow_mut().push(id); + self.books(); + id + } + + pub fn select(&self, id: u64, awards: &[(Address, u32, i128)]) { + let escrow_before = self.escrow_balance(); + let owed_before = self.owed(id); + self.events + .select_winners(&id, &self.specs(awards), &self.op()); + self.capture(); + assert_eq!( + self.escrow_balance(), + escrow_before, + "selection moves no tokens" + ); + let total: i128 = awards.iter().map(|(_, _, a)| *a).sum(); + assert_eq!(self.owed(id), owed_before + total); + self.books(); + } + + pub fn specs(&self, awards: &[(Address, u32, i128)]) -> Vec { + let mut specs = Vec::new(&self.env); + for (recipient, position, amount) in awards.iter() { + specs.push_back(WinnerSpec { + recipient: recipient.clone(), + position: *position, + amount: *amount, + reputation_bump: 0, + }); + } + specs + } + + /// Releases one milestone and asserts the recipient receives exactly + /// `expected`, with no fee and matching drops in escrow and owed. + pub fn pay(&self, id: u64, recipient: &Address, milestone: u32, expected: i128) { + let before = self.balance(recipient); + let fee_before = self.balance(&self.fee_account); + let event_before = self.events.get_event(&id); + let owed_before = self.owed(id); + + self.events + .claim_milestone(&id, recipient, &milestone, &5, &self.op()); + self.capture(); + + assert_eq!( + self.balance(recipient) - before, + expected, + "milestone payout" + ); + assert_eq!( + self.balance(&self.fee_account), + fee_before, + "grant payouts carry no fee" + ); + let event = self.events.get_event(&id); + assert_eq!( + event_before.remaining_escrow - event.remaining_escrow, + expected + ); + assert_eq!(owed_before - self.owed(id), expected); + assert!(self.milestone_claimed(id, recipient, milestone)); + self.books(); + } + + /// Forfeits one milestone: nothing moves, and its share stops being owed. + pub fn forfeit(&self, id: u64, recipient: &Address, milestone: u32, expected: i128) { + let before = self.balance(recipient); + let escrow_before = self.escrow_balance(); + let remaining_before = self.events.get_event(&id).remaining_escrow; + let owed_before = self.owed(id); + + self.events + .forfeit_milestone(&id, recipient, &milestone, &self.op()); + self.capture(); + + assert_eq!(self.balance(recipient), before, "a forfeit pays nothing"); + assert_eq!(self.escrow_balance(), escrow_before); + assert_eq!( + self.events.get_event(&id).remaining_escrow, + remaining_before + ); + assert_eq!(owed_before - self.owed(id), expected, "forfeited share"); + assert!(self.milestone_claimed(id, recipient, milestone)); + self.books(); + } + + /// Partner top-up: mints amount + fee and checks the fee lands on top. + pub fn contribute(&self, id: u64, from: &Address, amount: i128) { + let bps = self + .events + .get_event(&id) + .fee_bps_override + .unwrap_or(self.events.get_fee_bps()); + let fee = fee_on(amount, bps); + self.token_admin.mint(from, &(amount + fee)); + let from_before = self.balance(from); + let fee_before = self.balance(&self.fee_account); + let remaining_before = self.events.get_event(&id).remaining_escrow; + + self.events.add_funds(&id, from, &amount, &self.op()); + self.capture(); + + assert_eq!( + from_before - self.balance(from), + amount + fee, + "fee is on top" + ); + assert_eq!(self.balance(&self.fee_account) - fee_before, fee); + assert_eq!( + self.events.get_event(&id).remaining_escrow - remaining_before, + amount + ); + self.books(); + } + + pub fn cancel(&self, id: u64) { + self.events.start_cancel(&id, &self.op()); + self.capture(); + if self.status(id) == EventStatus::Cancelling { + self.finish_cancel(id); + } + let event = self.events.get_event(&id); + assert_eq!(event.status, EventStatus::Cancelled); + assert_eq!(event.remaining_escrow, 0); + assert_eq!(self.owed(id), 0); + self.books(); + } + + /// Cranks and finalizes a cancel that `start_cancel` left in Cancelling. + pub fn finish_cancel(&self, id: u64) { + loop { + let left = self.events.process_cancel_batch( + &id, + &crate::event_ops::MAX_REFUNDS_PER_BATCH, + &self.op(), + ); + self.capture(); + if left == 0 { + break; + } + } + self.events.finalize_cancel(&id, &self.op()); + self.capture(); + assert_eq!(self.status(id), EventStatus::Cancelled); + self.books(); + } + + pub fn event(&self, id: u64) -> EventRecord { + self.events.get_event(&id) + } + + pub fn status(&self, id: u64) -> EventStatus { + self.events.get_event(&id).status + } + + pub fn owed(&self, id: u64) -> i128 { + self.env + .as_contract(&self.events_id, || storage::owed_total(&self.env, id)) + } + + pub fn milestone_claimed(&self, id: u64, recipient: &Address, milestone: u32) -> bool { + self.env.as_contract(&self.events_id, || { + storage::is_milestone_claimed(&self.env, id, recipient, milestone) + }) + } + + /// Escrow invariants across every grant this context created: the contract + /// holds at least what the records say it holds, nothing is owed beyond + /// what remains, and a closed grant owes nothing. + pub fn books(&self) { + let mut accounted: i128 = 0; + for id in self.ids.borrow().iter() { + let event = self.events.get_event(id); + let owed = self.owed(*id); + assert!(event.remaining_escrow >= 0, "grant {id}: negative escrow"); + assert!(owed >= 0, "grant {id}: negative owed"); + assert!( + owed <= event.remaining_escrow, + "grant {id}: owes {owed} with only {} in escrow", + event.remaining_escrow + ); + if matches!( + event.status, + EventStatus::Completed | EventStatus::Cancelled + ) { + assert_eq!( + event.remaining_escrow, 0, + "grant {id}: closed with escrow left" + ); + assert_eq!(owed, 0, "grant {id}: closed while still owing"); + } + accounted += event.remaining_escrow; + } + assert!( + self.escrow_balance() >= accounted, + "contract holds {} but records account for {accounted}", + self.escrow_balance() + ); + } + + /// Only `who` signs the next call to `fn_name` with exactly `args`. + pub fn sign_only(&self, who: &Address, fn_name: &str, args: Vec) { + self.env.mock_auths(&[MockAuth { + address: who, + invoke: &MockAuthInvoke { + contract: &self.events_id, + fn_name, + args, + sub_invokes: &[], + }, + }]); + } + + pub fn restore_auth(&self) { + self.env.mock_all_auths_allowing_non_root_auth(); + } + + /// Addresses that authorized the last top-level invocation. + pub fn signers(&self) -> std::vec::Vec
{ + self.env + .auths() + .into_iter() + .map(|(address, _)| address) + .collect() + } + + /// Keeps the events of the call just made; `events().all()` only ever + /// holds the last invocation's. + pub fn capture(&self) { + let all = self.env.events().all(); + let ours = all.filter_by_contract(&self.events_id); + self.log.borrow_mut().extend(ours.events().iter().cloned()); + } + + /// Whether `event` was emitted by any captured call or the last one. + pub fn emitted(&self, event: E) -> bool { + self.capture(); + let wanted = event.to_xdr(&self.env, &self.events_id); + self.log.borrow().contains(&wanted) + } +} + +pub fn args>>(g: &G, value: T) -> Vec { + value.into_val(&g.env) +} + +/// Asserts a `try_` call failed with exactly this contract error. +#[track_caller] +pub fn fails_with( + result: Result, Result>, + expected: Error, +) { + match result { + Err(Ok(actual)) => assert_eq!(actual, expected), + other => panic!("expected {expected:?}, got {other:?}"), + } +} + +/// Asserts a `try_` call was rejected by the host's auth check. +#[track_caller] +pub fn fails_auth( + result: Result, Result>, +) { + match result { + Err(Err(_)) => {} + other => panic!("expected an auth failure, got {other:?}"), + } +} diff --git a/contracts/events/src/tests/grant_scenarios/pause.rs b/contracts/events/src/tests/grant_scenarios/pause.rs new file mode 100644 index 0000000..e30c1a2 --- /dev/null +++ b/contracts/events/src/tests/grant_scenarios/pause.rs @@ -0,0 +1,87 @@ +use super::*; + +#[test] +fn pause_stops_every_grant_operation_and_unpause_resumes_them() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2)); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(1_000))]); + g.pay(id, &a, 0, usdc(500)); + let partner = g.someone(); + g.token_admin.mint(&partner, &usdc(100)); + g.token_admin.mint(&g.owner, &usdc(2_000)); + let manager = g.someone(); + + g.events.pause(); + assert!(g.events.is_paused()); + + fails_with( + g.events + .try_create_event(&g.params(&Spec::new(usdc(1_000), 2)), &g.op()), + Error::Paused, + ); + fails_with( + g.events.try_add_funds(&id, &partner, &usdc(10), &g.op()), + Error::Paused, + ); + fails_with( + g.events + .try_select_winners(&id, &g.specs(&[(g.someone(), 2, usdc(1))]), &g.op()), + Error::Paused, + ); + fails_with( + g.events.try_claim_milestone(&id, &a, &1, &0, &g.op()), + Error::Paused, + ); + fails_with(g.events.try_start_cancel(&id, &g.op()), Error::Paused); + fails_with( + g.events.try_process_cancel_batch(&id, &25, &g.op()), + Error::Paused, + ); + fails_with(g.events.try_finalize_cancel(&id, &g.op()), Error::Paused); + fails_with(g.events.try_propose_manager(&id, &manager), Error::Paused); + fails_with(g.events.try_accept_manager(&id), Error::Paused); + fails_with(g.events.try_cancel_pending_manager(&id), Error::Paused); + + // reads keep working for the indexer and the UI + assert_eq!(g.event(id).remaining_escrow, usdc(500)); + assert_eq!(g.events.get_winner_count(&id), 2); + + g.events.unpause(); + g.pay(id, &a, 1, usdc(500)); + assert_eq!(g.status(id), EventStatus::Completed); +} + +#[test] +fn a_cancel_paused_halfway_finishes_after_unpause() { + let g = setup(); + let id = g.create(Spec::new(usdc(100), 1)); + let partners: std::vec::Vec
= (0..30).map(|_| g.someone()).collect(); + for p in partners.iter() { + g.contribute(id, p, usdc(10)); + } + g.events.start_cancel(&id, &g.op()); + g.events.process_cancel_batch(&id, &25, &g.op()); + + g.events.pause(); + fails_with( + g.events.try_process_cancel_batch(&id, &25, &g.op()), + Error::Paused, + ); + g.events.unpause(); + + g.finish_cancel(id); + for p in partners.iter() { + assert_eq!(g.balance(p), usdc(10)); + } + assert_eq!(g.balance(&g.owner), usdc(100)); +} + +#[test] +fn only_the_admin_pauses() { + let g = setup(); + g.sign_only(&g.owner, "pause", args(&g, ())); + fails_auth(g.events.try_pause()); + g.restore_auth(); + assert!(!g.events.is_paused()); +} diff --git a/contracts/events/src/tests/grant_scenarios/randomized.rs b/contracts/events/src/tests/grant_scenarios/randomized.rs new file mode 100644 index 0000000..e4eb505 --- /dev/null +++ b/contracts/events/src/tests/grant_scenarios/randomized.rs @@ -0,0 +1,185 @@ +//! Seeded random grants: budgets, milestone counts, tiers, partner money +//! before and after selection, releases and forfeits in any order, then the +//! remainder returned. Every token is accounted for at the end. `GRANT_SCENARIO_RUNS=` runs more seeds. + +use super::*; + +struct Rng(u64); + +impl Rng { + fn next(&mut self) -> u64 { + self.0 = self + .0 + .wrapping_mul(6_364_136_223_846_793_005) + .wrapping_add(1_442_695_040_888_963_407); + self.0 >> 33 + } + + fn below(&mut self, n: u64) -> u64 { + self.next() % n + } + + fn chance(&mut self, percent: u64) -> bool { + self.below(100) < percent + } +} + +fn runs() -> u64 { + std::env::var("GRANT_SCENARIO_RUNS") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(48) +} + +#[test] +fn random_grants_account_for_every_token() { + for seed in 0..runs() { + run(seed); + } +} + +fn run(seed: u64) { + let mut rng = Rng(seed.wrapping_mul(0x9E37_79B9_7F4A_7C15) ^ 0xD1B5_4A32_D192_ED03); + let g = setup(); + + let budget = usdc(2_000 + rng.below(10_000) as i128) + rng.below(USDC as u64) as i128; + let n = 1 + rng.below(10) as u32; + let k = 1 + rng.below(8) as usize; + + let early: std::vec::Vec<(Address, i128)> = (0..rng.below(4)) + .map(|_| (g.someone(), usdc(10 + rng.below(500) as i128))) + .collect(); + let pool = budget + early.iter().map(|(_, a)| a).sum::(); + + let share = pool * (50 + rng.below(51) as i128) / 100; + let weights: std::vec::Vec = (0..k).map(|_| 1 + rng.below(100) as i128).collect(); + let weight_sum: i128 = weights.iter().sum(); + let people: std::vec::Vec
= (0..k).map(|_| g.someone()).collect(); + let awards: std::vec::Vec = weights + .iter() + .map(|w| (share * w / weight_sum).max(n as i128)) + .collect(); + assert!( + awards.iter().sum::() <= pool, + "seed {seed}: plan exceeds pool" + ); + + let floors: std::vec::Vec<(u32, i128)> = awards + .iter() + .enumerate() + .map(|(i, a)| (i as u32 + 1, (a / 4).max(1))) + .collect(); + let id = g.create(Spec::new(budget, n).floors(&floors)); + for (partner, amount) in early.iter() { + g.contribute(id, partner, *amount); + } + + let selection: std::vec::Vec<(Address, u32, i128)> = people + .iter() + .zip(awards.iter()) + .enumerate() + .map(|(i, (p, a))| (p.clone(), i as u32 + 1, *a)) + .collect(); + g.select(id, &selection); + + let mut queue: std::vec::Vec<(usize, u32, bool)> = (0..k) + .flat_map(|r| (0..n).map(move |m| (r, m))) + .map(|(r, m)| (r, m, rng.chance(15))) + .collect(); + for i in (1..queue.len()).rev() { + let j = rng.below(i as u64 + 1) as usize; + queue.swap(i, j); + } + + let mut late: std::vec::Vec<(Address, i128)> = std::vec::Vec::new(); + let mut paid = std::vec![0i128; k]; + let mut settled = std::vec![0i128; k]; + let mut count = std::vec![0u32; k]; + for (step, (r, m, forfeit)) in queue.iter().enumerate() { + if late.len() < 2 && step == queue.len() / 2 && rng.chance(50) { + let partner = g.someone(); + let amount = usdc(10 + rng.below(200) as i128); + g.contribute(id, &partner, amount); + late.push((partner, amount)); + } + count[*r] += 1; + let expected = if count[*r] == n { + awards[*r] - settled[*r] + } else { + awards[*r] / n as i128 + }; + if *forfeit { + g.forfeit(id, &people[*r], *m, expected); + } else { + g.pay(id, &people[*r], *m, expected); + paid[*r] += expected; + } + settled[*r] += expected; + } + + assert_eq!(g.owed(id), 0, "seed {seed}: every award settled"); + for r in 0..k { + assert_eq!(g.balance(&people[r]), paid[r], "seed {seed}: recipient {r}"); + assert_eq!(settled[r], awards[r], "seed {seed}: award settled in full"); + } + + let partners: std::vec::Vec<(Address, i128)> = + early.iter().chain(late.iter()).cloned().collect(); + let partner_total: i128 = partners.iter().map(|(_, a)| a).sum(); + let remaining = g.event(id).remaining_escrow; + assert_eq!( + remaining, + pool + late.iter().map(|(_, a)| a).sum::() - paid.iter().sum::(), + "seed {seed}: escrow tracks deposits minus payouts" + ); + + let mut dust = 0; + if g.status(id) == EventStatus::Completed { + assert_eq!(remaining, 0); + } else { + g.cancel(id); + let owner_refund = if partner_total == 0 { + remaining + } else if remaining >= partner_total { + for (p, a) in partners.iter() { + assert_eq!(g.balance(p), *a, "seed {seed}: partner refunded in full"); + } + remaining - partner_total + } else { + let mut refunded = 0; + for (p, a) in partners.iter() { + let share = a * remaining / partner_total; + assert_eq!(g.balance(p), share, "seed {seed}: partner pro rata"); + refunded += share; + } + dust = remaining - refunded; + 0 + }; + assert_eq!( + g.balance(&g.owner), + owner_refund, + "seed {seed}: owner refund" + ); + } + + assert_eq!( + g.escrow_balance(), + dust, + "seed {seed}: contract keeps only dust" + ); + let deposits = budget + partner_total; + let fees = fee_on(budget, FEE_BPS) + + partners + .iter() + .map(|(_, a)| fee_on(*a, FEE_BPS)) + .sum::(); + assert_eq!(g.balance(&g.fee_account), fees, "seed {seed}: fees"); + let out = paid.iter().sum::() + + g.balance(&g.owner) + + partners.iter().map(|(p, _)| g.balance(p)).sum::() + + dust; + assert_eq!( + out, deposits, + "seed {seed}: every deposited token is accounted for" + ); +} diff --git a/contracts/events/src/tests/grant_scenarios/refusing_token.rs b/contracts/events/src/tests/grant_scenarios/refusing_token.rs new file mode 100644 index 0000000..ac4df3e --- /dev/null +++ b/contracts/events/src/tests/grant_scenarios/refusing_token.rs @@ -0,0 +1,72 @@ +//! A token whose transfers to a chosen address fail, the way a transfer to an +//! account that removed its trustline does. The Stellar asset contract in the +//! test host has no way to drop a trustline, so this stands in for it. + +use soroban_sdk::{contract, contracterror, contractimpl, contracttype, Address, Env}; + +#[contracterror] +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +#[repr(u32)] +pub enum RefusingTokenError { + NoTrustline = 1, + InsufficientBalance = 2, +} + +#[contracttype] +enum Key { + Balance(Address), + Refuses(Address), +} + +#[contract] +pub struct RefusingToken; + +#[contractimpl] +impl RefusingToken { + pub fn mint(env: Env, to: Address, amount: i128) { + let balance = Self::balance(env.clone(), to.clone()); + env.storage() + .persistent() + .set(&Key::Balance(to), &(balance + amount)); + } + + pub fn refuse(env: Env, who: Address, refuses: bool) { + env.storage().persistent().set(&Key::Refuses(who), &refuses); + } + + pub fn balance(env: Env, id: Address) -> i128 { + env.storage() + .persistent() + .get(&Key::Balance(id)) + .unwrap_or(0) + } + + pub fn transfer( + env: Env, + from: Address, + to: Address, + amount: i128, + ) -> Result<(), RefusingTokenError> { + from.require_auth(); + let refuses: bool = env + .storage() + .persistent() + .get(&Key::Refuses(to.clone())) + .unwrap_or(false); + if refuses { + return Err(RefusingTokenError::NoTrustline); + } + let from_balance = Self::balance(env.clone(), from.clone()); + if from_balance < amount { + return Err(RefusingTokenError::InsufficientBalance); + } + env.storage() + .persistent() + .set(&Key::Balance(from), &(from_balance - amount)); + let to_balance = Self::balance(env.clone(), to.clone()); + env.storage() + .persistent() + .set(&Key::Balance(to), &(to_balance + amount)); + Ok(()) + } +} diff --git a/contracts/events/src/tests/grant_scenarios/selection.rs b/contracts/events/src/tests/grant_scenarios/selection.rs new file mode 100644 index 0000000..da2cc22 --- /dev/null +++ b/contracts/events/src/tests/grant_scenarios/selection.rs @@ -0,0 +1,238 @@ +use super::*; +use crate::events::WinnersSelected; + +#[test] +fn selection_reserves_each_award_and_moves_nothing() { + let g = setup(); + let id = g.create(Spec::new(usdc(25_000), 3).floors(&[ + (1, usdc(12_000)), + (2, usdc(8_000)), + (3, usdc(5_000)), + ])); + let (a, b, c) = (g.someone(), g.someone(), g.someone()); + + g.select( + id, + &[ + (a.clone(), 1, usdc(12_000)), + (b.clone(), 2, usdc(8_000)), + (c.clone(), 3, usdc(5_000)), + ], + ); + + assert_eq!(g.owed(id), usdc(25_000)); + assert_eq!(g.events.get_winner_count(&id), 3); + let row = g.events.get_winner_at(&id, &1).unwrap(); + assert_eq!(row.recipient, b); + assert_eq!(row.amount, usdc(8_000)); + assert_eq!(row.milestone, None); + assert_eq!(row.paid_at, None); + assert!(g.emitted(WinnersSelected { + event_id: id, + count: 3 + })); +} + +#[test] +fn award_may_exceed_its_floor_out_of_headroom() { + let g = setup(); + let id = g.create(Spec::new(usdc(20_000), 2).floors(&[(1, usdc(5_000)), (2, usdc(5_000))])); + let (a, b) = (g.someone(), g.someone()); + g.select(id, &[(a, 1, usdc(12_000)), (b, 2, usdc(8_000))]); + assert_eq!(g.owed(id), usdc(20_000)); +} + +#[test] +fn position_without_a_floor_takes_any_positive_amount() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 1).floors(&[(1, usdc(500))])); + let (a, b) = (g.someone(), g.someone()); + g.select(id, &[(a, 1, usdc(500)), (b, 7, usdc(500))]); +} + +#[test] +fn award_below_its_floor_is_refused() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2).floors(&[(1, usdc(600))])); + let a = g.someone(); + fails_with( + g.events + .try_select_winners(&id, &g.specs(&[(a, 1, usdc(599))]), &g.op()), + Error::InvalidDistribution, + ); + assert_eq!(g.owed(id), 0); +} + +#[test] +fn zero_or_negative_award_is_refused() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 1).floors(&[(1, usdc(1))])); + for amount in [0, -usdc(1)] { + fails_with( + g.events + .try_select_winners(&id, &g.specs(&[(g.someone(), 5, amount)]), &g.op()), + Error::InvalidDistribution, + ); + } +} + +#[test] +fn awards_beyond_the_escrow_are_refused() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2).floors(&[(1, usdc(500))])); + let (a, b) = (g.someone(), g.someone()); + fails_with( + g.events.try_select_winners( + &id, + &g.specs(&[(a.clone(), 1, usdc(600)), (b.clone(), 2, usdc(401))]), + &g.op(), + ), + Error::InsufficientEscrow, + ); + g.select(id, &[(a, 1, usdc(600)), (b, 2, usdc(400))]); +} + +#[test] +fn awards_overflowing_i128_are_refused_not_wrapped() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 1).floors(&[(1, usdc(1))])); + fails_with( + g.events.try_select_winners( + &id, + &g.specs(&[(g.someone(), 1, i128::MAX), (g.someone(), 2, i128::MAX)]), + &g.op(), + ), + Error::InsufficientEscrow, + ); +} + +#[test] +fn empty_selection_is_refused() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 1)); + fails_with( + g.events.try_select_winners(&id, &g.specs(&[]), &g.op()), + Error::NoSubmissions, + ); +} + +#[test] +fn duplicate_position_is_refused() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 1).floors(&[(1, usdc(100))])); + fails_with( + g.events.try_select_winners( + &id, + &g.specs(&[(g.someone(), 1, usdc(100)), (g.someone(), 1, usdc(100))]), + &g.op(), + ), + Error::DuplicateWinnerPosition, + ); +} + +#[test] +fn a_grant_takes_up_to_the_award_cap_in_its_one_selection() { + let g = setup(); + let cap = crate::event_ops::MAX_GRANT_AWARDS; + let id = g.create(Spec::new(usdc(cap as i128 + 1), 1).floors(&[(1, usdc(1))])); + let mut awards = std::vec::Vec::new(); + for position in 1..=cap + 1 { + awards.push((g.someone(), position, usdc(1))); + } + fails_with( + g.events.try_select_winners(&id, &g.specs(&awards), &g.op()), + Error::InvalidWinnerPosition, + ); + awards.pop(); + g.select(id, &awards); + assert_eq!(g.events.get_winner_count(&id), cap); +} + +#[test] +fn selection_happens_once() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 2).floors(&[(1, usdc(500))])); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(500))]); + + fails_with( + g.events + .try_select_winners(&id, &g.specs(&[(g.someone(), 2, usdc(500))]), &g.op()), + Error::WinnersAlreadySelected, + ); + + g.pay(id, &a, 0, usdc(250)); + fails_with( + g.events + .try_select_winners(&id, &g.specs(&[(g.someone(), 2, usdc(500))]), &g.op()), + Error::WinnersAlreadySelected, + ); + assert_eq!(g.owed(id), usdc(250)); +} + +#[test] +fn a_floored_position_left_out_is_never_awarded_and_comes_back_on_cancel() { + let g = setup(); + let id = g.create(Spec::new(usdc(1_000), 1).floors(&[(1, usdc(600)), (2, usdc(400))])); + let a = g.someone(); + g.select(id, &[(a.clone(), 1, usdc(600))]); + g.pay(id, &a, 0, usdc(600)); + + assert_eq!(g.status(id), EventStatus::Active); + assert_eq!(g.event(id).remaining_escrow, usdc(400)); + assert_eq!(g.owed(id), 0); + + g.cancel(id); + assert_eq!(g.balance(&g.owner), usdc(400)); +} + +#[test] +fn selection_on_a_closed_grant_is_refused() { + let g = setup(); + let done = g.create(Spec::new(usdc(100), 1)); + let a = g.someone(); + g.select(done, &[(a.clone(), 1, usdc(100))]); + g.pay(done, &a, 0, usdc(100)); + assert_eq!(g.status(done), EventStatus::Completed); + fails_with( + g.events + .try_select_winners(&done, &g.specs(&[(g.someone(), 2, usdc(1))]), &g.op()), + Error::EventNotActive, + ); + + let cancelled = g.create(Spec::new(usdc(100), 1)); + g.cancel(cancelled); + fails_with( + g.events.try_select_winners( + &cancelled, + &g.specs(&[(g.someone(), 1, usdc(100))]), + &g.op(), + ), + Error::EventNotActive, + ); +} + +#[test] +fn selection_on_an_unknown_grant_is_refused() { + let g = setup(); + fails_with( + g.events + .try_select_winners(&999, &g.specs(&[(g.someone(), 1, usdc(1))]), &g.op()), + Error::EventNotFound, + ); +} + +#[test] +fn selection_op_id_cannot_be_replayed() { + let g = setup(); + let first = g.create(Spec::new(usdc(100), 1)); + let second = g.create(Spec::new(usdc(100), 1)); + let op = g.op(); + g.events + .select_winners(&first, &g.specs(&[(g.someone(), 1, usdc(100))]), &op); + fails_with( + g.events + .try_select_winners(&second, &g.specs(&[(g.someone(), 1, usdc(100))]), &op), + Error::OpAlreadySeen, + ); +} diff --git a/contracts/events/src/tests/hackathon_pillar.rs b/contracts/events/src/tests/hackathon_pillar.rs index 8b64950..f9d0e39 100644 --- a/contracts/events/src/tests/hackathon_pillar.rs +++ b/contracts/events/src/tests/hackathon_pillar.rs @@ -5,10 +5,7 @@ use soroban_sdk::{ token, Address, BytesN, Env, Map, String, }; -use crate::errors::Error; -use crate::event_ops::MAX_CONTENT_URI_LEN; -use crate::storage; -use crate::types::{CreateEventParams, DataKey, EventStatus, Pillar, ReleaseKind, WinnerSpec}; +use crate::types::{CreateEventParams, EventStatus, Pillar, ReleaseKind, WinnerSpec}; use crate::{EventsContract, EventsContractClient}; use boundless_profile::{ProfileContract, ProfileContractClient}; @@ -21,7 +18,6 @@ const FEE_AMOUNT: i128 = (TOTAL_BUDGET * FEE_BPS as i128) / 10_000_i128; struct Ctx<'a> { env: Env, events: EventsContractClient<'a>, - events_id: Address, profile: ProfileContractClient<'a>, owner: Address, applicant: Address, @@ -68,7 +64,6 @@ fn setup<'a>() -> Ctx<'a> { Ctx { env, events, - events_id, profile, owner, applicant, @@ -78,30 +73,21 @@ fn setup<'a>() -> Ctx<'a> { } } -fn expect_op_err( - result: Result, Result>, -) -> Error { - match result { - Err(Ok(e)) => e, - _ => panic!("expected contract error"), - } -} - -fn single_winner_dist(env: &Env) -> Map { +fn single_winner_dist(env: &Env) -> Map { let mut m = Map::new(env); - m.set(1, 100); + m.set(1, 100000000000_i128); m } -fn three_way_dist(env: &Env) -> Map { +fn three_way_dist(env: &Env) -> Map { let mut m = Map::new(env); - m.set(1, 50); - m.set(2, 30); - m.set(3, 20); + m.set(1, 50000000000_i128); + m.set(2, 30000000000_i128); + m.set(3, 20000000000_i128); m } -fn create_hackathon_with(ctx: &Ctx, dist: Map, deadline: Option) -> u64 { +fn create_hackathon_with(ctx: &Ctx, dist: Map, deadline: Option) -> u64 { let params = CreateEventParams { pillar: Pillar::Hackathon, owner: ctx.owner.clone(), @@ -111,7 +97,7 @@ fn create_hackathon_with(ctx: &Ctx, dist: Map, deadline: Option) content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/hackathon"), title: String::from_str(&ctx.env, "Test Hackathon"), deadline, - winner_distribution: dist, + prize_floors: dist, fee_bps_override: None, manager: None, }; @@ -163,7 +149,7 @@ fn create_rejects_multi_release_kind() { content_uri: String::from_str(&ctx.env, "uri"), title: String::from_str(&ctx.env, "Bad Hackathon"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_winner_dist(&ctx.env), + prize_floors: single_winner_dist(&ctx.env), fee_bps_override: None, manager: None, }; @@ -176,217 +162,6 @@ fn create_rejects_multi_release_kind() { // submit (open submission model) // ============================================================ -#[test] -fn submit_open_without_prior_apply_creates_anchor() { - let ctx = setup(); - let id = create_hackathon(&ctx); - - let uri = String::from_str(&ctx.env, "ipfs://Qm.../project.json"); - let op = BytesN::random(&ctx.env); - ctx.events.submit(&id, &ctx.applicant, &uri, &op); - - let sub = ctx.events.get_submission(&id, &ctx.applicant); - assert_eq!(sub.applicant, ctx.applicant); - assert_eq!(sub.content_uri, uri); - assert_eq!(sub.submitted_at, ctx.env.ledger().timestamp()); -} - -#[test] -fn resubmit_keeps_original_timestamp_and_updates_uri() { - let ctx = setup(); - let id = create_hackathon(&ctx); - - let uri_a = String::from_str(&ctx.env, "ipfs://Qm.../v1.json"); - let op_a = BytesN::random(&ctx.env); - ctx.events.submit(&id, &ctx.applicant, &uri_a, &op_a); - let first_time = ctx.events.get_submission(&id, &ctx.applicant).submitted_at; - - let uri_b = String::from_str(&ctx.env, "ipfs://Qm.../v2.json"); - let op_b = BytesN::random(&ctx.env); - ctx.events.submit(&id, &ctx.applicant, &uri_b, &op_b); - - let second = ctx.events.get_submission(&id, &ctx.applicant); - assert_eq!(second.content_uri, uri_b); - assert_eq!(second.submitted_at, first_time); -} - -#[test] -fn submit_replayed_op_reverts() { - let ctx = setup(); - let id = create_hackathon(&ctx); - - let uri = String::from_str(&ctx.env, "ipfs://Qm.../v1.json"); - let op = BytesN::random(&ctx.env); - ctx.events.submit(&id, &ctx.applicant, &uri, &op); - - let res = ctx.events.try_submit(&id, &ctx.applicant, &uri, &op); - assert!(res.is_err(), "replayed submit op_id must revert"); -} - -#[test] -fn withdraw_submission_removes_anchor() { - let ctx = setup(); - let id = create_hackathon(&ctx); - - let uri = String::from_str(&ctx.env, "ipfs://Qm.../v1.json"); - let op_s = BytesN::random(&ctx.env); - ctx.events.submit(&id, &ctx.applicant, &uri, &op_s); - - let op_w = BytesN::random(&ctx.env); - ctx.events.withdraw_submission(&id, &ctx.applicant, &op_w); - - let res = ctx.events.try_get_submission(&id, &ctx.applicant); - assert!(res.is_err(), "withdrawn submission is no longer readable"); -} - -#[test] -fn remove_submission_on_nonexistent_entry_does_not_corrupt_counter() { - let ctx = setup(); - let id = create_hackathon(&ctx); - - let submitter = Address::generate(&ctx.env); - ctx.events.submit( - &id, - &submitter, - &String::from_str(&ctx.env, "ipfs://Qm.../v1.json"), - &BytesN::random(&ctx.env), - ); - - // ctx.applicant never submitted โ€” calling the low-level storage helper - // directly for it must be a no-op, not decrement the counter that - // `submitter`'s real submission incremented. - ctx.env.as_contract(&ctx.events_id, || { - storage::remove_submission(&ctx.env, id, &ctx.applicant); - }); - - let count = ctx - .env - .as_contract(&ctx.events_id, || storage::submission_count(&ctx.env, id)); - assert_eq!( - count, 1, - "removing a nonexistent submission must not corrupt the counter" - ); -} - -#[test] -fn withdraw_submission_frees_the_slot_for_future_submitters() { - let ctx = setup(); - let id = create_hackathon(&ctx); - - let uri = String::from_str(&ctx.env, "ipfs://Qm.../v1.json"); - ctx.events - .submit(&id, &ctx.applicant, &uri, &BytesN::random(&ctx.env)); - ctx.events - .withdraw_submission(&id, &ctx.applicant, &BytesN::random(&ctx.env)); - - let count = ctx - .env - .as_contract(&ctx.events_id, || storage::submission_count(&ctx.env, id)); - assert_eq!( - count, 0, - "withdrawing a submission must decrement the submission count" - ); -} - -#[test] -fn submit_beyond_former_cap_succeeds() { - let ctx = setup(); - let id = create_hackathon(&ctx); - - // Fast-forward the per-event counter past the former 5,000 cap instead - // of performing that many real submissions from distinct addresses. - ctx.env.as_contract(&ctx.events_id, || { - ctx.env - .storage() - .persistent() - .set(&DataKey::EventSubmissionCount(id), &5_000_u32); - }); - - let uri = String::from_str(&ctx.env, "ipfs://Qm.../v5001.json"); - ctx.events - .submit(&id, &ctx.applicant, &uri, &BytesN::random(&ctx.env)); - - let count = ctx - .env - .as_contract(&ctx.events_id, || storage::submission_count(&ctx.env, id)); - assert_eq!( - count, 5_001, - "submissions are unbounded; the counter must keep advancing past the former cap" - ); -} - -#[test] -fn submit_at_counter_overflow_reverts() { - let ctx = setup(); - let id = create_hackathon(&ctx); - - ctx.env.as_contract(&ctx.events_id, || { - ctx.env - .storage() - .persistent() - .set(&DataKey::EventSubmissionCount(id), &u32::MAX); - }); - - let uri = String::from_str(&ctx.env, "ipfs://Qm.../overflow.json"); - let op = BytesN::random(&ctx.env); - let err = expect_op_err(ctx.events.try_submit(&id, &ctx.applicant, &uri, &op)); - assert_eq!( - err, - Error::TooManyContributors, - "a submission that would overflow the u32 counter must revert" - ); -} - -#[test] -fn submit_oversized_content_uri_reverts() { - let ctx = setup(); - let id = create_hackathon(&ctx); - - let too_long = "x".repeat((MAX_CONTENT_URI_LEN + 1) as usize); - let uri = String::from_str(&ctx.env, &too_long); - let op = BytesN::random(&ctx.env); - let err = expect_op_err(ctx.events.try_submit(&id, &ctx.applicant, &uri, &op)); - // Reused rather than a new variant โ€” stays inside the contracterror - // 50-variant cap (see BACKLOG.md L7 for precedent). - assert_eq!( - err, - Error::TitleTooLong, - "content_uri beyond MAX_CONTENT_URI_LEN must revert" - ); -} - -#[test] -fn resubmit_by_existing_applicant_does_not_increment_submission_count() { - let ctx = setup(); - let id = create_hackathon(&ctx); - - let uri_a = String::from_str(&ctx.env, "ipfs://Qm.../v1.json"); - ctx.events - .submit(&id, &ctx.applicant, &uri_a, &BytesN::random(&ctx.env)); - - let count_after_first = ctx - .env - .as_contract(&ctx.events_id, || storage::submission_count(&ctx.env, id)); - assert_eq!(count_after_first, 1); - - let uri_b = String::from_str(&ctx.env, "ipfs://Qm.../v2.json"); - ctx.events - .submit(&id, &ctx.applicant, &uri_b, &BytesN::random(&ctx.env)); - - let count_after_second = ctx - .env - .as_contract(&ctx.events_id, || storage::submission_count(&ctx.env, id)); - assert_eq!( - count_after_second, 1, - "re-submission by an existing applicant updates in place and must not \ - recount against the cap" - ); -} - -// ============================================================ -// select_winners โ€” distribution (happy paths) -// ============================================================ - #[test] fn select_winners_single_recipient_sweeps_escrow() { let ctx = setup(); @@ -401,6 +176,7 @@ fn select_winners_single_recipient_sweeps_escrow() { WinnerSpec { recipient: ctx.applicant.clone(), position: 1, + amount: TOTAL_BUDGET, reputation_bump: 50, }, ]; @@ -454,16 +230,19 @@ fn select_winners_multi_position_splits_by_distribution() { WinnerSpec { recipient: first.clone(), position: 1, + amount: TOTAL_BUDGET * 50 / 100, reputation_bump: 60, }, WinnerSpec { recipient: second.clone(), position: 2, + amount: TOTAL_BUDGET * 30 / 100, reputation_bump: 40, }, WinnerSpec { recipient: third.clone(), position: 3, + amount: TOTAL_BUDGET * 20 / 100, reputation_bump: 20, }, ]; @@ -501,7 +280,7 @@ fn select_winners_multi_position_splits_by_distribution() { } // ============================================================ -// select_winners โ€” rejections / edges +// select_winners: rejections and edges // ============================================================ #[test] @@ -516,21 +295,25 @@ fn select_winners_empty_set_reverts() { } #[test] -fn select_winners_position_not_in_distribution_reverts() { +fn select_winners_allows_a_position_with_no_floor() { let ctx = setup(); - let id = create_hackathon(&ctx); // distribution only has position 1 + let id = create_hackathon(&ctx); // floors cover position 1 only let winners = soroban_sdk::vec![ &ctx.env, WinnerSpec { recipient: ctx.applicant.clone(), position: 2, + amount: 1_0000000_i128, reputation_bump: 0, }, ]; let op = BytesN::random(&ctx.env); - let res = ctx.events.try_select_winners(&id, &winners, &op); - assert!(res.is_err(), "position outside distribution must revert"); + ctx.events.select_winners(&id, &winners, &op); + + let rows = ctx.events.get_winners(&id); + assert_eq!(rows.len(), 1); + assert_eq!(rows.get(0).unwrap().position, 2); } #[test] @@ -545,11 +328,13 @@ fn select_winners_duplicate_position_reverts() { WinnerSpec { recipient: ctx.applicant.clone(), position: 1, + amount: TOTAL_BUDGET * 50 / 100, reputation_bump: 0, }, WinnerSpec { recipient: other, position: 1, // duplicate + amount: TOTAL_BUDGET * 50 / 100, reputation_bump: 0, }, ]; @@ -569,6 +354,7 @@ fn select_winners_batches_append_and_position_replay_reverts() { WinnerSpec { recipient: ctx.applicant.clone(), position: 1, + amount: TOTAL_BUDGET * 50 / 100, reputation_bump: 0, }, ]; @@ -584,6 +370,7 @@ fn select_winners_batches_append_and_position_replay_reverts() { WinnerSpec { recipient: usurper, position: 1, + amount: TOTAL_BUDGET * 50 / 100, reputation_bump: 0, }, ]; @@ -601,11 +388,13 @@ fn select_winners_batches_append_and_position_replay_reverts() { WinnerSpec { recipient: second.clone(), position: 2, + amount: TOTAL_BUDGET * 30 / 100, reputation_bump: 0, }, WinnerSpec { recipient: third.clone(), position: 3, + amount: TOTAL_BUDGET * 20 / 100, reputation_bump: 0, }, ]; @@ -636,6 +425,7 @@ fn select_winners_replayed_op_reverts() { WinnerSpec { recipient: ctx.applicant.clone(), position: 1, + amount: TOTAL_BUDGET, reputation_bump: 0, }, ]; @@ -654,6 +444,7 @@ fn select_winners_on_missing_event_reverts() { WinnerSpec { recipient: ctx.applicant.clone(), position: 1, + amount: TOTAL_BUDGET, reputation_bump: 0, }, ]; @@ -672,6 +463,7 @@ fn select_winners_on_completed_event_reverts() { WinnerSpec { recipient: ctx.applicant.clone(), position: 1, + amount: TOTAL_BUDGET, reputation_bump: 0, }, ]; @@ -689,6 +481,7 @@ fn select_winners_on_completed_event_reverts() { WinnerSpec { recipient: again, position: 1, + amount: TOTAL_BUDGET, reputation_bump: 0, }, ]; @@ -710,6 +503,7 @@ fn select_winners_demands_owner_auth() { WinnerSpec { recipient: ctx.applicant.clone(), position: 1, + amount: TOTAL_BUDGET, reputation_bump: 0, }, ]; diff --git a/contracts/events/src/tests/mod.rs b/contracts/events/src/tests/mod.rs index 6340211..8653769 100644 --- a/contracts/events/src/tests/mod.rs +++ b/contracts/events/src/tests/mod.rs @@ -1,4 +1,5 @@ -#![cfg(test)] +// Amounts are written as whole tokens then seven decimal places. +#![allow(clippy::inconsistent_digit_grouping)] mod admin; mod bounty_pillar; @@ -9,6 +10,7 @@ mod cross_contract; mod crowdfunding; mod escrow_fee_math; mod grant_pillar; +mod grant_scenarios; mod hackathon_pillar; mod op_id_security; mod prize_claim; diff --git a/contracts/events/src/tests/op_id_security.rs b/contracts/events/src/tests/op_id_security.rs index 87fe2be..67e0e6f 100644 --- a/contracts/events/src/tests/op_id_security.rs +++ b/contracts/events/src/tests/op_id_security.rs @@ -76,9 +76,9 @@ fn setup<'a>() -> Ctx<'a> { } } -fn dist_100(env: &Env) -> Map { +fn dist_100(env: &Env) -> Map { let mut m = Map::new(env); - m.set(1, 100); + m.set(1, 100000000000_i128); m } @@ -92,7 +92,7 @@ fn create_bounty(ctx: &Ctx) -> u64 { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/events/op-id-sec"), title: String::from_str(&ctx.env, "OpId Security"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: dist_100(&ctx.env), + prize_floors: dist_100(&ctx.env), fee_bps_override: None, manager: None, }; @@ -118,13 +118,15 @@ fn sha256_child_ids_differ_for_xor_colliding_parents() { let parent_b = BytesN::from_array(env, &b); assert_ne!(parent_a, parent_b); - // derive_child reads profile contract storage โ€” must run as the events contract. + // derive_child reads profile contract storage, so it must run as the events contract. let (child_a, child_b, child_rep, child_i0, child_i1) = env.as_contract(&ctx.events_id, || { - let child_a = idempotency::derive_child(env, &parent_a, tag::BOOTSTRAP); - let child_b = idempotency::derive_child(env, &parent_b, tag::BOOTSTRAP); - let child_rep = idempotency::derive_child(env, &parent_a, tag::BUMP_REP); - let child_i0 = idempotency::derive_child_indexed(env, &parent_a, tag::BOOTSTRAP, 0); - let child_i1 = idempotency::derive_child_indexed(env, &parent_a, tag::BOOTSTRAP, 1); + let child_a = idempotency::derive_child(env, &ctx.owner, &parent_a, tag::BOOTSTRAP); + let child_b = idempotency::derive_child(env, &ctx.owner, &parent_b, tag::BOOTSTRAP); + let child_rep = idempotency::derive_child(env, &ctx.owner, &parent_a, tag::BUMP_REP); + let child_i0 = + idempotency::derive_child_indexed(env, &ctx.owner, &parent_a, tag::BOOTSTRAP, 0); + let child_i1 = + idempotency::derive_child_indexed(env, &ctx.owner, &parent_a, tag::BOOTSTRAP, 1); (child_a, child_b, child_rep, child_i0, child_i1) }); @@ -136,6 +138,14 @@ fn sha256_child_ids_differ_for_xor_colliding_parents() { assert_eq!(child_a, child_i0); assert_ne!(child_i0, child_i1); assert_ne!(child_a, parent_a); + + let child_other_caller = env.as_contract(&ctx.events_id, || { + idempotency::derive_child(env, &ctx.applicant, &parent_a, tag::BOOTSTRAP) + }); + assert_ne!( + child_a, child_other_caller, + "the same parent under another authorizer must not share children" + ); } /// Attacker squats derived child ids via bootstrap_self; legitimate claim_prize still pays. @@ -144,29 +154,26 @@ fn bootstrap_self_cannot_front_run_events_child_op_ids() { let ctx = setup(); let bounty_id = create_bounty(&ctx); - let op_apply = BytesN::random(&ctx.env); - ctx.events - .apply_to_bounty(&bounty_id, &ctx.applicant, &op_apply); - let winners = soroban_sdk::vec![ &ctx.env, WinnerSpec { recipient: ctx.applicant.clone(), position: 1, + amount: 10_000_0000000_i128, reputation_bump: 50, }, ]; let op_select = BytesN::random(&ctx.env); ctx.events.select_winners(&bounty_id, &winners, &op_select); - // Parent op_id the winner will use for claim_prize โ€” attacker observes it and + // Parent op_id the winner will use for claim_prize; the attacker observes it and // pre-marks the derived profile child ids via unprivileged bootstrap_self. let claim_op = BytesN::random(&ctx.env); let (bootstrap_child, rep_child, earnings_child) = ctx.env.as_contract(&ctx.events_id, || { ( - idempotency::derive_child(&ctx.env, &claim_op, tag::BOOTSTRAP), - idempotency::derive_child(&ctx.env, &claim_op, tag::BUMP_REP), - idempotency::derive_child(&ctx.env, &claim_op, tag::REGISTER_EARNINGS), + idempotency::derive_child(&ctx.env, &ctx.applicant, &claim_op, tag::BOOTSTRAP), + idempotency::derive_child(&ctx.env, &ctx.applicant, &claim_op, tag::BUMP_REP), + idempotency::derive_child(&ctx.env, &ctx.applicant, &claim_op, tag::REGISTER_EARNINGS), ) }); @@ -200,7 +207,7 @@ fn events_domain_child_op_id_replay_still_rejected() { // Bootstrap via events path twice with the same child id. let parent = BytesN::random(env); let child = env.as_contract(&ctx.events_id, || { - idempotency::derive_child(env, &parent, tag::BOOTSTRAP) + idempotency::derive_child(env, &ctx.owner, &parent, tag::BOOTSTRAP) }); let user = Address::generate(env); @@ -236,7 +243,7 @@ fn event_id_overflow_reverts() { content_uri: String::from_str(env, "https://api.boundless.fi/events/overflow"), title: String::from_str(env, "Overflow"), deadline: Some(env.ledger().timestamp() + 86_400), - winner_distribution: dist_100(env), + prize_floors: dist_100(env), fee_bps_override: None, manager: None, }; @@ -244,8 +251,7 @@ fn event_id_overflow_reverts() { let err = ctx .events .try_create_event(¶ms, &BytesN::random(env)) - .err() - .expect("event creation should fail when next_event_id overflows") + .expect_err("event creation should fail when next_event_id overflows") .unwrap(); assert_eq!(err, crate::errors::Error::EventIdOverflow); @@ -275,19 +281,20 @@ fn event_id_overflow_reverts() { /// (select_winners) that reuses it. Before namespacing, the shared global /// OpSeen made the manager's payout revert with OpAlreadySeen. #[test] -fn permissionless_apply_cannot_squat_select_winners_op_id() { +fn permissionless_add_funds_cannot_squat_select_winners_op_id() { let ctx = setup(); let id = create_bounty(&ctx); - ctx.events - .apply_to_bounty(&id, &ctx.applicant, &BytesN::random(&ctx.env)); - // The op_id the owner will use to select winners. let victim_op = BytesN::random(&ctx.env); - // Attacker front-runs by burning that op_id in their own (apply) domain. + // Attacker front-runs by burning that op_id in their own (add_funds) + // domain. Contributing is the one entrypoint anyone may still call. let attacker = Address::generate(&ctx.env); - ctx.events.apply_to_bounty(&id, &attacker, &victim_op); + // add_funds debits the contribution plus the platform fee on top. + token::StellarAssetClient::new(&ctx.env, &ctx.token_addr).mint(&attacker, &1_000_0000000_i128); + ctx.events + .add_funds(&id, &attacker, &100_0000000_i128, &victim_op); // Owner's select_winners with the same op_id still succeeds (owner domain). let winners = soroban_sdk::vec![ @@ -295,6 +302,7 @@ fn permissionless_apply_cannot_squat_select_winners_op_id() { WinnerSpec { recipient: ctx.applicant.clone(), position: 1, + amount: 10_000_0000000_i128, reputation_bump: 0, }, ]; diff --git a/contracts/events/src/tests/prize_claim.rs b/contracts/events/src/tests/prize_claim.rs index 79f04f4..0da7672 100644 --- a/contracts/events/src/tests/prize_claim.rs +++ b/contracts/events/src/tests/prize_claim.rs @@ -71,7 +71,7 @@ fn setup<'a>() -> Ctx<'a> { } } -fn create_single(ctx: &Ctx, dist: Map) -> u64 { +fn create_single(ctx: &Ctx, dist: Map) -> u64 { let params = CreateEventParams { pillar: Pillar::Hackathon, owner: ctx.owner.clone(), @@ -81,32 +81,33 @@ fn create_single(ctx: &Ctx, dist: Map) -> u64 { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/prize-claim"), title: String::from_str(&ctx.env, "Prize Claim Suite"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: dist, + prize_floors: dist, fee_bps_override: None, manager: None, }; ctx.events.create_event(¶ms, &BytesN::random(&ctx.env)) } -fn dist_100(env: &Env) -> Map { +fn dist_100(env: &Env) -> Map { let mut m = Map::new(env); - m.set(1, 100); + m.set(1, TOTAL_BUDGET); m } -fn dist_60_40(env: &Env) -> Map { +fn dist_60_40(env: &Env) -> Map { let mut m = Map::new(env); - m.set(1, 60); - m.set(2, 40); + m.set(1, TOTAL_BUDGET * 60 / 100); + m.set(2, TOTAL_BUDGET * 40 / 100); m } -fn select_one(ctx: &Ctx, id: u64, recipient: &Address, position: u32, bump: u32) { +fn select_one(ctx: &Ctx, id: u64, recipient: &Address, position: u32, amount: i128, bump: u32) { let winners = soroban_sdk::vec![ &ctx.env, WinnerSpec { recipient: recipient.clone(), position, + amount, reputation_bump: bump, }, ]; @@ -125,7 +126,7 @@ fn claim_pays_recipient_full_prize_and_no_release_fee() { let token = token::Client::new(&ctx.env, &ctx.token_addr); let w = Address::generate(&ctx.env); - select_one(&ctx, id, &w, 1, 50); + select_one(&ctx, id, &w, 1, TOTAL_BUDGET, 50); // Selection alone must not move funds or complete the event. assert_eq!(token.balance(&w), 0); @@ -167,8 +168,8 @@ fn split_claims_pay_exact_amounts_each() { let a = Address::generate(&ctx.env); let b = Address::generate(&ctx.env); - select_one(&ctx, id, &a, 1, 10); - select_one(&ctx, id, &b, 2, 5); + select_one(&ctx, id, &a, 1, TOTAL_BUDGET * 60 / 100, 10); + select_one(&ctx, id, &b, 2, TOTAL_BUDGET * 40 / 100, 5); ctx.events .claim_prize(&id, &2_u32, &BytesN::random(&ctx.env)); @@ -193,7 +194,7 @@ fn topup_after_selection_stays_residual_for_refund() { let token_admin = token::StellarAssetClient::new(&ctx.env, &ctx.token_addr); let w = Address::generate(&ctx.env); - select_one(&ctx, id, &w, 1, 0); + select_one(&ctx, id, &w, 1, TOTAL_BUDGET, 0); // A partner tops up AFTER selection: the prize amount stays anchored // to the selection-time baseline; the top-up is refundable residual. @@ -227,7 +228,7 @@ fn claim_requires_recipient_auth() { let id = create_single(&ctx, dist_100(&ctx.env)); let w = Address::generate(&ctx.env); - select_one(&ctx, id, &w, 1, 0); + select_one(&ctx, id, &w, 1, TOTAL_BUDGET, 0); ctx.env.mock_auths(&[]); let res = ctx @@ -242,7 +243,7 @@ fn claim_demands_the_award_recipients_auth_specifically() { let id = create_single(&ctx, dist_100(&ctx.env)); let w = Address::generate(&ctx.env); - select_one(&ctx, id, &w, 1, 0); + select_one(&ctx, id, &w, 1, TOTAL_BUDGET, 0); ctx.events .claim_prize(&id, &1_u32, &BytesN::random(&ctx.env)); @@ -264,7 +265,7 @@ fn double_claim_reverts() { let id = create_single(&ctx, dist_60_40(&ctx.env)); let w = Address::generate(&ctx.env); - select_one(&ctx, id, &w, 1, 0); + select_one(&ctx, id, &w, 1, TOTAL_BUDGET * 60 / 100, 0); ctx.events .claim_prize(&id, &1_u32, &BytesN::random(&ctx.env)); @@ -284,11 +285,11 @@ fn op_id_replay_reverts() { // Both positions go to the same recipient so the two claims share an // op_id domain; reusing the op_id must revert even though position 2 is - // not yet paid. (Cross-recipient op_id reuse is intentionally allowed โ€” + // not yet paid. (Cross-recipient op_id reuse is intentionally allowed: // OpSeen is namespaced per authorizing caller.) let a = Address::generate(&ctx.env); - select_one(&ctx, id, &a, 1, 0); - select_one(&ctx, id, &a, 2, 0); + select_one(&ctx, id, &a, 1, TOTAL_BUDGET * 60 / 100, 0); + select_one(&ctx, id, &a, 2, TOTAL_BUDGET * 40 / 100, 0); let op = BytesN::random(&ctx.env); ctx.events.claim_prize(&id, &1_u32, &op); @@ -305,7 +306,7 @@ fn claim_of_unawarded_position_reverts() { let id = create_single(&ctx, dist_60_40(&ctx.env)); let w = Address::generate(&ctx.env); - select_one(&ctx, id, &w, 1, 0); + select_one(&ctx, id, &w, 1, TOTAL_BUDGET * 60 / 100, 0); // Position 2 is in the distribution but has no award yet. let res = ctx @@ -332,14 +333,14 @@ fn claim_on_multi_release_event_reverts() { content_uri: String::from_str(&ctx.env, "https://api.boundless.fi/grant"), title: String::from_str(&ctx.env, "Grant"), deadline: None, - winner_distribution: dist_100(&ctx.env), + prize_floors: dist_100(&ctx.env), fee_bps_override: None, manager: None, }; let id = ctx.events.create_event(¶ms, &BytesN::random(&ctx.env)); let w = Address::generate(&ctx.env); - select_one(&ctx, id, &w, 1, 0); + select_one(&ctx, id, &w, 1, TOTAL_BUDGET, 0); let res = ctx .events @@ -360,7 +361,7 @@ fn cancel_blocked_while_unclaimed_prizes_within_window() { let id = create_single(&ctx, dist_60_40(&ctx.env)); let w = Address::generate(&ctx.env); - select_one(&ctx, id, &w, 1, 0); + select_one(&ctx, id, &w, 1, TOTAL_BUDGET * 60 / 100, 0); let res = ctx.events.try_start_cancel(&id, &BytesN::random(&ctx.env)); assert!( @@ -380,6 +381,63 @@ fn cancel_blocked_while_unclaimed_prizes_within_window() { ); } +#[test] +fn time_spent_paused_does_not_run_down_the_claim_window() { + let ctx = setup(); + let id = create_single(&ctx, dist_100(&ctx.env)); + let w = Address::generate(&ctx.env); + select_one(&ctx, id, &w, 1, TOTAL_BUDGET, 0); + let day = 86_400; + let start = ctx.env.ledger().timestamp(); + + ctx.env.ledger().with_mut(|li| li.timestamp = start + day); + ctx.events.pause(); + ctx.env + .ledger() + .with_mut(|li| li.timestamp = start + 92 * day); + ctx.events.unpause(); + + let blocked = ctx + .events + .try_start_cancel(&id, &BytesN::random(&ctx.env)) + .err() + .unwrap() + .unwrap(); + assert_eq!(blocked, crate::errors::Error::WinnersAlreadySelected); + + // 91 paused days are added back: the window now closes at day 181 + ctx.env + .ledger() + .with_mut(|li| li.timestamp = start + 91 * day + PRIZE_CLAIM_WINDOW_SECS); + assert!(ctx + .events + .try_start_cancel(&id, &BytesN::random(&ctx.env)) + .is_err()); + ctx.env + .ledger() + .with_mut(|li| li.timestamp = start + 91 * day + PRIZE_CLAIM_WINDOW_SECS + 1); + drive_cancel(&ctx.env, &ctx.events, id); + assert_eq!(ctx.events.get_event(&id).status, EventStatus::Cancelled); +} + +#[test] +fn a_winner_can_claim_after_a_long_pause() { + let ctx = setup(); + let id = create_single(&ctx, dist_100(&ctx.env)); + let w = Address::generate(&ctx.env); + select_one(&ctx, id, &w, 1, TOTAL_BUDGET, 0); + + ctx.events.pause(); + ctx.env.ledger().with_mut(|li| { + li.timestamp += PRIZE_CLAIM_WINDOW_SECS * 2; + }); + ctx.events.unpause(); + ctx.events + .claim_prize(&id, &1_u32, &BytesN::random(&ctx.env)); + let token = token::Client::new(&ctx.env, &ctx.token_addr); + assert_eq!(token.balance(&w), TOTAL_BUDGET); +} + #[test] fn cancel_after_window_expiry_sweeps_unclaimed_and_blocks_late_claim() { let ctx = setup(); @@ -387,7 +445,7 @@ fn cancel_after_window_expiry_sweeps_unclaimed_and_blocks_late_claim() { let token = token::Client::new(&ctx.env, &ctx.token_addr); let w = Address::generate(&ctx.env); - select_one(&ctx, id, &w, 1, 0); + select_one(&ctx, id, &w, 1, TOTAL_BUDGET, 0); ctx.env.ledger().with_mut(|li| { li.timestamp += PRIZE_CLAIM_WINDOW_SECS + 1; @@ -414,14 +472,14 @@ fn claim_window_refreshes_on_a_later_batch() { let id = create_single(&ctx, dist_60_40(&ctx.env)); let a = Address::generate(&ctx.env); - select_one(&ctx, id, &a, 1, 0); + select_one(&ctx, id, &a, 1, TOTAL_BUDGET * 60 / 100, 0); // Move to just before the first window expires, then select batch 2. ctx.env.ledger().with_mut(|li| { li.timestamp += PRIZE_CLAIM_WINDOW_SECS - 100; }); let b = Address::generate(&ctx.env); - select_one(&ctx, id, &b, 2, 0); + select_one(&ctx, id, &b, 2, TOTAL_BUDGET * 40 / 100, 0); // Past the FIRST batch's expiry, but inside the refreshed window: // cancel stays blocked, protecting the late-selected winner. diff --git a/contracts/events/src/tests/token_whitelist.rs b/contracts/events/src/tests/token_whitelist.rs index f8736ca..4e2b20d 100644 --- a/contracts/events/src/tests/token_whitelist.rs +++ b/contracts/events/src/tests/token_whitelist.rs @@ -37,9 +37,9 @@ fn new_token(env: &Env) -> Address { env.register_stellar_asset_contract_v2(issuer).address() } -fn single_dist(env: &Env) -> Map { +fn single_dist(env: &Env) -> Map { let mut m = Map::new(env); - m.set(1, 100); + m.set(1, 10000000000_i128); m } @@ -122,7 +122,7 @@ fn create_event_with_unsupported_token_reverts() { content_uri: String::from_str(&ctx.env, "https://example.com"), title: String::from_str(&ctx.env, "Bad Token Hack"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist(&ctx.env), + prize_floors: single_dist(&ctx.env), fee_bps_override: None, manager: None, }; @@ -151,7 +151,7 @@ fn create_event_with_deregistered_token_reverts() { content_uri: String::from_str(&ctx.env, "https://example.com"), title: String::from_str(&ctx.env, "Deregistered Token Hack"), deadline: Some(ctx.env.ledger().timestamp() + 86_400), - winner_distribution: single_dist(&ctx.env), + prize_floors: single_dist(&ctx.env), fee_bps_override: None, manager: None, }; diff --git a/contracts/events/src/token_whitelist.rs b/contracts/events/src/token_whitelist.rs index 9ea8a58..d19fb6e 100644 --- a/contracts/events/src/token_whitelist.rs +++ b/contracts/events/src/token_whitelist.rs @@ -1,5 +1,3 @@ -#![allow(dead_code)] - use soroban_sdk::{Address, Env}; use crate::admin; diff --git a/contracts/events/src/types.rs b/contracts/events/src/types.rs index fab766a..3056eb0 100644 --- a/contracts/events/src/types.rs +++ b/contracts/events/src/types.rs @@ -73,7 +73,11 @@ pub struct EventRecord { pub title: String, pub created_at: u64, pub deadline: Option, - pub winner_distribution: Map, + /// Advertised minimum per position, in token-native units. `select_winners` + /// may pay above a floor but never below it, so a published prize table is + /// a guarantee rather than an estimate. Positions absent from the map carry + /// no floor and are payable at any positive amount. + pub prize_floors: Map, pub fee_bps_override: Option, } @@ -91,33 +95,11 @@ pub struct CreateEventParams { pub content_uri: String, pub title: String, pub deadline: Option, - pub winner_distribution: Map, + pub prize_floors: Map, pub fee_bps_override: Option, pub manager: Option
, } -// ============================================================ -// SUBMISSION -// ============================================================ -#[contracttype] -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct Submission { - pub applicant: Address, - pub content_uri: String, - pub submitted_at: u64, -} - -// ============================================================ -// CONTRIBUTION -// ============================================================ -#[contracttype] -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct Contribution { - pub contributor: Address, - pub amount: i128, - pub contributed_at: u64, -} - // ============================================================ // WINNER // ============================================================ @@ -139,6 +121,10 @@ pub struct Winner { pub struct WinnerSpec { pub recipient: Address, pub position: u32, + /// Award amount in token-native units. Allocation happens here, at payout, + /// not at create: the event holds a pool and each selection names what it + /// spends from it. + pub amount: i128, pub reputation_bump: u32, } @@ -163,12 +149,6 @@ pub enum DataKey { EventManager(u64), - EventApplicantCount(u64), - EventApplicantAt(u64, u32), - EventApplicantSlot(u64, Address), - - EventSubmission(u64, Address), - EventWinnerCount(u64), EventWinnerAt(u64, u32), @@ -195,20 +175,62 @@ pub enum DataKey { SupportedTokenAt(u32), SupportedTokenSlot(Address), - // Appended in 1.2.0 to preserve existing key discriminants. NonOwnerContributionTotal(u64), - // Appended in 1.3.0 to preserve existing key discriminants. EventPrizeAward(u64, u32), EventUnclaimedPrizes(u64), - EventPrizeBaseEscrow(u64), EventPrizeClaimExpiry(u64), - // Appended for two-step manager rotation to preserve key discriminants. PendingManager(u64), - // Appended to cap per-event submission storage growth (security fix). - EventSubmissionCount(u64), + // Sum of awarded-but-unclaimed prizes. `remaining_escrow` only drops at + // claim time, so without this a second selection would see funds an + // earlier winner is still entitled to and could promise them twice. + EventOwedTotal(u64), + + // Next event id `migrate_events` has yet to convert. The pass is paged + // because one invocation may touch only 100 ledger entries, so a + // deployment with real history cannot be migrated in a single call. + MigrationCursor, + + // Grant awards by recipient, written once at selection, and each + // recipient's release progress. A release reads these instead of walking + // the winner rows, which grow with every payment. Grants selected before + // these keys existed have no roster and keep the row walk. + GrantRoster(u64), + GrantProgress(u64, Address), + + // A cancel refund the contributor's account could not take (frozen, or no + // trustline). Held for `claim_refund` so one account cannot stall the + // crank for everyone behind it. + UnclaimedRefund(u64, Address), + + // When the current pause began, and the seconds spent paused before it. + // Claim windows run on time the contract was open, so a pause cannot run + // a winner's window out while they are unable to claim. + PausedAt, + PausedSeconds, + + // Co-signs crowdfunding milestone releases in place of the admin, so the + // keys that can upgrade the contract are not needed for routine payouts. + ReleaseValidator, + PendingReleaseValidator, +} + +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct GrantAward { + pub position: u32, + pub amount: i128, +} + +/// Milestones a recipient has settled, released or forfeited, and what they +/// were worth. The last settlement takes whatever is left of the award. +#[contracttype] +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct GrantProgress { + pub settled: u32, + pub settled_amount: i128, } // ============================================================ @@ -232,6 +254,13 @@ pub struct PendingAdmin { pub expires_at_ledger: u32, } +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct PendingValidator { + pub target: Address, + pub expires_at_ledger: u32, +} + // ============================================================ // PENDING MANAGER payload (target + expiry ledger) // ============================================================ @@ -243,7 +272,7 @@ pub struct PendingManager { } // ============================================================ -// PENDING UPGRADE (timelocked wasm rotation, H6) +// PENDING UPGRADE (timelocked wasm rotation) // ============================================================ #[contracttype] #[derive(Clone, Debug, Eq, PartialEq)] diff --git a/contracts/profile/Cargo.toml b/contracts/profile/Cargo.toml index b771693..3b72ff3 100644 --- a/contracts/profile/Cargo.toml +++ b/contracts/profile/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "boundless-profile" -version = "1.2.0" +version = "1.2.1" edition = "2021" publish = false @@ -10,7 +10,7 @@ doctest = false [features] # Testnet-only: zero the upgrade timelock so upgrades apply immediately for fast -# iteration. NEVER enable on mainnet โ€” the default (feature off) keeps the full +# iteration. NEVER enable on mainnet: the default (feature off) keeps the full # audit-mandated ~1-day timelock, so forgetting the flag fails safe (secure). testnet = [] diff --git a/contracts/profile/Makefile b/contracts/profile/Makefile index 3fe3748..009192d 100644 --- a/contracts/profile/Makefile +++ b/contracts/profile/Makefile @@ -6,7 +6,7 @@ test: build cargo test build: - stellar contract build + ../../scripts/build-release.sh --package boundless-profile @ls -l ../../target/wasm32v1-none/release/*.wasm size: diff --git a/contracts/profile/src/admin.rs b/contracts/profile/src/admin.rs index f7c47bc..380386d 100644 --- a/contracts/profile/src/admin.rs +++ b/contracts/profile/src/admin.rs @@ -1,4 +1,4 @@ -use soroban_sdk::{panic_with_error, Address, BytesN, Env, String}; +use soroban_sdk::{panic_with_error, Address, BytesN, ContractExecutable, Env, String}; use crate::errors::Error; use crate::events as evt; @@ -7,13 +7,17 @@ use crate::types::{PendingAdmin, PendingEventsContract, PendingUpgrade}; const PENDING_TTL_LEDGERS: u32 = 120_960; +// About a day on mainnet: without a window a compromised admin quorum can +// propose and apply a wasm swap in one session, before anyone watching can +// react or cancel_pending_upgrade can fire. Testnet builds skip it so +// upgrades can iterate. #[cfg(not(feature = "testnet"))] const UPGRADE_TIMELOCK_LEDGERS: u32 = 17_280; #[cfg(feature = "testnet")] const UPGRADE_TIMELOCK_LEDGERS: u32 = 0; const PENDING_UPGRADE_TTL_LEDGERS: u32 = 518_400; -pub const INITIAL_VERSION: &str = "1.2.0"; +pub const INITIAL_VERSION: &str = "1.2.1"; const EVENTS_CONTRACT_TIMELOCK_LEDGERS: u32 = 17_280; @@ -26,7 +30,6 @@ pub fn initialize(env: &Env, admin: Address) { storage::set_admin(env, &admin); storage::set_paused(env, false); - storage::set_deployment_seq(env, env.ledger().sequence()); storage::set_version(env, &String::from_str(env, INITIAL_VERSION)); storage::touch_instance(env); @@ -163,7 +166,7 @@ pub fn unpause(env: &Env) -> Result<(), Error> { } // ============================================================ -// UPGRADE (timelocked; H6) +// UPGRADE (timelocked) // ============================================================ pub fn propose_upgrade( env: &Env, @@ -208,7 +211,7 @@ pub fn apply_upgrade(env: &Env) -> Result<(), Error> { } storage::touch_instance(env); env.deployer() - .update_current_contract_wasm(pending.wasm_hash.clone()); + .update_current_contract(ContractExecutable::Wasm(pending.wasm_hash.clone())); storage::set_version(env, &pending.new_version); storage::clear_pending_upgrade(env); evt::UpgradeApplied { @@ -238,7 +241,7 @@ pub fn cancel_pending_upgrade(env: &Env) -> Result<(), Error> { } // ============================================================ -// MIGRATE (post-upgrade one-shot; H6) +// MIGRATE (post-upgrade one-shot) // ============================================================ pub fn migrate(env: &Env) -> Result<(), Error> { require_admin(env)?; diff --git a/contracts/profile/src/errors.rs b/contracts/profile/src/errors.rs index 662b378..db5ce91 100644 --- a/contracts/profile/src/errors.rs +++ b/contracts/profile/src/errors.rs @@ -1,5 +1,7 @@ use soroban_sdk::contracterror; +// Retired codes are never reused, so a code in an old log or client keeps its +// meaning: 4, 5. #[contracterror] #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] #[repr(u32)] @@ -7,8 +9,6 @@ pub enum Error { AlreadyInitialized = 1, AdminCannotBeZero = 2, EventsContractNotConfigured = 3, - Unauthorized = 4, - NotAdmin = 5, PendingAdminMismatch = 6, PendingAdminExpired = 7, NotInitialized = 8, @@ -18,6 +18,7 @@ pub enum Error { PendingEventsContractTimelock = 17, ProfileNotFound = 10, + DeltaTooLarge = 11, InvalidAmount = 12, ReasonRequired = 13, diff --git a/contracts/profile/src/events.rs b/contracts/profile/src/events.rs index 0678616..1273643 100644 --- a/contracts/profile/src/events.rs +++ b/contracts/profile/src/events.rs @@ -1,5 +1,3 @@ -#![allow(dead_code)] - use soroban_sdk::{contractevent, Address, BytesN, String, Symbol}; #[contractevent] @@ -14,13 +12,6 @@ pub struct ReputationBumped { pub reason: Symbol, } -#[contractevent] -pub struct ReputationSlashed { - pub user: Address, - pub delta: u32, - pub reason: Symbol, -} - #[contractevent] pub struct EarningsRegistered { pub user: Address, diff --git a/contracts/profile/src/lib.rs b/contracts/profile/src/lib.rs index 2628916..c232239 100644 --- a/contracts/profile/src/lib.rs +++ b/contracts/profile/src/lib.rs @@ -19,7 +19,7 @@ mod tests; use crate::errors::Error; use crate::types::{PendingEventsContract, PendingUpgrade, Profile}; -contractmeta!(key = "version", val = "1.2.0"); +contractmeta!(key = "version", val = "1.2.1"); contractmeta!( key = "description", val = "Boundless profile contract: reputation + earnings" @@ -117,16 +117,6 @@ impl ProfileContract { reputation::bump(&env, user, delta, reason, op_id) } - pub fn slash_reputation( - env: Env, - user: Address, - delta: u32, - reason: Symbol, - op_id: BytesN<32>, - ) -> Result<(), Error> { - reputation::slash(&env, user, delta, reason, op_id) - } - // ============================================================ // EARNINGS // ============================================================ diff --git a/contracts/profile/src/reputation.rs b/contracts/profile/src/reputation.rs index 5f7f597..d1c42a9 100644 --- a/contracts/profile/src/reputation.rs +++ b/contracts/profile/src/reputation.rs @@ -6,6 +6,11 @@ use crate::events as evt; use crate::idempotency; use crate::storage; +// Matches the events contract's per-award cap, so a defect or a compromised +// binding on that side still cannot move a score far in one call. The admin +// slash stays uncapped: it is how a farmed score gets corrected. +pub const MAX_DELTA_PER_CALL: u32 = 100; + pub fn bump( env: &Env, user: Address, @@ -15,6 +20,9 @@ pub fn bump( ) -> Result<(), Error> { admin::require_events_contract(env)?; admin::require_not_paused(env)?; + if delta > MAX_DELTA_PER_CALL { + return Err(Error::DeltaTooLarge); + } let domain = idempotency::events_domain(env)?; idempotency::require_unseen(env, &domain, &op_id)?; @@ -32,32 +40,6 @@ pub fn bump( Ok(()) } -pub fn slash( - env: &Env, - user: Address, - delta: u32, - reason: Symbol, - op_id: BytesN<32>, -) -> Result<(), Error> { - admin::require_events_contract(env)?; - admin::require_not_paused(env)?; - let domain = idempotency::events_domain(env)?; - idempotency::require_unseen(env, &domain, &op_id)?; - - let mut profile = storage::get_profile(env, &user).ok_or(Error::ProfileNotFound)?; - profile.reputation = profile.reputation.saturating_sub(delta as u64); - storage::set_profile(env, &user, &profile); - - evt::ReputationSlashed { - user, - delta, - reason, - } - .publish(env); - idempotency::mark_seen(env, &domain, &op_id); - Ok(()) -} - pub fn admin_slash( env: &Env, user: Address, diff --git a/contracts/profile/src/storage.rs b/contracts/profile/src/storage.rs index 9b094e5..d636d65 100644 --- a/contracts/profile/src/storage.rs +++ b/contracts/profile/src/storage.rs @@ -1,6 +1,4 @@ -#![allow(dead_code)] - -use soroban_sdk::{contracttype, Address, BytesN, Env}; +use soroban_sdk::{Address, BytesN, Env}; use soroban_sdk::String; @@ -16,11 +14,6 @@ const INSTANCE_TTL_BUMP: u32 = 518_400; const PROFILE_TTL_THRESHOLD: u32 = 86_400; const PROFILE_TTL_BUMP: u32 = 1_555_200; -#[contracttype(export = false)] -enum LegacyDataKey { - OpSeen(BytesN<32>), -} - pub fn touch_instance(env: &Env) { env.storage() .instance() @@ -98,12 +91,8 @@ pub fn set_paused(env: &Env, paused: bool) { env.storage().instance().set(&DataKey::Paused, &paused); } -pub fn set_deployment_seq(env: &Env, seq: u32) { - env.storage().instance().set(&DataKey::DeploymentSeq, &seq); -} - // ============================================================ -// VERSION / UPGRADE / MIGRATION (instance; H6) +// VERSION / UPGRADE / MIGRATION (instance) // ============================================================ pub fn get_version(env: &Env) -> Option { env.storage().instance().get(&DataKey::Version) @@ -177,17 +166,10 @@ pub fn set_earnings(env: &Env, user: &Address, token: &Address, amount: i128) { // IDEMPOTENCY (temporary; auto-TTL) // ============================================================ pub fn is_op_seen(env: &Env, domain: &Address, op_id: &BytesN<32>) -> bool { - let scoped_seen = env - .storage() + env.storage() .temporary() .get(&DataKey::OpSeen(domain.clone(), op_id.clone())) - .unwrap_or(false); - scoped_seen - || env - .storage() - .temporary() - .get(&LegacyDataKey::OpSeen(op_id.clone())) - .unwrap_or(false) + .unwrap_or(false) } pub fn mark_op_seen(env: &Env, domain: &Address, op_id: &BytesN<32>) { diff --git a/contracts/profile/src/tests/admin.rs b/contracts/profile/src/tests/admin.rs index 635c7fb..beca166 100644 --- a/contracts/profile/src/tests/admin.rs +++ b/contracts/profile/src/tests/admin.rs @@ -18,10 +18,10 @@ const PENDING_UPGRADE_TTL_LEDGERS: u32 = 518_400; fn initializes_with_expected_config() { let ctx = setup(); assert_eq!(ctx.client.get_admin(), ctx.admin); - assert_eq!(ctx.client.is_paused(), false); + assert!(!ctx.client.is_paused()); assert_eq!(ctx.client.get_events_contract(), None); assert_eq!(ctx.client.get_pending_events_contract(), None); - assert_eq!(ctx.client.version(), String::from_str(&ctx.env, "1.2.0")); + assert_eq!(ctx.client.version(), String::from_str(&ctx.env, "1.2.1")); assert_eq!(ctx.client.get_pending_upgrade(), None); assert_eq!(ctx.client.get_migrated_to_version(), None); } @@ -30,9 +30,9 @@ fn initializes_with_expected_config() { fn pause_and_unpause_round_trip() { let ctx = setup(); ctx.client.pause(); - assert_eq!(ctx.client.is_paused(), true); + assert!(ctx.client.is_paused()); ctx.client.unpause(); - assert_eq!(ctx.client.is_paused(), false); + assert!(!ctx.client.is_paused()); } // ============================================================ @@ -57,8 +57,7 @@ fn second_set_events_contract_reverts_already_configured() { let err = ctx .client .try_set_events_contract(&events_b) - .err() - .expect("expected second set to fail") + .expect_err("expected second set to fail") .unwrap(); assert_eq!(err, Error::EventsContractAlreadyConfigured); } @@ -100,8 +99,7 @@ fn accept_before_timelock_reverts() { let err = ctx .client .try_accept_events_contract() - .err() - .expect("expected timelock to block") + .expect_err("expected timelock to block") .unwrap(); assert_eq!(err, Error::PendingEventsContractTimelock); assert_eq!(ctx.client.get_events_contract(), Some(events_a)); @@ -123,8 +121,7 @@ fn accept_after_expiry_reverts_and_admin_must_cancel_to_prune() { let err = ctx .client .try_accept_events_contract() - .err() - .expect("expected expiry to block") + .expect_err("expected expiry to block") .unwrap(); assert_eq!(err, Error::PendingEventsContractExpired); @@ -156,8 +153,7 @@ fn cancel_with_no_pending_reverts() { let err = ctx .client .try_cancel_pending_events_contract() - .err() - .expect("expected mismatch") + .expect_err("expected mismatch") .unwrap(); assert_eq!(err, Error::PendingEventsContractMismatch); } @@ -189,19 +185,28 @@ fn propose_upgrade_records_pending() { } #[test] -fn apply_upgrade_before_timelock_reverts_profile() { +fn apply_upgrade_waits_out_the_timelock_profile() { let ctx = setup(); let new_hash: BytesN<32> = BytesN::random(&ctx.env); let new_version = String::from_str(&ctx.env, "0.3.0"); ctx.client.propose_upgrade(&new_hash, &new_version); - let err = ctx - .client - .try_apply_upgrade() - .err() - .expect("timelock blocks") - .unwrap(); - assert_eq!(err, Error::UpgradeTimelockNotElapsed); + let pending = ctx.client.get_pending_upgrade().expect("proposal"); + assert_eq!( + pending.available_at_ledger, + pending.proposed_at_ledger + UPGRADE_TIMELOCK_LEDGERS + ); + assert_eq!( + ctx.client.try_apply_upgrade().err().unwrap().unwrap(), + Error::UpgradeTimelockNotElapsed + ); + ctx.env.ledger().with_mut(|li| { + li.sequence_number = pending.available_at_ledger - 1; + }); + assert_eq!( + ctx.client.try_apply_upgrade().err().unwrap().unwrap(), + Error::UpgradeTimelockNotElapsed + ); } #[test] @@ -219,8 +224,7 @@ fn apply_upgrade_after_expiry_reverts_profile() { let err = ctx .client .try_apply_upgrade() - .err() - .expect("expiry blocks") + .expect_err("expiry blocks") .unwrap(); assert_eq!(err, Error::UpgradeProposalExpired); } @@ -232,14 +236,13 @@ fn migrate_marks_version_and_blocks_replay_profile() { ctx.client.migrate(); assert_eq!( ctx.client.get_migrated_to_version(), - Some(String::from_str(&ctx.env, "1.2.0")) + Some(String::from_str(&ctx.env, "1.2.1")) ); let err = ctx .client .try_migrate() - .err() - .expect("second migrate rejected") + .expect_err("second migrate rejected") .unwrap(); assert_eq!(err, Error::MigrationAlreadyApplied); } @@ -248,7 +251,7 @@ fn migrate_marks_version_and_blocks_replay_profile() { // AUTH REGRESSION GUARDS (#73) // // Mirror of the events-contract guards in -// contracts/events/src/tests/admin.rs โ€” see that file for the rationale. +// contracts/events/src/tests/admin.rs; see that file for the rationale. // ============================================================ #[test] @@ -387,7 +390,7 @@ fn migrate_reverts_without_admin_auth() { } // ============================================================ -// ACCEPT_ADMIN โ€” target-auth guard +// ACCEPT_ADMIN: target-auth guard // // accept_admin does not call require_admin(); it authorizes against the // pending target address instead (pending.target.require_auth()). These diff --git a/contracts/profile/src/tests/bootstrap.rs b/contracts/profile/src/tests/bootstrap.rs index 5f12a37..ae6b289 100644 --- a/contracts/profile/src/tests/bootstrap.rs +++ b/contracts/profile/src/tests/bootstrap.rs @@ -63,8 +63,7 @@ fn bootstrap_self_rejects_a_replayed_op_id() { let err = ctx .client .try_bootstrap_self(&user, &op_id) - .err() - .expect("a replayed op_id must be rejected") + .expect_err("a replayed op_id must be rejected") .unwrap(); assert_eq!(err, Error::OpAlreadySeen); } diff --git a/contracts/profile/src/tests/common.rs b/contracts/profile/src/tests/common.rs index 8ef2c6f..db3445c 100644 --- a/contracts/profile/src/tests/common.rs +++ b/contracts/profile/src/tests/common.rs @@ -5,7 +5,6 @@ use soroban_sdk::{testutils::Address as _, Address, Env}; use crate::{ProfileContract, ProfileContractClient}; pub struct TestCtx<'a> { - #[allow(dead_code)] pub env: Env, pub admin: Address, pub client: ProfileContractClient<'a>, diff --git a/contracts/profile/src/tests/earnings.rs b/contracts/profile/src/tests/earnings.rs index 4ee4c25..e515e2f 100644 --- a/contracts/profile/src/tests/earnings.rs +++ b/contracts/profile/src/tests/earnings.rs @@ -99,8 +99,7 @@ fn register_earnings_rejects_zero() { let err = ctx .client .try_register_earnings(&u, &t, &0_i128, &BytesN::random(&ctx.env)) - .err() - .expect("call should fail") + .expect_err("call should fail") .unwrap(); assert_eq!(err, Error::InvalidAmount); } @@ -116,8 +115,7 @@ fn register_earnings_rejects_negative() { let err = ctx .client .try_register_earnings(&u, &t, &(-100_i128), &BytesN::random(&ctx.env)) - .err() - .expect("call should fail") + .expect_err("call should fail") .unwrap(); assert_eq!(err, Error::InvalidAmount); } @@ -131,8 +129,7 @@ fn register_earnings_reverts_no_events_contract() { let err = ctx .client .try_register_earnings(&u, &t, &100_i128, &BytesN::random(&ctx.env)) - .err() - .expect("call should fail") + .expect_err("call should fail") .unwrap(); assert_eq!(err, Error::EventsContractNotConfigured); } @@ -149,8 +146,7 @@ fn register_earnings_reverts_when_paused() { let err = ctx .client .try_register_earnings(&u, &t, &100_i128, &BytesN::random(&ctx.env)) - .err() - .expect("call should fail") + .expect_err("call should fail") .unwrap(); assert_eq!(err, Error::Paused); } @@ -170,8 +166,7 @@ fn register_earnings_rejects_duplicate_op_id() { let err = ctx .client .try_register_earnings(&u, &t, &200_i128, &op_id) - .err() - .expect("call should fail") + .expect_err("call should fail") .unwrap(); assert_eq!(err, Error::OpAlreadySeen); @@ -193,8 +188,7 @@ fn register_earnings_overflow_reverts() { let err = ctx .client .try_register_earnings(&u, &t, &1_i128, &BytesN::random(&ctx.env)) - .err() - .expect("overflow should revert") + .expect_err("overflow should revert") .unwrap(); assert_eq!(err, Error::EarningsOverflow); assert_eq!(ctx.client.get_earnings(&u, &t), i128::MAX); diff --git a/contracts/profile/src/tests/mod.rs b/contracts/profile/src/tests/mod.rs index 5dd4e45..2b695e2 100644 --- a/contracts/profile/src/tests/mod.rs +++ b/contracts/profile/src/tests/mod.rs @@ -1,5 +1,3 @@ -#![cfg(test)] - mod admin; mod bootstrap; mod common; diff --git a/contracts/profile/src/tests/reputation.rs b/contracts/profile/src/tests/reputation.rs index c63a8d1..7c28707 100644 --- a/contracts/profile/src/tests/reputation.rs +++ b/contracts/profile/src/tests/reputation.rs @@ -7,6 +7,7 @@ use soroban_sdk::{ use super::common::{setup, TestCtx}; use crate::errors::Error; +use crate::reputation::MAX_DELTA_PER_CALL; // ============================================================ // Helpers @@ -65,13 +66,33 @@ fn bump_accumulates_across_calls() { } #[test] -fn bump_accepts_u32_max_delta_without_overflow() { +fn bump_over_the_per_call_cap_is_refused() { let (ctx, user) = setup_with_user(); + for delta in [MAX_DELTA_PER_CALL + 1, u32::MAX] { + let err = ctx + .client + .try_bump_reputation(&user, &delta, &reason(&ctx), &op_id(&ctx)) + .expect_err("over-cap bump rejected") + .unwrap(); + assert_eq!(err, Error::DeltaTooLarge); + } + assert_eq!(reputation_of(&ctx, &user), 0); ctx.client - .bump_reputation(&user, &u32::MAX, &reason(&ctx), &op_id(&ctx)); + .bump_reputation(&user, &MAX_DELTA_PER_CALL, &reason(&ctx), &op_id(&ctx)); + assert_eq!(reputation_of(&ctx, &user), MAX_DELTA_PER_CALL as u64); +} - assert_eq!(reputation_of(&ctx, &user), u32::MAX as u64); +#[test] +fn a_refused_bump_leaves_its_op_id_unspent() { + let (ctx, user) = setup_with_user(); + let op = op_id(&ctx); + assert!(ctx + .client + .try_bump_reputation(&user, &(MAX_DELTA_PER_CALL + 1), &reason(&ctx), &op) + .is_err()); + ctx.client.bump_reputation(&user, &1, &reason(&ctx), &op); + assert_eq!(reputation_of(&ctx, &user), 1); } #[test] @@ -85,8 +106,7 @@ fn bump_zero_delta_is_noop_but_marks_seen() { let err = ctx .client .try_bump_reputation(&user, &0, &reason(&ctx), &op) - .err() - .expect("replay rejected") + .expect_err("replay rejected") .unwrap(); assert_eq!(err, Error::OpAlreadySeen); } @@ -99,8 +119,7 @@ fn bump_reverts_when_events_contract_not_configured() { let err = ctx .client .try_bump_reputation(&user, &1, &reason(&ctx), &op_id(&ctx)) - .err() - .expect("expected guard to reject") + .expect_err("expected guard to reject") .unwrap(); assert_eq!(err, Error::EventsContractNotConfigured); } @@ -113,8 +132,7 @@ fn bump_reverts_when_paused() { let err = ctx .client .try_bump_reputation(&user, &1, &reason(&ctx), &op_id(&ctx)) - .err() - .expect("expected pause to block") + .expect_err("expected pause to block") .unwrap(); assert_eq!(err, Error::Paused); } @@ -129,8 +147,7 @@ fn bump_reverts_when_profile_not_found() { let err = ctx .client .try_bump_reputation(&ghost, &1, &reason(&ctx), &op_id(&ctx)) - .err() - .expect("expected missing profile") + .expect_err("expected missing profile") .unwrap(); assert_eq!(err, Error::ProfileNotFound); } @@ -146,8 +163,7 @@ fn bump_is_idempotent_on_replay() { let err = ctx .client .try_bump_reputation(&user, &5, &reason(&ctx), &op) - .err() - .expect("replay rejected") + .expect_err("replay rejected") .unwrap(); assert_eq!(err, Error::OpAlreadySeen); assert_eq!(reputation_of(&ctx, &user), 5); @@ -169,116 +185,21 @@ fn bump_rejects_caller_without_events_contract_auth() { // ============================================================ #[test] -fn slash_happy_path_decrements_reputation() { +fn admin_slash_is_not_capped() { let (ctx, user) = setup_with_user(); - ctx.client - .bump_reputation(&user, &10, &reason(&ctx), &op_id(&ctx)); - - ctx.client - .slash_reputation(&user, &4, &reason(&ctx), &op_id(&ctx)); - - assert_eq!(reputation_of(&ctx, &user), 6); -} - -#[test] -fn slash_saturates_at_zero() { - let (ctx, user) = setup_with_user(); - ctx.client - .bump_reputation(&user, &5, &reason(&ctx), &op_id(&ctx)); - - ctx.client - .slash_reputation(&user, &10, &reason(&ctx), &op_id(&ctx)); - + for _ in 0..3 { + ctx.client + .bump_reputation(&user, &MAX_DELTA_PER_CALL, &reason(&ctx), &op_id(&ctx)); + } + ctx.client.admin_slash_reputation( + &user, + &u32::MAX, + &String::from_str(&ctx.env, "farmed reputation"), + &op_id(&ctx), + ); assert_eq!(reputation_of(&ctx, &user), 0); } -#[test] -fn slash_zero_delta_is_noop() { - let (ctx, user) = setup_with_user(); - ctx.client - .bump_reputation(&user, &3, &reason(&ctx), &op_id(&ctx)); - - ctx.client - .slash_reputation(&user, &0, &reason(&ctx), &op_id(&ctx)); - - assert_eq!(reputation_of(&ctx, &user), 3); -} - -#[test] -fn slash_reverts_when_events_contract_not_configured() { - let ctx = setup(); - let user = Address::generate(&ctx.env); - - let err = ctx - .client - .try_slash_reputation(&user, &1, &reason(&ctx), &op_id(&ctx)) - .err() - .expect("expected guard to reject") - .unwrap(); - assert_eq!(err, Error::EventsContractNotConfigured); -} - -#[test] -fn slash_reverts_when_paused() { - let (ctx, user) = setup_with_user(); - ctx.client.pause(); - - let err = ctx - .client - .try_slash_reputation(&user, &1, &reason(&ctx), &op_id(&ctx)) - .err() - .expect("expected pause to block") - .unwrap(); - assert_eq!(err, Error::Paused); -} - -#[test] -fn slash_reverts_when_profile_not_found() { - let ctx = setup(); - let events = Address::generate(&ctx.env); - ctx.client.set_events_contract(&events); - - let ghost = Address::generate(&ctx.env); - let err = ctx - .client - .try_slash_reputation(&ghost, &1, &reason(&ctx), &op_id(&ctx)) - .err() - .expect("expected missing profile") - .unwrap(); - assert_eq!(err, Error::ProfileNotFound); -} - -#[test] -fn slash_is_idempotent_on_replay() { - let (ctx, user) = setup_with_user(); - ctx.client - .bump_reputation(&user, &10, &reason(&ctx), &op_id(&ctx)); - let op = op_id(&ctx); - - ctx.client.slash_reputation(&user, &4, &reason(&ctx), &op); - assert_eq!(reputation_of(&ctx, &user), 6); - - let err = ctx - .client - .try_slash_reputation(&user, &4, &reason(&ctx), &op) - .err() - .expect("replay rejected") - .unwrap(); - assert_eq!(err, Error::OpAlreadySeen); - assert_eq!(reputation_of(&ctx, &user), 6); -} - -#[test] -fn slash_rejects_caller_without_events_contract_auth() { - let (ctx, user) = setup_with_user(); - - ctx.env.mock_auths(&[]); - let res = ctx - .client - .try_slash_reputation(&user, &1, &reason(&ctx), &op_id(&ctx)); - assert!(res.is_err(), "unauthorized slash must be rejected"); -} - // ============================================================ // admin_slash // ============================================================ @@ -319,8 +240,7 @@ fn admin_slash_reverts_on_empty_reason() { let err = ctx .client .try_admin_slash_reputation(&user, &1, &empty, &op_id(&ctx)) - .err() - .expect("expected empty reason to reject") + .expect_err("expected empty reason to reject") .unwrap(); assert_eq!(err, Error::ReasonRequired); } @@ -333,8 +253,7 @@ fn admin_slash_reverts_when_paused() { let err = ctx .client .try_admin_slash_reputation(&user, &1, &admin_reason(&ctx), &op_id(&ctx)) - .err() - .expect("expected pause to block") + .expect_err("expected pause to block") .unwrap(); assert_eq!(err, Error::Paused); } @@ -347,8 +266,7 @@ fn admin_slash_reverts_when_profile_not_found() { let err = ctx .client .try_admin_slash_reputation(&ghost, &1, &admin_reason(&ctx), &op_id(&ctx)) - .err() - .expect("expected missing profile") + .expect_err("expected missing profile") .unwrap(); assert_eq!(err, Error::ProfileNotFound); } @@ -367,8 +285,7 @@ fn admin_slash_is_idempotent_on_replay() { let err = ctx .client .try_admin_slash_reputation(&user, &3, &admin_reason(&ctx), &op) - .err() - .expect("replay rejected") + .expect_err("replay rejected") .unwrap(); assert_eq!(err, Error::OpAlreadySeen); assert_eq!(reputation_of(&ctx, &user), 7); diff --git a/contracts/profile/src/types.rs b/contracts/profile/src/types.rs index 030457f..39614b8 100644 --- a/contracts/profile/src/types.rs +++ b/contracts/profile/src/types.rs @@ -52,7 +52,6 @@ pub enum DataKey { EventsContract, PendingEventsContract, Paused, - DeploymentSeq, Profile(Address), EarningsByToken(Address, Address), diff --git a/deploy_and_upgrade.sh b/deploy_and_upgrade.sh index 6c050f4..7535d58 100755 --- a/deploy_and_upgrade.sh +++ b/deploy_and_upgrade.sh @@ -1,258 +1,211 @@ #!/bin/bash - -# Boundless contract deploy + upgrade helper. -# -# Usage: -# ./deploy_and_upgrade.sh deploy [network] [source_account] -# Build + deploy a fresh contract (one of: events, profile). -# The constructor must be supplied via env vars; see the runbook. -# -# ./deploy_and_upgrade.sh propose-upgrade \ -# [network] [source_account] -# Build, upload the new wasm, then call propose_upgrade(wasm_hash, -# new_version). The timelock (~1 day) starts now. # -# ./deploy_and_upgrade.sh apply-upgrade [network] [source_account] -# After the timelock has elapsed (and before expires_at_ledger), call -# apply_upgrade(). The contract swaps to the proposed wasm and bumps -# its on-chain version label. +# Testnet upgrade helper for boundless-events and boundless-profile. # -# ./deploy_and_upgrade.sh cancel-pending-upgrade \ -# [network] [source_account] -# Admin prunes a stale proposal so a fresh one can be queued. +# Usage: ./deploy_and_upgrade.sh [network] [source] # -# ./deploy_and_upgrade.sh migrate [network] [source_account] -# Admin runs the post-upgrade one-shot migration for the current -# Version. Guarded by MigratedToVersion so a second call rejects with -# MigrationAlreadyApplied. +# The network is always argument 4 (default testnet) and the source identity +# argument 5 (default: deployer_identity in deployments/.json). Pass +# "-" as argument 3 when the action takes none. Contract ids come from +# deployments/.json, which scripts/deploy/deploy.sh writes. # -# ./deploy_and_upgrade.sh status [network] -# Print on-chain version + pending upgrade + migrated-to version. +# propose-upgrade build with --features testnet, upload, +# propose_upgrade(wasm_hash, version) +# apply-upgrade - apply_upgrade(); testnet builds have no +# timelock, so this can follow the proposal +# cancel-pending-upgrade - drop a queued proposal +# migrate-events events - migrate_events in pages of 8 until it +# reports 0 remaining +# migrate - migrate(); events refuses while +# migrate_events has rows left +# status - version, pending upgrade, migration marker # -# Spec: docs/mainnet-deploy-runbook.md -# docs/audit-2026-06-stellar-skill.md (H6 timelocked upgrade) +# Fresh deploys: scripts/deploy/deploy.sh. Mainnet: deploy_mainnet.sh and +# docs/upgrade-runbook.md. set -euo pipefail -ACTION=${1:-"status"} -CONTRACT_KIND=${2:-"events"} -NETWORK=${4:-"testnet"} -SOURCE_ACCOUNT=${5:-"alice"} +ACTION=${1:-} +CONTRACT_KIND=${2:-} +ARG3=${3:--} +NETWORK=${4:-testnet} +SOURCE_ACCOUNT=${5:-} GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' -if ! command -v stellar &> /dev/null; then - echo -e "${RED}Error: stellar CLI is not installed.${NC}" - echo "Install from https://soroban.stellar.org/docs/getting-started/setup" - exit 1 -fi +REPO_ROOT="$(cd "$(dirname "$0")" && pwd)" +RECORD="$REPO_ROOT/deployments/$NETWORK.json" +UPGRADE_LOG="$REPO_ROOT/deployments/$NETWORK-upgrades.jsonl" -case "$CONTRACT_KIND" in - events) - WASM_PATH="target/wasm32v1-none/release/boundless_events.wasm" - CONTRACT_ID_FILE=".stellar/events_contract_id_${NETWORK}.txt" - ;; - profile) - WASM_PATH="target/wasm32v1-none/release/boundless_profile.wasm" - CONTRACT_ID_FILE=".stellar/profile_contract_id_${NETWORK}.txt" - ;; - *) - echo -e "${RED}Unknown contract kind '$CONTRACT_KIND'. Use 'events' or 'profile'.${NC}" - exit 1 - ;; -esac - -build_contract() { - echo "Building $CONTRACT_KIND..." - # Testnet builds enable the `testnet` feature โ†’ zero upgrade timelock for - # fast iteration. Both events and profile expose this feature. Mainnet (and - # any non-testnet build) MUST omit it; the default keeps the full - # audit-mandated timelock, so this fails safe. - if [ "$NETWORK" = "testnet" ]; then - stellar contract build --locked --package "boundless-$CONTRACT_KIND" --features testnet - else - stellar contract build --locked - fi +die() { + echo -e "${RED}$*${NC}" >&2 + exit 1 } -read_contract_id() { - # Errors go to stderr so callers using $(read_contract_id) don't capture - # the diagnostic into the variable. - if [ ! -f "$CONTRACT_ID_FILE" ]; then - echo -e "${RED}Contract id file $CONTRACT_ID_FILE not found.${NC}" >&2 - echo "Run 'deploy' first or create the file manually with the C-address." >&2 - exit 1 - fi - cat "$CONTRACT_ID_FILE" +usage() { + sed -n '3,24p' "$0" | sed 's/^# \{0,1\}//' >&2 + exit 1 } -deploy_contract() { - echo -e "${YELLOW}Deploying boundless-$CONTRACT_KIND to $NETWORK...${NC}" - build_contract - - # Constructor args are runbook-specific. We refuse to invent defaults so - # an accidental rerun cannot reinitialize the contract with wrong values. - echo -e "${YELLOW}NOTE: This script does NOT pass constructor args.${NC}" - echo "After the deploy succeeds, invoke the constructor manually per the runbook:" - echo " docs/mainnet-deploy-runbook.md (events: admin, fee_account, fee_bps, profile_contract)" - echo " docs/mainnet-deploy-runbook.md (profile: admin)" - echo "" - - CONTRACT_ID=$(stellar contract deploy \ - --wasm "$WASM_PATH" \ - --source "$SOURCE_ACCOUNT" \ - --network "$NETWORK") - - mkdir -p .stellar - echo "$CONTRACT_ID" > "$CONTRACT_ID_FILE" - echo -e "${GREEN}Deployed.${NC}" - echo "Contract id: $CONTRACT_ID" - echo "Saved to: $CONTRACT_ID_FILE" -} +[ "$ACTION" != deploy ] || \ + die "deploy moved to ./scripts/deploy/deploy.sh , which passes the constructor arguments" +[ -n "$ACTION" ] && [ -n "$CONTRACT_KIND" ] || usage -propose_upgrade() { - # Usage check: needs new_version arg in slot 3. - local NEW_VERSION=${3:-""} - if [ -z "$NEW_VERSION" ]; then - echo -e "${RED}propose-upgrade requires in arg 3.${NC}" - echo "Example: ./deploy_and_upgrade.sh propose-upgrade events 0.3.0 testnet alice" - exit 1 - fi +case "$NETWORK" in + testnet | futurenet) ;; + mainnet) die "mainnet is governed by the multisig: use ./deploy_mainnet.sh (docs/upgrade-runbook.md)" ;; + *) die "network must be testnet or futurenet (got: $NETWORK)" ;; +esac - echo -e "${YELLOW}Proposing upgrade for boundless-$CONTRACT_KIND on $NETWORK to $NEW_VERSION...${NC}" - build_contract +case "$CONTRACT_KIND" in + events | profile) ;; + *) die "unknown contract kind '$CONTRACT_KIND'; use events or profile" ;; +esac - local CONTRACT_ID - CONTRACT_ID=$(read_contract_id) +command -v stellar >/dev/null 2>&1 || die "stellar CLI is not installed" +command -v jq >/dev/null 2>&1 || die "jq is not installed" +[ -f "$RECORD" ] || die "no deployment record at $RECORD; deploy with scripts/deploy/deploy.sh first" - echo "Uploading new wasm..." - local WASM_HASH - WASM_HASH=$(stellar contract upload \ - --source-account "$SOURCE_ACCOUNT" \ - --wasm "$WASM_PATH" \ - --network "$NETWORK") - echo "New wasm hash: $WASM_HASH" +CONTRACT_ID="$(jq -r --arg k "${CONTRACT_KIND}_contract" '.[$k] // empty' "$RECORD")" +[ -n "$CONTRACT_ID" ] || die "${CONTRACT_KIND}_contract missing from $RECORD" +if [ -z "$SOURCE_ACCOUNT" ]; then + SOURCE_ACCOUNT="$(jq -r '.deployer_identity // empty' "$RECORD")" +fi +[ -n "$SOURCE_ACCOUNT" ] || die "pass the admin identity as argument 5 (no deployer_identity in $RECORD)" +WASM_PATH="$REPO_ROOT/target/wasm32v1-none/release/boundless_${CONTRACT_KIND}.wasm" - echo "Calling propose_upgrade..." +invoke() { stellar contract invoke \ --id "$CONTRACT_ID" \ --source "$SOURCE_ACCOUNT" \ --network "$NETWORK" \ - -- \ - propose_upgrade \ - --new_wasm_hash "$WASM_HASH" \ - --new_version "$NEW_VERSION" - - echo -e "${GREEN}Proposal recorded.${NC}" - echo "The timelock is ~1 day at 5s/ledger (17_280 ledgers)." - echo "Run 'apply-upgrade' once the timelock has elapsed." - echo "Run 'status' to inspect available_at / expires_at ledger sequence." + -- "$@" } -apply_upgrade() { - echo -e "${YELLOW}Applying queued upgrade for boundless-$CONTRACT_KIND on $NETWORK...${NC}" - local CONTRACT_ID - CONTRACT_ID=$(read_contract_id) - +read_call() { stellar contract invoke \ --id "$CONTRACT_ID" \ --source "$SOURCE_ACCOUNT" \ --network "$NETWORK" \ - -- \ - apply_upgrade + --send no \ + -- "$@" +} - echo -e "${GREEN}Upgrade applied.${NC}" - echo "Run 'status' to confirm the new version label." - echo "Run 'migrate' if the upgrade requires a data migration." +record_set() { + local tmp + tmp="$(mktemp)" + jq --arg k "$1" --arg v "$2" '.[$k] = $v' "$RECORD" > "$tmp" + mv "$tmp" "$RECORD" } -cancel_pending_upgrade() { - echo -e "${YELLOW}Cancelling pending upgrade for boundless-$CONTRACT_KIND on $NETWORK...${NC}" - local CONTRACT_ID - CONTRACT_ID=$(read_contract_id) +log_op() { + jq -nc \ + --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ + --arg op "$1" \ + --arg contract "$CONTRACT_KIND" \ + --arg contract_id "$CONTRACT_ID" \ + --arg version "${2:-}" \ + --arg wasm_hash "${3:-}" \ + '{ts: $ts, op: $op, contract: $contract, contract_id: $contract_id, version: $version, wasm_hash: $wasm_hash}' \ + >> "$UPGRADE_LOG" +} - stellar contract invoke \ - --id "$CONTRACT_ID" \ - --source "$SOURCE_ACCOUNT" \ +propose_upgrade() { + local new_version="$ARG3" meta_version wasm_hash + [ "$new_version" != "-" ] || \ + die "propose-upgrade needs the new version as argument 3, e.g. ./deploy_and_upgrade.sh propose-upgrade events 2.1.0 testnet" + + echo -e "${YELLOW}Building boundless-$CONTRACT_KIND with --features testnet...${NC}" + "$REPO_ROOT/scripts/build-release.sh" --package "boundless-$CONTRACT_KIND" --features testnet + meta_version="$(stellar contract info meta --wasm "$WASM_PATH" --output json 2>/dev/null \ + | jq -r '[.[] | .sc_meta_v0? | select(.key == "version") | .val][0] // empty')" + [ "$meta_version" = "$new_version" ] || \ + die "the build reports version ${meta_version:-none} in its contractmeta, not $new_version" + + wasm_hash="$(stellar contract upload \ + --source-account "$SOURCE_ACCOUNT" \ --network "$NETWORK" \ - -- \ - cancel_pending_upgrade - echo -e "${GREEN}Pending upgrade cleared.${NC}" + --optimize=false \ + --wasm "$WASM_PATH")" + echo "Uploaded wasm: $wasm_hash" + + invoke propose_upgrade --new_wasm_hash "$wasm_hash" --new_version "$new_version" + log_op propose_upgrade "$new_version" "$wasm_hash" + echo -e "${GREEN}Proposed $CONTRACT_KIND $new_version.${NC} Testnet builds have no timelock; run apply-upgrade next." } -migrate() { - echo -e "${YELLOW}Running post-upgrade migrate for boundless-$CONTRACT_KIND on $NETWORK...${NC}" - local CONTRACT_ID - CONTRACT_ID=$(read_contract_id) +apply_upgrade() { + local pending version wasm_hash + pending="$(read_call get_pending_upgrade)" + [ "$pending" != "null" ] || die "no $CONTRACT_KIND upgrade is pending" + version="$(printf '%s' "$pending" | jq -r '.new_version')" + wasm_hash="$(printf '%s' "$pending" | jq -r '.wasm_hash')" + + invoke apply_upgrade + record_set "${CONTRACT_KIND}_version" "$version" + record_set "${CONTRACT_KIND}_wasm_hash" "$wasm_hash" + record_set upgraded_at "$(date -u +%Y-%m-%dT%H:%M:%SZ)" + log_op apply_upgrade "$version" "$wasm_hash" + echo -e "${GREEN}Applied $CONTRACT_KIND $version.${NC}" + if [ "$CONTRACT_KIND" = events ]; then + echo "Next: migrate-events, then migrate." + else + echo "Next: migrate." + fi +} - stellar contract invoke \ - --id "$CONTRACT_ID" \ - --source "$SOURCE_ACCOUNT" \ - --network "$NETWORK" \ - -- \ - migrate - echo -e "${GREEN}Migrate completed.${NC}" +cancel_pending_upgrade() { + invoke cancel_pending_upgrade + log_op cancel_pending_upgrade + echo -e "${GREEN}Pending $CONTRACT_KIND upgrade cancelled.${NC}" +} + +migrate_events() { + [ "$CONTRACT_KIND" = events ] || die "migrate-events applies to the events contract only" + local remaining calls=0 + while :; do + remaining="$(invoke migrate_events --max_events 8 | tr -d '"')" + [[ "$remaining" =~ ^[0-9]+$ ]] || die "migrate_events returned '$remaining'" + calls=$((calls + 1)) + echo "migrate_events call $calls: $remaining remaining" + [ "$remaining" -gt 0 ] || break + done + log_op migrate_events "" "" + echo -e "${GREEN}migrate_events done after $calls call(s).${NC} Run migrate next." +} + +migrate() { + local version + invoke migrate + version="$(read_call version | tr -d '"')" + record_set "${CONTRACT_KIND}_migrated_to_version" "$version" + log_op migrate "$version" + echo -e "${GREEN}$CONTRACT_KIND migrated to $version.${NC}" } show_status() { - local CONTRACT_ID - CONTRACT_ID=$(read_contract_id) - echo -e "${YELLOW}Status for boundless-$CONTRACT_KIND on $NETWORK${NC}" - echo "Contract id: $CONTRACT_ID" - echo "" - echo "On-chain version:" - stellar contract invoke \ - --id "$CONTRACT_ID" \ - --source "$SOURCE_ACCOUNT" \ - --network "$NETWORK" \ - --send no \ - -- \ - version || true - echo "" - echo "Pending upgrade (if any):" - stellar contract invoke \ - --id "$CONTRACT_ID" \ - --source "$SOURCE_ACCOUNT" \ - --network "$NETWORK" \ - --send no \ - -- \ - get_pending_upgrade || true - echo "" - echo "Last migrated-to version:" - stellar contract invoke \ - --id "$CONTRACT_ID" \ - --source "$SOURCE_ACCOUNT" \ - --network "$NETWORK" \ - --send no \ - -- \ - get_migrated_to_version || true + echo -e "${YELLOW}boundless-$CONTRACT_KIND on $NETWORK: $CONTRACT_ID${NC}" + echo "version: $(read_call version || echo '(read failed)')" + echo "migrated_to_version: $(read_call get_migrated_to_version || echo '(read failed)')" + echo "pending_upgrade: $(read_call get_pending_upgrade || echo '(read failed)')" + echo "is_paused: $(read_call is_paused || echo '(read failed)')" + if [ "$CONTRACT_KIND" = events ]; then + echo "release_validator: $(read_call get_release_validator || echo '(read failed)')" + fi } case "$ACTION" in - deploy) deploy_contract ;; - propose-upgrade) propose_upgrade "$@" ;; - apply-upgrade) apply_upgrade ;; + propose-upgrade) propose_upgrade ;; + apply-upgrade) apply_upgrade ;; cancel-pending-upgrade) cancel_pending_upgrade ;; - migrate) migrate ;; - status) show_status ;; - upgrade) - echo -e "${RED}'upgrade' is gone. The 2026-06 audit replaced it with a timelock flow:${NC}" - echo " 1. propose-upgrade " - echo " 2. wait ~1 day (the on-chain UPGRADE_TIMELOCK_LEDGERS)" - echo " 3. apply-upgrade " - echo " 4. migrate (if the upgrade ships storage changes)" - echo "" - echo "See docs/audit-2026-06-stellar-skill.md (H6) for the rationale." - exit 1 - ;; + migrate-events) migrate_events ;; + migrate) migrate ;; + status) show_status ;; *) - echo -e "${RED}Unknown action '$ACTION'.${NC}" - echo "Use: deploy | propose-upgrade | apply-upgrade | cancel-pending-upgrade | migrate | status" - exit 1 + echo -e "${RED}Unknown action '$ACTION'.${NC}" >&2 + usage ;; esac - -echo -e "${GREEN}Done.${NC}" diff --git a/deploy_mainnet.sh b/deploy_mainnet.sh index a716e30..66de233 100755 --- a/deploy_mainnet.sh +++ b/deploy_mainnet.sh @@ -1,39 +1,47 @@ #!/bin/bash # -# Boundless mainnet deploy script. +# Mainnet deploy and upgrade tool for boundless-events and boundless-profile. # -# This is a separate script from deploy_and_upgrade.sh because mainnet deploys -# need stronger guards (explicit confirmation, env var validation, paired -# deploy of profile + events, multi-sig rotation flow) than the testnet -# scripted path can carry safely. +# The deploy commands sign with INITIAL_ADMIN_KEY, a throwaway deployer that +# hands admin to the multisig and is then destroyed. Every command that acts as +# the admin of a live contract only builds and simulates an unsigned XDR for +# the 2-of-3 multisig; nothing here submits an admin transaction. # -# Companion: boundless-contract/docs/mainnet-deploy-runbook.md +# Procedures: docs/DEPLOYMENT.md (fresh deploy), docs/upgrade-runbook.md. # # Usage: # ./deploy_mainnet.sh deploy-profile # ./deploy_mainnet.sh deploy-events -# ./deploy_mainnet.sh register-token +# ./deploy_mainnet.sh register-token # ./deploy_mainnet.sh rotate-admin -# ./deploy_mainnet.sh upload-profile-wasm -# ./deploy_mainnet.sh upload-events-wasm +# ./deploy_mainnet.sh upload-profile-wasm +# ./deploy_mainnet.sh upload-events-wasm # ./deploy_mainnet.sh prepare-pause-profile # ./deploy_mainnet.sh prepare-pause-events -# ./deploy_mainnet.sh prepare-propose-upgrade-profile -# ./deploy_mainnet.sh prepare-propose-upgrade-events -# ./deploy_mainnet.sh verify-proposed-upgrade-profile -# ./deploy_mainnet.sh verify-proposed-upgrade-events -# ./deploy_mainnet.sh prepare-apply-upgrade-profile -# ./deploy_mainnet.sh prepare-apply-upgrade-events -# ./deploy_mainnet.sh prepare-migrate-upgrade-profile -# ./deploy_mainnet.sh prepare-migrate-upgrade-events +# ./deploy_mainnet.sh prepare-propose-upgrade-profile +# ./deploy_mainnet.sh prepare-propose-upgrade-events +# ./deploy_mainnet.sh verify-proposed-upgrade-profile +# ./deploy_mainnet.sh verify-proposed-upgrade-events +# ./deploy_mainnet.sh prepare-apply-upgrade-profile +# ./deploy_mainnet.sh prepare-apply-upgrade-events +# ./deploy_mainnet.sh prepare-migrate-events-page +# ./deploy_mainnet.sh prepare-migrate-upgrade-profile +# ./deploy_mainnet.sh prepare-migrate-upgrade-events # ./deploy_mainnet.sh prepare-cancel-upgrade-profile # ./deploy_mainnet.sh prepare-cancel-upgrade-events -# ./deploy_mainnet.sh prepare-unpause-profile -# ./deploy_mainnet.sh prepare-unpause-events -# ./deploy_mainnet.sh verify-upgrade-profile -# ./deploy_mainnet.sh verify-upgrade-events +# ./deploy_mainnet.sh prepare-unpause-profile +# ./deploy_mainnet.sh prepare-unpause-events +# ./deploy_mainnet.sh verify-upgrade-profile +# ./deploy_mainnet.sh verify-upgrade-events # ./deploy_mainnet.sh upgrade-status # ./deploy_mainnet.sh verify +# +# Environment: +# STELLAR_NETWORK name of a configured network using the public passphrase +# ADMIN_SOURCE current admin G-address (the multisig); also the read source +# EVENTS_ID, PROFILE_ID default to the local record deployments/mainnet.json +# UPLOAD_SOURCE any funded CLI identity, for upload-*-wasm +# INITIAL_ADMIN_KEY, FEE_ACCOUNT, INITIAL_GLOBAL_FEE_BPS deploy commands only set -euo pipefail @@ -48,12 +56,9 @@ NC='\033[0m' NETWORK="${STELLAR_NETWORK:-}" NETWORK_PASSPHRASE="Public Global Stellar Network ; September 2015" -REQUIRED_STELLAR_CLI_VERSION="27.0.0" -SDK27_EVENTS_VERSION="1.5.0" -SDK27_EVENTS_WASM_HASH="31b27e9d5fe554e0710161dd9387693e166bdd755d985a9771b1ed71b9e28321" -SDK27_PROFILE_VERSION="1.2.0" -SDK27_PROFILE_WASM_HASH="d2d025d0f7c2c29e6dbd95401841cf62b8b61be608c48615cffb5934050890c0" -DEPLOYMENTS_DIR="$(cd "$(dirname "$0")" && pwd)/deployments" +REQUIRED_STELLAR_CLI_VERSION="28.1.0" +REPO_ROOT="$(cd "$(dirname "$0")" && pwd)" +DEPLOYMENTS_DIR="$REPO_ROOT/deployments" DEPLOYMENT_FILE="$DEPLOYMENTS_DIR/mainnet.json" err() { @@ -87,6 +92,12 @@ require_env() { fi } +require_version_arg() { + local version="$1" + [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || \ + err "version must look like 2.0.0; got '$version'" +} + require_cli() { [ -n "$NETWORK" ] || \ err "set STELLAR_NETWORK to the configured mainnet network name" @@ -133,132 +144,92 @@ hash_wasm() { } deployed_wasm_hash() { - local contract_id="$1" - stellar contract info hash \ - --network "$NETWORK" \ - --contract-id "$contract_id" -} - -assert_local_wasm_hash() { - local label="$1" wasm="$2" expected="$3" - local actual - actual="$(hash_wasm "$wasm")" - [ "$actual" = "$expected" ] || \ - err "$label artifact hash mismatch: expected $expected, got $actual" -} - -assert_deployed_wasm_hash() { - local label="$1" contract_id="$2" expected="$3" - local actual - actual="$(deployed_wasm_hash "$contract_id")" || \ - err "could not read deployed $label WASM hash" - [ "$actual" = "$expected" ] || \ - err "deployed $label WASM hash mismatch: expected $expected, got $actual" + stellar contract info hash --network "$NETWORK" --contract-id "$1" } -assert_sdk27_profile_artifact() { - local wasm="$1" version="$2" - if [ "$version" = "$SDK27_PROFILE_VERSION" ]; then - assert_local_wasm_hash "profile SDK 27" "$wasm" "$SDK27_PROFILE_WASM_HASH" - fi -} - -assert_sdk27_events_artifact() { - local wasm="$1" version="$2" - if [ "$version" = "$SDK27_EVENTS_VERSION" ]; then - assert_local_wasm_hash "events SDK 27" "$wasm" "$SDK27_EVENTS_WASM_HASH" - fi -} - -assert_profile_sdk27_wasm_live() { - assert_deployed_wasm_hash "profile SDK 27" "$1" "$SDK27_PROFILE_WASM_HASH" -} - -assert_events_sdk27_wasm_live() { - assert_deployed_wasm_hash "events SDK 27" "$1" "$SDK27_EVENTS_WASM_HASH" -} - -assert_version_argument() { - local label="$1" actual="$2" expected="$3" - [ "$actual" = "$expected" ] || \ - err "$label version must be $expected for this pinned mainnet flow; got $actual" -} - -assert_unpause_version_argument() { - local label="$1" actual="$2" upgraded="$3" - case "$actual" in - "1.1.0"|"$upgraded") ;; - *) err "$label unpause version must be 1.1.0 for pre-apply recovery or $upgraded after upgrade; got $actual" ;; +# A wasm's kind is proven by an entry point only that contract exports, and its +# version by the contractmeta the build embeds, so a mislabelled or swapped +# artifact cannot be proposed under the wrong name. +assert_wasm_artifact() { + local kind="$1" wasm="$2" version="$3" + local marker meta_version + [ -f "$wasm" ] || err "wasm file not found: $wasm" + case "$kind" in + events) marker=create_event ;; + profile) marker=register_earnings ;; esac + stellar contract info interface --wasm "$wasm" --output json 2>/dev/null \ + | jq -e --arg f "$marker" 'any(.[]; .function_v0?.name == $f)' >/dev/null || \ + err "$wasm is not a boundless-$kind build (its interface has no $marker)" + meta_version="$(stellar contract info meta --wasm "$wasm" --output json 2>/dev/null \ + | jq -r '[.[] | .sc_meta_v0? | select(.key == "version") | .val][0] // empty')" || \ + err "could not read the contractmeta of $wasm" + [ -n "$meta_version" ] || err "$wasm has no contractmeta version" + [ "$meta_version" = "$version" ] || \ + err "$wasm reports version $meta_version in its contractmeta, not $version" } ensure_deployments_dir() { mkdir -p "$DEPLOYMENTS_DIR" if [ ! -f "$DEPLOYMENT_FILE" ]; then - echo "{\"network\":\"$NETWORK\",\"passphrase\":\"$NETWORK_PASSPHRASE\"}" > "$DEPLOYMENT_FILE" + echo "{\"network\":\"mainnet\",\"passphrase\":\"$NETWORK_PASSPHRASE\"}" > "$DEPLOYMENT_FILE" fi } deployment_get() { - local key="$1" - jq -r ".\"$key\" // empty" "$DEPLOYMENT_FILE" + jq -r --arg k "$1" '.[$k] // empty' "$DEPLOYMENT_FILE" } deployment_set() { - local key="$1" val="$2" local tmp tmp="$(mktemp)" - jq ".\"$key\" = \"$val\"" "$DEPLOYMENT_FILE" > "$tmp" + jq --arg k "$1" --arg v "$2" '.[$k] = $v' "$DEPLOYMENT_FILE" > "$tmp" mv "$tmp" "$DEPLOYMENT_FILE" } deployment_set_raw() { - local key="$1" val="$2" local tmp tmp="$(mktemp)" - jq ".\"$key\" = $val" "$DEPLOYMENT_FILE" > "$tmp" + jq --arg k "$1" --argjson v "$2" '.[$k] = $v' "$DEPLOYMENT_FILE" > "$tmp" mv "$tmp" "$DEPLOYMENT_FILE" } -events_contract_id() { - local events_id="${EVENTS_ID:-}" - if [ -z "$events_id" ] && [ -f "$DEPLOYMENT_FILE" ]; then - events_id="$(deployment_get events_contract)" - fi - [ -n "$events_id" ] || \ - err "events contract id missing; set EVENTS_ID or restore deployments/mainnet.json" - printf '%s\n' "$events_id" +append_upgrade_log() { + local action="$1" contract="$2" version="$3" wasm_hash="${4:-}" + ensure_deployments_dir + jq -nc \ + --arg timestamp "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ + --arg action "$action" \ + --arg contract "$contract" \ + --arg version "$version" \ + --arg wasm_hash "$wasm_hash" \ + '{timestamp: $timestamp, action: $action, contract: $contract, version: $version, wasm_hash: $wasm_hash}' \ + >> "$DEPLOYMENTS_DIR/mainnet-upgrades.jsonl" } -profile_contract_id() { - local profile_id="${PROFILE_ID:-}" - if [ -z "$profile_id" ] && [ -f "$DEPLOYMENT_FILE" ]; then - profile_id="$(deployment_get profile_contract)" +contract_id() { + local kind="$1" var id="" + case "$kind" in + events) var=EVENTS_ID ;; + profile) var=PROFILE_ID ;; + esac + id="${!var:-}" + if [ -z "$id" ] && [ -f "$DEPLOYMENT_FILE" ]; then + id="$(deployment_get "${kind}_contract")" fi - [ -n "$profile_id" ] || \ - err "profile contract id missing; set PROFILE_ID or restore deployments/mainnet.json" - printf '%s\n' "$profile_id" + [ -n "$id" ] || \ + err "$kind contract id missing; set $var or restore deployments/mainnet.json" + printf '%s\n' "$id" } -events_read() { - local events_id="$1" +contract_read() { + local id="$1" shift stellar contract invoke \ --send no \ --network "$NETWORK" \ --source "$ADMIN_SOURCE" \ - --id "$events_id" \ - -- "$@" -} - -profile_read() { - local profile_id="$1" - shift - stellar contract invoke \ - --send no \ - --network "$NETWORK" \ - --source "$ADMIN_SOURCE" \ - --id "$profile_id" \ + --id "$id" \ -- "$@" } @@ -266,271 +237,124 @@ read_json_string() { jq -er 'if type == "string" then . else error("expected JSON string") end' } -assert_events_version() { - local events_id="$1" expected="$2" - local actual - actual="$(events_read "$events_id" version | read_json_string)" || \ - err "could not read the current events contract version" - [ "$actual" = "$expected" ] || \ - err "events version mismatch: expected $expected, got $actual" -} - -assert_profile_version() { - local profile_id="$1" expected="$2" - local actual - actual="$(profile_read "$profile_id" version | read_json_string)" || \ - err "could not read the current profile contract version" +assert_version() { + local kind="$1" id="$2" expected="$3" actual + actual="$(contract_read "$id" version | read_json_string)" || \ + err "could not read the $kind version" [ "$actual" = "$expected" ] || \ - err "profile version mismatch: expected $expected, got $actual" + err "$kind version mismatch: expected $expected, got $actual" } assert_admin_source_matches() { - local events_id="$1" - local actual_admin - actual_admin="$(events_read "$events_id" get_admin | read_json_string)" || \ - err "could not read the current events admin" - [ "$actual_admin" = "$ADMIN_SOURCE" ] || \ - err "ADMIN_SOURCE mismatch: contract admin is $actual_admin, got $ADMIN_SOURCE" -} - -assert_profile_admin_source_matches() { - local profile_id="$1" - local actual_admin - actual_admin="$(profile_read "$profile_id" get_admin | read_json_string)" || \ - err "could not read the current profile admin" - [ "$actual_admin" = "$ADMIN_SOURCE" ] || \ - err "ADMIN_SOURCE mismatch: profile contract admin is $actual_admin, got $ADMIN_SOURCE" -} - -assert_profile_events_binding() { - local profile_id="$1" expected_events_id="$2" - local actual_events_id - actual_events_id="$(profile_read "$profile_id" get_events_contract | read_json_string)" || \ + local kind="$1" id="$2" actual + actual="$(contract_read "$id" get_admin | read_json_string)" || \ + err "could not read the $kind admin" + [ "$actual" = "$ADMIN_SOURCE" ] || \ + err "ADMIN_SOURCE mismatch: $kind admin is $actual, got $ADMIN_SOURCE" +} + +# Both admins must be the signer set preparing the XDR, and the profile must +# still trust this events contract with no rotation in flight; otherwise a +# prepared envelope could act on a contract the multisig no longer governs. +assert_governance_stable() { + local profile_id="$1" events_id="$2" binding pending + assert_admin_source_matches events "$events_id" + assert_admin_source_matches profile "$profile_id" + binding="$(contract_read "$profile_id" get_events_contract | read_json_string)" || \ err "could not read profile.get_events_contract" - [ "$actual_events_id" = "$expected_events_id" ] || \ - err "profile events-contract binding changed: expected $expected_events_id, got $actual_events_id" -} - -assert_no_pending_events_contract_rotation() { - local profile_id="$1" - local pending - pending="$(profile_read "$profile_id" get_pending_events_contract)" || \ + [ "$binding" = "$events_id" ] || \ + err "profile events-contract binding changed: expected $events_id, got $binding" + pending="$(contract_read "$profile_id" get_pending_events_contract)" || \ err "could not read profile.get_pending_events_contract" [ "$pending" = "null" ] || \ - err "a profile events-contract rotation is pending; cancel or complete it before the upgrade" -} - -assert_upgrade_governance_stable() { - local profile_id="$1" events_id="$2" - assert_admin_source_matches "$events_id" - assert_profile_admin_source_matches "$profile_id" - assert_profile_events_binding "$profile_id" "$events_id" - assert_no_pending_events_contract_rotation "$profile_id" -} - -assert_events_paused() { - local events_id="$1" - local paused - paused="$(events_read "$events_id" is_paused)" || \ - err "could not read events.is_paused" - [ "$paused" = "true" ] || \ - err "events contract is not paused; refusing to rely on a zero-event snapshot" -} - -assert_events_unpaused() { - local events_id="$1" - local paused - paused="$(events_read "$events_id" is_paused)" || \ - err "could not read events.is_paused" - [ "$paused" = "false" ] || \ - err "events contract is still paused after unpause" -} - -assert_profile_paused() { - local profile_id="$1" - local paused - paused="$(profile_read "$profile_id" is_paused)" || \ - err "could not read profile.is_paused" - [ "$paused" = "true" ] || \ - err "profile contract is not paused" + err "a profile events-contract rotation is pending; cancel or complete it first" } -assert_profile_unpaused() { - local profile_id="$1" - local paused - paused="$(profile_read "$profile_id" is_paused)" || \ - err "could not read profile.is_paused" - [ "$paused" = "false" ] || \ - err "profile contract is still paused after unpause" +assert_paused() { + local kind="$1" id="$2" paused + paused="$(contract_read "$id" is_paused)" || err "could not read $kind.is_paused" + [ "$paused" = "true" ] || err "$kind contract is not paused" } -assert_no_pending_events_upgrade() { - local events_id="$1" - local pending - pending="$(events_read "$events_id" get_pending_upgrade)" || \ - err "could not read pending events upgrade" - [ "$pending" = "null" ] || \ - err "an events upgrade is already pending; inspect it with upgrade-status" -} - -assert_pending_events_upgrade() { - local events_id="$1" expected_version="$2" expected_hash="$3" - local pending actual_version actual_hash - pending="$(events_read "$events_id" get_pending_upgrade)" || \ - err "could not read pending events upgrade" - [ "$pending" != "null" ] || err "no events upgrade is pending" - actual_version="$(printf '%s' "$pending" | jq -er '.new_version')" || \ - err "pending events upgrade did not contain new_version" - actual_hash="$(printf '%s' "$pending" | jq -er '.wasm_hash')" || \ - err "pending events upgrade did not contain wasm_hash" - [ "$actual_version" = "$expected_version" ] || \ - err "pending version mismatch: expected $expected_version, got $actual_version" - [ "$actual_hash" = "$expected_hash" ] || \ - err "pending wasm mismatch: expected $expected_hash, got $actual_hash" +assert_unpaused() { + local kind="$1" id="$2" paused + paused="$(contract_read "$id" is_paused)" || err "could not read $kind.is_paused" + [ "$paused" = "false" ] || err "$kind contract is paused" } -assert_no_pending_profile_upgrade() { - local profile_id="$1" - local pending - pending="$(profile_read "$profile_id" get_pending_upgrade)" || \ - err "could not read pending profile upgrade" +assert_no_pending_upgrade() { + local kind="$1" id="$2" pending + pending="$(contract_read "$id" get_pending_upgrade)" || \ + err "could not read the pending $kind upgrade" [ "$pending" = "null" ] || \ - err "a profile upgrade is already pending; inspect it with upgrade-status" + err "$kind already has a pending upgrade; inspect it with upgrade-status" } -assert_pending_profile_upgrade() { - local profile_id="$1" expected_version="$2" expected_hash="$3" +assert_pending_upgrade() { + local kind="$1" id="$2" expected_version="$3" expected_hash="$4" local pending actual_version actual_hash - pending="$(profile_read "$profile_id" get_pending_upgrade)" || \ - err "could not read pending profile upgrade" - [ "$pending" != "null" ] || err "no profile upgrade is pending" + pending="$(contract_read "$id" get_pending_upgrade)" || \ + err "could not read the pending $kind upgrade" + [ "$pending" != "null" ] || err "no $kind upgrade is pending" actual_version="$(printf '%s' "$pending" | jq -er '.new_version')" || \ - err "pending profile upgrade did not contain new_version" + err "pending $kind upgrade did not contain new_version" actual_hash="$(printf '%s' "$pending" | jq -er '.wasm_hash')" || \ - err "pending profile upgrade did not contain wasm_hash" + err "pending $kind upgrade did not contain wasm_hash" [ "$actual_version" = "$expected_version" ] || \ - err "pending profile version mismatch: expected $expected_version, got $actual_version" + err "pending $kind version mismatch: expected $expected_version, got $actual_version" [ "$actual_hash" = "$expected_hash" ] || \ - err "pending profile wasm mismatch: expected $expected_hash, got $actual_hash" + err "pending $kind wasm mismatch: expected $expected_hash, got $actual_hash" } -assert_pending_events_version() { - local events_id="$1" expected_version="$2" - local pending actual_version - pending="$(events_read "$events_id" get_pending_upgrade)" || \ - err "could not read pending events upgrade" - [ "$pending" != "null" ] || err "no events upgrade is pending" - actual_version="$(printf '%s' "$pending" | jq -er '.new_version')" || \ - err "pending events upgrade did not contain new_version" - [ "$actual_version" = "$expected_version" ] || \ - err "pending events version mismatch: expected $expected_version, got $actual_version" -} - -assert_profile_sdk27_staged_or_applied() { - local profile_id="$1" - local version pending - version="$(profile_read "$profile_id" version | read_json_string)" || \ - err "could not read the current profile contract version" - pending="$(profile_read "$profile_id" get_pending_upgrade)" || \ - err "could not read pending profile upgrade" - assert_profile_paused "$profile_id" - - if [ "$version" = "1.1.0" ]; then - assert_pending_profile_upgrade \ - "$profile_id" "$SDK27_PROFILE_VERSION" "$SDK27_PROFILE_WASM_HASH" - elif [ "$version" = "1.2.0" ]; then - [ "$pending" = "null" ] || \ - err "profile is 1.2.0 but still has a pending upgrade" - assert_profile_sdk27_wasm_live "$profile_id" - else - err "profile must be staged at 1.1.0 or applied at 1.2.0; got $version" - fi -} - -assert_profile_sdk27_applied_paused() { - local profile_id="$1" - assert_profile_version "$profile_id" "1.2.0" - assert_profile_sdk27_wasm_live "$profile_id" - assert_profile_paused "$profile_id" - assert_no_pending_profile_upgrade "$profile_id" -} - -assert_profile_sdk27_migrated_paused() { - local profile_id="$1" - assert_profile_sdk27_applied_paused "$profile_id" - assert_profile_migrated_version "$profile_id" "1.2.0" +assert_live_hash() { + local kind="$1" id="$2" expected="$3" actual + actual="$(deployed_wasm_hash "$id")" || err "could not read the deployed $kind wasm hash" + [ "$actual" = "$expected" ] || \ + err "deployed $kind wasm mismatch: expected $expected, got $actual" } -assert_profile_sdk27_ready() { - local profile_id="$1" - assert_profile_version "$profile_id" "1.2.0" - assert_profile_sdk27_wasm_live "$profile_id" - assert_profile_migrated_version "$profile_id" "1.2.0" - assert_no_pending_profile_upgrade "$profile_id" - assert_profile_unpaused "$profile_id" +migrated_version() { + contract_read "$1" get_migrated_to_version | jq -r '. // empty' } -assert_no_events_exist() { - local events_id="$1" - local base first_event_id output status - - base="$(events_read "$events_id" id_base)" || \ - err "could not read events.id_base" - [[ "$base" =~ ^[0-9]+$ ]] || \ - err "events.id_base returned a non-numeric value: $base" - first_event_id=$((base + 1)) - +# Simulates migrate() to learn whether it would stamp. Prints ready, +# incomplete (events: migrate_events still has rows to convert, error 97) or +# applied (already stamped: events 69, profile 43). +migrate_state() { + local kind="$1" id="$2" output status applied_code + case "$kind" in + events) applied_code=69 ;; + profile) applied_code=43 ;; + esac set +e - output="$(events_read "$events_id" get_event --event_id "$first_event_id" 2>&1)" + output="$(contract_read "$id" migrate 2>&1)" status=$? set -e - if [ "$status" -eq 0 ]; then - err "event $first_event_id exists; abort the upgrade and implement a legacy-total migration" - fi - if [[ "$output" != *"Error(Contract, #30)"* ]]; then - err "could not prove event $first_event_id is absent; refusing to continue: $output" + echo ready + elif [ "$kind" = events ] && [[ "$output" == *"Error(Contract, #97)"* ]]; then + echo incomplete + elif [[ "$output" == *"Error(Contract, #$applied_code)"* ]]; then + echo applied + else + printf '%s\n' "$output" >&2 + return 1 fi - - ok "Zero-event guard confirmed: $first_event_id returned EventNotFound." -} - -is_zero_event_guarded_target() { - [ "$1" = "$SDK27_EVENTS_VERSION" ] -} - -assert_migrated_version() { - local events_id="$1" expected="$2" - local migrated_version - migrated_version="$(events_read "$events_id" get_migrated_to_version | read_json_string)" || \ - err "could not read migrated-to version" - [ "$migrated_version" = "$expected" ] || \ - err "migration marker mismatch: expected $expected, got $migrated_version" -} - -assert_profile_migrated_version() { - local profile_id="$1" expected="$2" - local migrated_version - migrated_version="$(profile_read "$profile_id" get_migrated_to_version | read_json_string)" || \ - err "could not read profile migrated-to version" - [ "$migrated_version" = "$expected" ] || \ - err "profile migration marker mismatch: expected $expected, got $migrated_version" } -prepare_events_invoke() { - local events_id="$1" output_file="$2" - shift 2 - local output_dir +prepare_invoke() { + local kind="$1" id="$2" output_file="$3" + shift 3 + local output_dir tmp output_dir="$(dirname "$output_file")" [ -d "$output_dir" ] || err "XDR output directory does not exist: $output_dir" - assert_admin_source_matches "$events_id" + assert_admin_source_matches "$kind" "$id" - local tmp tmp="$(mktemp)" if ! stellar contract invoke \ --network "$NETWORK" \ --source-account "$ADMIN_SOURCE" \ - --id "$events_id" \ + --id "$id" \ --build-only \ -- "$@" \ | stellar tx simulate \ @@ -538,86 +362,45 @@ prepare_events_invoke() { --source-account "$ADMIN_SOURCE" \ > "$tmp"; then rm -f "$tmp" - err "could not build and simulate the multisig transaction" + err "could not build and simulate the $kind $1 transaction" fi [ -s "$tmp" ] || { rm -f "$tmp" - err "prepared transaction was empty" + err "prepared $kind transaction was empty" } mv "$tmp" "$output_file" - ok "Prepared simulated XDR: $output_file" - echo "Sign it sequentially with the required multi-sig quorum, then submit with:" + ok "Prepared simulated XDR for $kind $1: $output_file" + echo "Decode it, sign it sequentially with the multisig quorum, then submit with:" echo " stellar tx send \"\" --network $NETWORK" } -prepare_profile_invoke() { - local profile_id="$1" output_file="$2" - shift 2 - local output_dir - output_dir="$(dirname "$output_file")" - [ -d "$output_dir" ] || err "XDR output directory does not exist: $output_dir" - assert_profile_admin_source_matches "$profile_id" - - local tmp - tmp="$(mktemp)" - if ! stellar contract invoke \ - --network "$NETWORK" \ - --source-account "$ADMIN_SOURCE" \ - --id "$profile_id" \ - --build-only \ - -- "$@" \ - | stellar tx simulate \ - --network "$NETWORK" \ - --source-account "$ADMIN_SOURCE" \ - > "$tmp"; then - rm -f "$tmp" - err "could not build and simulate the profile multisig transaction" +upgrade_ids() { + events_id="$(contract_id events)" + profile_id="$(contract_id profile)" + assert_governance_stable "$profile_id" "$events_id" + if [ "$1" = events ]; then + target_id="$events_id" + else + target_id="$profile_id" fi - [ -s "$tmp" ] || { - rm -f "$tmp" - err "prepared profile transaction was empty" - } - mv "$tmp" "$output_file" - ok "Prepared simulated XDR: $output_file" - echo "Sign it sequentially with the required multi-sig quorum, then submit with:" - echo " stellar tx send \"\" --network $NETWORK" -} - -append_upgrade_log() { - local action="$1" version="$2" wasm_hash="${3:-}" - local upgrades_log="$DEPLOYMENTS_DIR/mainnet-upgrades.jsonl" - jq -nc \ - --arg timestamp "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ - --arg action "$action" \ - --arg version "$version" \ - --arg wasm_hash "$wasm_hash" \ - '{timestamp: $timestamp, action: $action, version: $version, wasm_hash: $wasm_hash}' \ - >> "$upgrades_log" -} - -cmd_build_release() { - info "Building contracts in release mode..." - stellar contract build --locked - ok "Build complete." } cmd_deploy_profile() { require_env INITIAL_ADMIN_KEY require_cli - confirm_mainnet ensure_deployments_dir - if [ -n "$(deployment_get profile_contract)" ]; then err "profile contract already deployed: $(deployment_get profile_contract). Refusing to re-deploy." fi + confirm_mainnet - cmd_build_release - - local wasm="target/wasm32v1-none/release/boundless_profile.wasm" + info "Building boundless-profile without the testnet feature..." + "$REPO_ROOT/scripts/build-release-linux.sh" --package boundless-profile + local wasm="$REPO_ROOT/target/release-linux/boundless_profile.wasm" [ -f "$wasm" ] || err "missing wasm: $wasm" info "Deploying boundless-profile..." - local profile_id + local profile_id live_hash profile_id=$(stellar contract deploy \ --network "$NETWORK" \ --source "$INITIAL_ADMIN_KEY" \ @@ -626,34 +409,39 @@ cmd_deploy_profile() { --admin "$(stellar keys address "$INITIAL_ADMIN_KEY")") ok "profile_contract=$profile_id" + live_hash="$(deployed_wasm_hash "$profile_id")" || err "could not read the deployed profile wasm hash" deployment_set profile_contract "$profile_id" - deployment_set profile_wasm_hash "$(hash_wasm "$wasm")" + deployment_set profile_wasm_hash "$live_hash" deployment_set deployed_at "$(date -u +%Y-%m-%dT%H:%M:%SZ)" + [ "$live_hash" = "$(hash_wasm "$wasm")" ] || \ + err "deployed profile wasm $live_hash differs from the local build; investigate before continuing" } cmd_deploy_events() { require_env INITIAL_ADMIN_KEY require_env FEE_ACCOUNT require_env INITIAL_GLOBAL_FEE_BPS + [[ "$FEE_ACCOUNT" =~ ^G[A-Z2-7]{55}$ ]] || err "FEE_ACCOUNT must be a G... address" + [[ "$INITIAL_GLOBAL_FEE_BPS" =~ ^[0-9]+$ ]] && [ "$INITIAL_GLOBAL_FEE_BPS" -le 1000 ] || \ + err "INITIAL_GLOBAL_FEE_BPS must be 0..1000 (the contract caps fees at 10%)" require_cli - confirm_mainnet ensure_deployments_dir local profile_id profile_id="$(deployment_get profile_contract)" [ -n "$profile_id" ] || err "deploy-profile first; profile_contract not set" - if [ -n "$(deployment_get events_contract)" ]; then - err "events contract already deployed: $(deployment_get events_contract). Refusing to re-deploy. Use the guarded upgrade flow in the mainnet runbook." + err "events contract already deployed: $(deployment_get events_contract). Refusing to re-deploy; upgrades follow docs/upgrade-runbook.md." fi + confirm_mainnet - cmd_build_release - - local wasm="target/wasm32v1-none/release/boundless_events.wasm" + info "Building boundless-events without the testnet feature..." + "$REPO_ROOT/scripts/build-release-linux.sh" --package boundless-events + local wasm="$REPO_ROOT/target/release-linux/boundless_events.wasm" [ -f "$wasm" ] || err "missing wasm: $wasm" info "Deploying boundless-events..." - local events_id + local events_id live_hash events_id=$(stellar contract deploy \ --network "$NETWORK" \ --source "$INITIAL_ADMIN_KEY" \ @@ -665,8 +453,9 @@ cmd_deploy_events() { --profile_contract "$profile_id") ok "events_contract=$events_id" + live_hash="$(deployed_wasm_hash "$events_id")" || err "could not read the deployed events wasm hash" deployment_set events_contract "$events_id" - deployment_set events_wasm_hash "$(hash_wasm "$wasm")" + deployment_set events_wasm_hash "$live_hash" deployment_set fee_account "$FEE_ACCOUNT" deployment_set_raw initial_fee_bps "$INITIAL_GLOBAL_FEE_BPS" @@ -678,18 +467,34 @@ cmd_deploy_events() { -- set_events_contract \ --new_addr "$events_id" ok "profile.events_contract = $events_id" + [ "$live_hash" = "$(hash_wasm "$wasm")" ] || \ + err "deployed events wasm $live_hash differs from the local build; investigate before continuing" } cmd_register_token() { - local token="${1:-}" - [ -n "$token" ] || err "usage: register-token " + local token="${1:-}" asset="${2:-}" + [ -n "$token" ] && [ -n "$asset" ] || \ + err "usage: register-token " + [[ "$token" =~ ^C[A-Z2-7]{55}$ ]] || err "token must be a C... contract address" require_env INITIAL_ADMIN_KEY require_cli - confirm_mainnet - local events_id + local events_id fee_account wrapped admin deployer events_id="$(deployment_get events_contract)" + fee_account="$(deployment_get fee_account)" [ -n "$events_id" ] || err "events contract not deployed" + [ -n "$fee_account" ] || err "fee_account missing from deployments/mainnet.json" + + deployer="$(stellar keys address "$INITIAL_ADMIN_KEY")" + admin="$(ADMIN_SOURCE="$deployer" contract_read "$events_id" get_admin | read_json_string)" || \ + err "could not read the events admin" + [ "$admin" = "$deployer" ] || \ + err "admin is now $admin; register tokens through the multisig (docs/contract-ops-runbook.md)" + + wrapped="$(stellar contract id asset --asset "$asset" --network "$NETWORK")" + [ "$wrapped" = "$token" ] || err "$asset is wrapped by $wrapped, not $token" + "$REPO_ROOT/scripts/admin/verify-fee-trustline.sh" mainnet "$fee_account" "$asset" + confirm_mainnet info "Registering token $token..." stellar contract invoke \ @@ -700,20 +505,13 @@ cmd_register_token() { --token "$token" local supported - supported=$(stellar contract invoke \ - --network "$NETWORK" \ - --source "$INITIAL_ADMIN_KEY" \ - --id "$events_id" \ - -- is_supported_token \ - --token "$token") + supported="$(ADMIN_SOURCE="$deployer" contract_read "$events_id" is_supported_token --token "$token")" [ "$supported" = "true" ] || err "token registration not confirmed; got: $supported" - ok "Token registered: $token" - # Append to registered_tokens array. local tmp tmp="$(mktemp)" - jq ".registered_tokens = ((.registered_tokens // []) + [\"$token\"] | unique)" \ + jq --arg t "$token" '.registered_tokens = ((.registered_tokens // []) + [$t] | unique)' \ "$DEPLOYMENT_FILE" > "$tmp" mv "$tmp" "$DEPLOYMENT_FILE" } @@ -723,7 +521,6 @@ cmd_rotate_admin() { [ -n "$new_admin" ] || err "usage: rotate-admin " require_env INITIAL_ADMIN_KEY require_cli - confirm_mainnet local events_id profile_id events_id="$(deployment_get events_contract)" @@ -731,6 +528,9 @@ cmd_rotate_admin() { [ -n "$events_id" ] || err "events contract not deployed" [ -n "$profile_id" ] || err "profile contract not deployed" + "$REPO_ROOT/scripts/admin/verify-multisig.sh" "$new_admin" mainnet + confirm_mainnet + info "Setting pending admin on events..." stellar contract invoke \ --network "$NETWORK" --source "$INITIAL_ADMIN_KEY" --id "$events_id" \ @@ -742,716 +542,340 @@ cmd_rotate_admin() { -- set_admin --new_admin "$new_admin" echo "" - echo -e "${BOLD}Now the new admin ($new_admin) must call accept_admin on both contracts.${NC}" - echo "This step requires the multi-sig quorum to sign. After both accept ops" - echo "land, run 'verify' to confirm get_admin returns the new address." + echo -e "${BOLD}$new_admin must now call accept_admin on both contracts.${NC}" + echo "Build, simulate and sign each accept per docs/DEPLOYMENT.md, then run" + echo "'verify' with ADMIN_SOURCE=$new_admin." } -cmd_upload_profile_wasm() { - local wasm="${1:-}" - [ -n "$wasm" ] || err "usage: upload-profile-wasm " - [ -f "$wasm" ] || err "wasm file not found: $wasm" +cmd_upload_wasm() { + local kind="$1" wasm="${2:-}" version="${3:-}" + [ -n "$wasm" ] && [ -n "$version" ] || \ + err "usage: upload-$kind-wasm " + require_version_arg "$version" require_env UPLOAD_SOURCE require_env ADMIN_SOURCE require_cli - confirm_mainnet - ensure_deployments_dir + assert_wasm_artifact "$kind" "$wasm" "$version" - local profile_id expected_hash uploaded_hash - profile_id="$(profile_contract_id)" - assert_profile_version "$profile_id" "1.1.0" - assert_profile_admin_source_matches "$profile_id" + local id expected_hash uploaded_hash live + id="$(contract_id "$kind")" + live="$(contract_read "$id" version | read_json_string)" || \ + err "could not read the $kind version" + [ "$live" != "$version" ] || err "$kind already reports $version" expected_hash="$(hash_wasm "$wasm")" - assert_local_wasm_hash "profile SDK 27" "$wasm" "$SDK27_PROFILE_WASM_HASH" + confirm_mainnet + uploaded_hash="$(stellar contract upload \ --source-account "$UPLOAD_SOURCE" \ --network "$NETWORK" \ --optimize=false \ --wasm "$wasm")" [ "$uploaded_hash" = "$expected_hash" ] || \ - err "uploaded profile wasm hash mismatch: expected $expected_hash, got $uploaded_hash" + err "uploaded $kind wasm hash mismatch: expected $expected_hash, got $uploaded_hash" - append_upgrade_log "profile-uploaded" "" "$uploaded_hash" - ok "Uploaded exact profile WASM: $uploaded_hash" + append_upgrade_log "uploaded" "$kind" "$version" "$uploaded_hash" + ok "Uploaded the exact $kind $version wasm: $uploaded_hash" } -cmd_prepare_pause_profile() { - local output_file="${1:-}" - [ -n "$output_file" ] || err "usage: prepare-pause-profile " +cmd_prepare_pause() { + local kind="$1" output_file="${2:-}" + [ -n "$output_file" ] || err "usage: prepare-pause-$kind " require_env ADMIN_SOURCE require_cli - local profile_id events_id - profile_id="$(profile_contract_id)" - events_id="$(events_contract_id)" - assert_upgrade_governance_stable "$profile_id" "$events_id" - assert_events_version "$events_id" "1.1.0" - assert_events_paused "$events_id" - assert_no_events_exist "$events_id" - assert_no_pending_events_upgrade "$events_id" - assert_profile_version "$profile_id" "1.1.0" - assert_profile_unpaused "$profile_id" - assert_no_pending_profile_upgrade "$profile_id" - prepare_profile_invoke "$profile_id" "$output_file" pause + local events_id profile_id target_id + upgrade_ids "$kind" + assert_unpaused "$kind" "$target_id" + prepare_invoke "$kind" "$target_id" "$output_file" pause } -cmd_prepare_propose_upgrade_profile() { - local wasm="${1:-}" new_version="${2:-}" output_file="${3:-}" - [ -n "$wasm" ] || \ - err "usage: prepare-propose-upgrade-profile " - [ -n "$new_version" ] || \ - err "usage: prepare-propose-upgrade-profile " - [ -n "$output_file" ] || \ - err "usage: prepare-propose-upgrade-profile " - [ -f "$wasm" ] || err "wasm file not found: $wasm" - assert_version_argument "profile upgrade" "$new_version" "$SDK27_PROFILE_VERSION" +cmd_prepare_propose_upgrade() { + local kind="$1" wasm="${2:-}" version="${3:-}" output_file="${4:-}" + [ -n "$wasm" ] && [ -n "$version" ] && [ -n "$output_file" ] || \ + err "usage: prepare-propose-upgrade-$kind " + require_version_arg "$version" require_env ADMIN_SOURCE require_cli + assert_wasm_artifact "$kind" "$wasm" "$version" - local profile_id events_id wasm_hash - profile_id="$(profile_contract_id)" - events_id="$(events_contract_id)" - assert_upgrade_governance_stable "$profile_id" "$events_id" + local events_id profile_id target_id wasm_hash live live_hash + upgrade_ids "$kind" wasm_hash="$(hash_wasm "$wasm")" - assert_sdk27_profile_artifact "$wasm" "$new_version" - assert_events_version "$events_id" "1.1.0" - assert_events_paused "$events_id" - assert_no_events_exist "$events_id" - assert_no_pending_events_upgrade "$events_id" - assert_no_pending_profile_upgrade "$profile_id" - assert_profile_paused "$profile_id" - if [ "$new_version" = "1.2.0" ]; then - assert_profile_version "$profile_id" "1.1.0" - fi - - prepare_profile_invoke "$profile_id" "$output_file" propose_upgrade \ + assert_no_pending_upgrade "$kind" "$target_id" + live="$(contract_read "$target_id" version | read_json_string)" || \ + err "could not read the $kind version" + [ "$live" != "$version" ] || \ + err "$kind already reports $version; a proposal must name a new version" + live_hash="$(deployed_wasm_hash "$target_id")" || \ + err "could not read the deployed $kind wasm hash" + [ "$live_hash" != "$wasm_hash" ] || err "this wasm is already live on $kind" + + prepare_invoke "$kind" "$target_id" "$output_file" propose_upgrade \ --new_wasm_hash "$wasm_hash" \ - --new_version "$new_version" - echo "Expected profile version: $new_version" - echo "Expected profile WASM: $wasm_hash" -} - -cmd_verify_proposed_upgrade_profile() { - local wasm="${1:-}" expected_version="${2:-}" - [ -n "$wasm" ] || \ - err "usage: verify-proposed-upgrade-profile " - [ -n "$expected_version" ] || \ - err "usage: verify-proposed-upgrade-profile " - [ -f "$wasm" ] || err "wasm file not found: $wasm" - assert_version_argument "profile upgrade" "$expected_version" "$SDK27_PROFILE_VERSION" - require_env ADMIN_SOURCE - require_cli - ensure_deployments_dir - - local profile_id events_id expected_hash - profile_id="$(profile_contract_id)" - events_id="$(events_contract_id)" - assert_upgrade_governance_stable "$profile_id" "$events_id" - expected_hash="$(hash_wasm "$wasm")" - assert_sdk27_profile_artifact "$wasm" "$expected_version" - assert_events_version "$events_id" "1.1.0" - assert_events_paused "$events_id" - assert_no_events_exist "$events_id" - assert_no_pending_events_upgrade "$events_id" - assert_pending_profile_upgrade "$profile_id" "$expected_version" "$expected_hash" - assert_profile_paused "$profile_id" - if [ "$expected_version" = "1.2.0" ]; then - assert_profile_version "$profile_id" "1.1.0" - fi - - append_upgrade_log "profile-proposal-verified" "$expected_version" "$expected_hash" - ok "Queued profile upgrade matches the expected version and exact WASM." -} - -cmd_prepare_apply_upgrade_profile() { - local wasm="${1:-}" expected_version="${2:-}" output_file="${3:-}" - [ -n "$wasm" ] || \ - err "usage: prepare-apply-upgrade-profile " - [ -n "$expected_version" ] || \ - err "usage: prepare-apply-upgrade-profile " - [ -n "$output_file" ] || \ - err "usage: prepare-apply-upgrade-profile " - [ -f "$wasm" ] || err "wasm file not found: $wasm" - assert_version_argument "profile upgrade" "$expected_version" "$SDK27_PROFILE_VERSION" - require_env ADMIN_SOURCE - require_cli - - local profile_id events_id expected_hash - profile_id="$(profile_contract_id)" - events_id="$(events_contract_id)" - assert_upgrade_governance_stable "$profile_id" "$events_id" - expected_hash="$(hash_wasm "$wasm")" - assert_sdk27_profile_artifact "$wasm" "$expected_version" - assert_events_version "$events_id" "1.1.0" - assert_events_paused "$events_id" - assert_no_events_exist "$events_id" - assert_pending_events_upgrade \ - "$events_id" "$SDK27_EVENTS_VERSION" "$SDK27_EVENTS_WASM_HASH" - assert_pending_profile_upgrade "$profile_id" "$expected_version" "$expected_hash" - assert_profile_paused "$profile_id" - if [ "$expected_version" = "1.2.0" ]; then - assert_profile_version "$profile_id" "1.1.0" - fi - - prepare_profile_invoke "$profile_id" "$output_file" apply_upgrade -} - -cmd_prepare_migrate_upgrade_profile() { - local expected_version="${1:-}" output_file="${2:-}" - [ -n "$expected_version" ] || \ - err "usage: prepare-migrate-upgrade-profile " - [ -n "$output_file" ] || \ - err "usage: prepare-migrate-upgrade-profile " - assert_version_argument "profile upgrade" "$expected_version" "$SDK27_PROFILE_VERSION" - require_env ADMIN_SOURCE - require_cli - - local profile_id events_id migrated_version - profile_id="$(profile_contract_id)" - events_id="$(events_contract_id)" - assert_upgrade_governance_stable "$profile_id" "$events_id" - assert_events_version "$events_id" "1.5.0" - assert_events_sdk27_wasm_live "$events_id" - assert_events_paused "$events_id" - assert_no_pending_events_upgrade "$events_id" - assert_profile_version "$profile_id" "$expected_version" - if [ "$expected_version" = "$SDK27_PROFILE_VERSION" ]; then - assert_profile_sdk27_wasm_live "$profile_id" - fi - assert_profile_paused "$profile_id" - assert_no_pending_profile_upgrade "$profile_id" - - migrated_version="$(profile_read "$profile_id" get_migrated_to_version | jq -r '. // empty')" || \ - err "could not read profile migrated-to version" - [ "$migrated_version" != "$expected_version" ] || \ - err "profile migration marker is already $expected_version; do not replay migrate" - prepare_profile_invoke "$profile_id" "$output_file" migrate + --new_version "$version" + echo "Live $kind: $live ($live_hash)" + echo "Proposed $kind: $version ($wasm_hash)" } -cmd_prepare_cancel_upgrade_profile() { - local output_file="${1:-}" - [ -n "$output_file" ] || \ - err "usage: prepare-cancel-upgrade-profile " +cmd_verify_proposed_upgrade() { + local kind="$1" wasm="${2:-}" version="${3:-}" + [ -n "$wasm" ] && [ -n "$version" ] || \ + err "usage: verify-proposed-upgrade-$kind " + require_version_arg "$version" require_env ADMIN_SOURCE require_cli + assert_wasm_artifact "$kind" "$wasm" "$version" - local profile_id events_id pending_version - profile_id="$(profile_contract_id)" - events_id="$(events_contract_id)" - assert_upgrade_governance_stable "$profile_id" "$events_id" - pending_version="$(profile_read "$profile_id" get_pending_upgrade | jq -r '.new_version // empty')" || \ - err "could not read pending profile upgrade" - [ -n "$pending_version" ] || err "no profile upgrade is pending" - if [ "$pending_version" = "1.2.0" ]; then - assert_profile_version "$profile_id" "1.1.0" - assert_profile_paused "$profile_id" - assert_events_version "$events_id" "1.1.0" - assert_events_paused "$events_id" - assert_no_events_exist "$events_id" - fi - prepare_profile_invoke "$profile_id" "$output_file" cancel_pending_upgrade - echo "Cancelling queued profile version: $pending_version" - echo "This transaction does not unpause the profile contract." -} - -cmd_prepare_unpause_profile() { - local expected_version="${1:-}" output_file="${2:-}" - [ -n "$expected_version" ] || \ - err "usage: prepare-unpause-profile " - [ -n "$output_file" ] || \ - err "usage: prepare-unpause-profile " - assert_unpause_version_argument "profile" "$expected_version" "$SDK27_PROFILE_VERSION" - require_env ADMIN_SOURCE - require_cli - - local profile_id events_id - profile_id="$(profile_contract_id)" - events_id="$(events_contract_id)" - assert_upgrade_governance_stable "$profile_id" "$events_id" - assert_profile_version "$profile_id" "$expected_version" - assert_profile_paused "$profile_id" - assert_no_pending_profile_upgrade "$profile_id" - if [ "$expected_version" = "1.2.0" ]; then - assert_profile_sdk27_wasm_live "$profile_id" - assert_profile_migrated_version "$profile_id" "$expected_version" - assert_events_version "$events_id" "1.5.0" - assert_events_sdk27_wasm_live "$events_id" - assert_events_paused "$events_id" - assert_no_pending_events_upgrade "$events_id" - assert_migrated_version "$events_id" "1.5.0" - elif [ "$expected_version" = "1.1.0" ]; then - assert_events_version "$events_id" "1.1.0" - assert_events_paused "$events_id" - assert_no_pending_events_upgrade "$events_id" - assert_no_events_exist "$events_id" - fi - prepare_profile_invoke "$profile_id" "$output_file" unpause -} - -cmd_verify_upgrade_profile() { - local wasm="${1:-}" expected_version="${2:-}" - [ -n "$wasm" ] || \ - err "usage: verify-upgrade-profile " - [ -n "$expected_version" ] || \ - err "usage: verify-upgrade-profile " - [ -f "$wasm" ] || err "wasm file not found: $wasm" - assert_version_argument "profile upgrade" "$expected_version" "$SDK27_PROFILE_VERSION" - require_env ADMIN_SOURCE - require_cli - ensure_deployments_dir - - local profile_id events_id expected_hash - profile_id="$(profile_contract_id)" - events_id="$(events_contract_id)" - assert_upgrade_governance_stable "$profile_id" "$events_id" - expected_hash="$(hash_wasm "$wasm")" - assert_sdk27_profile_artifact "$wasm" "$expected_version" - assert_profile_version "$profile_id" "$expected_version" - if [ "$expected_version" = "$SDK27_PROFILE_VERSION" ]; then - assert_profile_sdk27_wasm_live "$profile_id" - fi - assert_profile_migrated_version "$profile_id" "$expected_version" - assert_no_pending_profile_upgrade "$profile_id" - assert_profile_unpaused "$profile_id" - assert_events_version "$events_id" "1.5.0" - assert_events_sdk27_wasm_live "$events_id" - assert_migrated_version "$events_id" "1.5.0" - assert_no_pending_events_upgrade "$events_id" - assert_events_unpaused "$events_id" - - deployment_set profile_contract "$profile_id" - deployment_set profile_wasm_hash "$expected_hash" - deployment_set profile_version "$expected_version" - append_upgrade_log "profile-upgrade-verified" "$expected_version" "$expected_hash" - ok "Profile $expected_version is migrated, has no pending upgrade, and is unpaused." -} - -cmd_upload_events_wasm() { - local wasm="${1:-}" - [ -n "$wasm" ] || err "usage: upload-events-wasm " - [ -f "$wasm" ] || err "wasm file not found: $wasm" - require_env UPLOAD_SOURCE - require_env ADMIN_SOURCE - require_cli - confirm_mainnet - ensure_deployments_dir - - local events_id expected_hash uploaded_hash - events_id="$(events_contract_id)" - assert_events_version "$events_id" "1.1.0" - assert_admin_source_matches "$events_id" - expected_hash="$(hash_wasm "$wasm")" - assert_local_wasm_hash "events SDK 27" "$wasm" "$SDK27_EVENTS_WASM_HASH" - uploaded_hash="$(stellar contract upload \ - --source-account "$UPLOAD_SOURCE" \ - --network "$NETWORK" \ - --optimize=false \ - --wasm "$wasm")" - [ "$uploaded_hash" = "$expected_hash" ] || \ - err "uploaded wasm hash mismatch: expected $expected_hash, got $uploaded_hash" - - append_upgrade_log "uploaded" "" "$uploaded_hash" - ok "Uploaded exact events WASM: $uploaded_hash" -} - -cmd_prepare_pause_events() { - local output_file="${1:-}" - [ -n "$output_file" ] || err "usage: prepare-pause-events " - require_env ADMIN_SOURCE - require_cli + local events_id profile_id target_id wasm_hash + upgrade_ids "$kind" + wasm_hash="$(hash_wasm "$wasm")" + assert_pending_upgrade "$kind" "$target_id" "$version" "$wasm_hash" - local events_id profile_id - events_id="$(events_contract_id)" - profile_id="$(profile_contract_id)" - assert_upgrade_governance_stable "$profile_id" "$events_id" - assert_profile_version "$profile_id" "1.1.0" - assert_profile_unpaused "$profile_id" - assert_no_pending_profile_upgrade "$profile_id" - assert_events_version "$events_id" "1.1.0" - assert_events_unpaused "$events_id" - assert_no_pending_events_upgrade "$events_id" - assert_no_events_exist "$events_id" - prepare_events_invoke "$events_id" "$output_file" pause + contract_read "$target_id" get_pending_upgrade \ + | jq -r '"available_at_ledger: \(.available_at_ledger)\nexpires_at_ledger: \(.expires_at_ledger)"' + append_upgrade_log "proposal-verified" "$kind" "$version" "$wasm_hash" + ok "The queued $kind upgrade matches $version and the exact wasm." } -cmd_prepare_propose_upgrade_events() { - local wasm="${1:-}" new_version="${2:-}" output_file="${3:-}" - [ -n "$wasm" ] || \ - err "usage: prepare-propose-upgrade-events " - [ -n "$new_version" ] || \ - err "usage: prepare-propose-upgrade-events " - [ -n "$output_file" ] || \ - err "usage: prepare-propose-upgrade-events " - [ -f "$wasm" ] || err "wasm file not found: $wasm" - assert_version_argument "events upgrade" "$new_version" "$SDK27_EVENTS_VERSION" +cmd_prepare_apply_upgrade() { + local kind="$1" wasm="${2:-}" version="${3:-}" output_file="${4:-}" + [ -n "$wasm" ] && [ -n "$version" ] && [ -n "$output_file" ] || \ + err "usage: prepare-apply-upgrade-$kind " + require_version_arg "$version" require_env ADMIN_SOURCE require_cli + assert_wasm_artifact "$kind" "$wasm" "$version" - local events_id profile_id wasm_hash - events_id="$(events_contract_id)" - profile_id="$(profile_contract_id)" - assert_upgrade_governance_stable "$profile_id" "$events_id" + local events_id profile_id target_id wasm_hash + upgrade_ids "$kind" wasm_hash="$(hash_wasm "$wasm")" - assert_sdk27_events_artifact "$wasm" "$new_version" - assert_no_pending_events_upgrade "$events_id" - - if is_zero_event_guarded_target "$new_version"; then - assert_events_version "$events_id" "1.1.0" - assert_events_paused "$events_id" - assert_no_events_exist "$events_id" - if [ "$new_version" = "1.5.0" ]; then - assert_profile_sdk27_staged_or_applied "$profile_id" - fi + assert_pending_upgrade "$kind" "$target_id" "$version" "$wasm_hash" + # Applying events can change the record layout; keep users out until + # migrate has converted every row. + if [ "$kind" = events ]; then + assert_paused events "$events_id" fi - prepare_events_invoke "$events_id" "$output_file" propose_upgrade \ - --new_wasm_hash "$wasm_hash" \ - --new_version "$new_version" - echo "Expected version: $new_version" - echo "Expected WASM: $wasm_hash" + prepare_invoke "$kind" "$target_id" "$output_file" apply_upgrade } -cmd_verify_proposed_upgrade_events() { - local wasm="${1:-}" expected_version="${2:-}" - [ -n "$wasm" ] || \ - err "usage: verify-proposed-upgrade-events " - [ -n "$expected_version" ] || \ - err "usage: verify-proposed-upgrade-events " - [ -f "$wasm" ] || err "wasm file not found: $wasm" - assert_version_argument "events upgrade" "$expected_version" "$SDK27_EVENTS_VERSION" +cmd_prepare_migrate_events_page() { + local max_events="${1:-}" output_file="${2:-}" + [ -n "$max_events" ] && [ -n "$output_file" ] || \ + err "usage: prepare-migrate-events-page " + [[ "$max_events" =~ ^[1-9][0-9]*$ ]] || err "max-events must be a positive integer" require_env ADMIN_SOURCE require_cli - ensure_deployments_dir - local events_id profile_id expected_hash - events_id="$(events_contract_id)" - profile_id="$(profile_contract_id)" - assert_upgrade_governance_stable "$profile_id" "$events_id" - expected_hash="$(hash_wasm "$wasm")" - assert_sdk27_events_artifact "$wasm" "$expected_version" - assert_pending_events_upgrade "$events_id" "$expected_version" "$expected_hash" - - if is_zero_event_guarded_target "$expected_version"; then - assert_events_version "$events_id" "1.1.0" - assert_events_paused "$events_id" - assert_no_events_exist "$events_id" - if [ "$expected_version" = "1.5.0" ]; then - assert_profile_sdk27_staged_or_applied "$profile_id" - fi - fi - - append_upgrade_log "proposal-verified" "$expected_version" "$expected_hash" - ok "Queued events upgrade matches the expected version and exact WASM." -} - -cmd_prepare_apply_upgrade_events() { - local wasm="${1:-}" expected_version="${2:-}" output_file="${3:-}" - [ -n "$wasm" ] || \ - err "usage: prepare-apply-upgrade-events " - [ -n "$expected_version" ] || \ - err "usage: prepare-apply-upgrade-events " - [ -n "$output_file" ] || \ - err "usage: prepare-apply-upgrade-events " - [ -f "$wasm" ] || err "wasm file not found: $wasm" - assert_version_argument "events upgrade" "$expected_version" "$SDK27_EVENTS_VERSION" + local events_id profile_id target_id live migrated state remaining + upgrade_ids events + assert_no_pending_upgrade events "$events_id" + assert_paused events "$events_id" + live="$(contract_read "$events_id" version | read_json_string)" || \ + err "could not read the events version" + migrated="$(migrated_version "$events_id")" || err "could not read the events migration marker" + [ "$migrated" != "$live" ] || err "events is already migrated to $live; there is nothing to page" + state="$(migrate_state events "$events_id")" || err "could not simulate events migrate" + [ "$state" = incomplete ] || \ + err "migrate_events has nothing left to convert; prepare-migrate-upgrade-events is next" + remaining="$(contract_read "$events_id" migrate_events --max_events "$max_events" | tr -d '"')" || \ + err "could not simulate migrate_events" + [[ "$remaining" =~ ^[0-9]+$ ]] || err "migrate_events simulation returned '$remaining'" + + prepare_invoke events "$events_id" "$output_file" migrate_events --max_events "$max_events" + echo "Simulated: $remaining event(s) will remain after this page (the contract converts at most 8 per call)." +} + +cmd_prepare_migrate_upgrade() { + local kind="$1" version="${2:-}" output_file="${3:-}" + [ -n "$version" ] && [ -n "$output_file" ] || \ + err "usage: prepare-migrate-upgrade-$kind " + require_version_arg "$version" require_env ADMIN_SOURCE require_cli - local events_id profile_id expected_hash - events_id="$(events_contract_id)" - profile_id="$(profile_contract_id)" - assert_upgrade_governance_stable "$profile_id" "$events_id" - expected_hash="$(hash_wasm "$wasm")" - assert_sdk27_events_artifact "$wasm" "$expected_version" - assert_pending_events_upgrade "$events_id" "$expected_version" "$expected_hash" - - if is_zero_event_guarded_target "$expected_version"; then - assert_events_version "$events_id" "1.1.0" - assert_events_paused "$events_id" - assert_no_events_exist "$events_id" - if [ "$expected_version" = "1.5.0" ]; then - assert_profile_sdk27_applied_paused "$profile_id" - fi - fi + local events_id profile_id target_id migrated state + upgrade_ids "$kind" + assert_version "$kind" "$target_id" "$version" + assert_no_pending_upgrade "$kind" "$target_id" + if [ "$kind" = events ]; then + assert_paused events "$events_id" + fi + migrated="$(migrated_version "$target_id")" || err "could not read the $kind migration marker" + [ "$migrated" != "$version" ] || \ + err "$kind is already migrated to $version; migrate cannot be replayed" + state="$(migrate_state "$kind" "$target_id")" || err "could not simulate $kind migrate" + case "$state" in + incomplete) + err "migrate_events still has events to convert; prepare and submit prepare-migrate-events-page until it reports 0 remaining" ;; + applied) + err "$kind migrate reports it has already run" ;; + esac - prepare_events_invoke "$events_id" "$output_file" apply_upgrade + prepare_invoke "$kind" "$target_id" "$output_file" migrate } -cmd_prepare_migrate_upgrade_events() { - local expected_version="${1:-}" output_file="${2:-}" - [ -n "$expected_version" ] || \ - err "usage: prepare-migrate-upgrade-events " - [ -n "$output_file" ] || \ - err "usage: prepare-migrate-upgrade-events " - assert_version_argument "events upgrade" "$expected_version" "$SDK27_EVENTS_VERSION" +cmd_prepare_cancel_upgrade() { + local kind="$1" output_file="${2:-}" + [ -n "$output_file" ] || err "usage: prepare-cancel-upgrade-$kind " require_env ADMIN_SOURCE require_cli - local events_id profile_id migrated_version - events_id="$(events_contract_id)" - profile_id="$(profile_contract_id)" - assert_upgrade_governance_stable "$profile_id" "$events_id" - assert_events_version "$events_id" "$expected_version" - if [ "$expected_version" = "$SDK27_EVENTS_VERSION" ]; then - assert_events_sdk27_wasm_live "$events_id" - fi - assert_no_pending_events_upgrade "$events_id" - assert_events_paused "$events_id" - - migrated_version="$(events_read "$events_id" get_migrated_to_version | jq -r '. // empty')" || \ - err "could not read migrated-to version" - [ "$migrated_version" != "$expected_version" ] || \ - err "migration marker is already $expected_version; do not replay migrate" - if [ "$expected_version" = "1.5.0" ]; then - assert_profile_sdk27_migrated_paused "$profile_id" - fi - prepare_events_invoke "$events_id" "$output_file" migrate + local events_id profile_id target_id pending_version + upgrade_ids "$kind" + pending_version="$(contract_read "$target_id" get_pending_upgrade | jq -r '.new_version // empty')" || \ + err "could not read the pending $kind upgrade" + [ -n "$pending_version" ] || err "no $kind upgrade is pending" + prepare_invoke "$kind" "$target_id" "$output_file" cancel_pending_upgrade + echo "Cancelling queued $kind version $pending_version. The pause flag is unchanged." } -cmd_prepare_cancel_upgrade_events() { - local output_file="${1:-}" - [ -n "$output_file" ] || \ - err "usage: prepare-cancel-upgrade-events " +cmd_prepare_unpause() { + local kind="$1" version="${2:-}" output_file="${3:-}" + [ -n "$version" ] && [ -n "$output_file" ] || \ + err "usage: prepare-unpause-$kind " + require_version_arg "$version" require_env ADMIN_SOURCE require_cli - local events_id profile_id pending_version - events_id="$(events_contract_id)" - profile_id="$(profile_contract_id)" - assert_upgrade_governance_stable "$profile_id" "$events_id" - pending_version="$(events_read "$events_id" get_pending_upgrade | jq -r '.new_version // empty')" || \ - err "could not read pending events upgrade" - [ -n "$pending_version" ] || err "no events upgrade is pending" - if [ "$pending_version" = "1.5.0" ]; then - assert_events_version "$events_id" "1.1.0" - assert_events_paused "$events_id" - assert_no_events_exist "$events_id" - assert_profile_version "$profile_id" "1.1.0" - assert_profile_paused "$profile_id" + local events_id profile_id target_id migrated + upgrade_ids "$kind" + assert_version "$kind" "$target_id" "$version" + assert_paused "$kind" "$target_id" + assert_no_pending_upgrade "$kind" "$target_id" + migrated="$(migrated_version "$target_id")" || err "could not read the $kind migration marker" + if [ "$migrated" != "$version" ] && [ "${UNPAUSE_UNMIGRATED:-}" != 1 ]; then + err "$kind $version is not migrated (marker: ${migrated:-none}). Finish the migration, or set UNPAUSE_UNMIGRATED=1 only when abandoning an upgrade that was never applied." fi - prepare_events_invoke "$events_id" "$output_file" cancel_pending_upgrade - echo "Cancelling queued version: $pending_version" - echo "This transaction does not unpause the contract." + prepare_invoke "$kind" "$target_id" "$output_file" unpause } -cmd_prepare_unpause_events() { - local expected_version="${1:-}" output_file="${2:-}" - [ -n "$expected_version" ] || \ - err "usage: prepare-unpause-events " - [ -n "$output_file" ] || \ - err "usage: prepare-unpause-events " - assert_unpause_version_argument "events" "$expected_version" "$SDK27_EVENTS_VERSION" +cmd_verify_upgrade() { + local kind="$1" wasm="${2:-}" version="${3:-}" + [ -n "$wasm" ] && [ -n "$version" ] || \ + err "usage: verify-upgrade-$kind " + require_version_arg "$version" require_env ADMIN_SOURCE require_cli + assert_wasm_artifact "$kind" "$wasm" "$version" - local events_id profile_id - events_id="$(events_contract_id)" - profile_id="$(profile_contract_id)" - assert_upgrade_governance_stable "$profile_id" "$events_id" - assert_events_version "$events_id" "$expected_version" - if [ "$expected_version" = "$SDK27_EVENTS_VERSION" ]; then - assert_events_sdk27_wasm_live "$events_id" - fi - assert_events_paused "$events_id" - assert_no_pending_events_upgrade "$events_id" - if is_zero_event_guarded_target "$expected_version"; then - assert_migrated_version "$events_id" "$expected_version" - fi - if [ "$expected_version" = "1.5.0" ]; then - assert_profile_sdk27_ready "$profile_id" - elif [ "$expected_version" = "1.1.0" ]; then - assert_no_events_exist "$events_id" - assert_profile_version "$profile_id" "1.1.0" - assert_profile_unpaused "$profile_id" - assert_no_pending_profile_upgrade "$profile_id" - fi - prepare_events_invoke "$events_id" "$output_file" unpause -} + local events_id profile_id target_id wasm_hash migrated + upgrade_ids "$kind" + wasm_hash="$(hash_wasm "$wasm")" + assert_version "$kind" "$target_id" "$version" + assert_live_hash "$kind" "$target_id" "$wasm_hash" + migrated="$(migrated_version "$target_id")" || err "could not read the $kind migration marker" + [ "$migrated" = "$version" ] || \ + err "$kind migration marker is ${migrated:-none}, expected $version" + assert_no_pending_upgrade "$kind" "$target_id" + assert_unpaused "$kind" "$target_id" -cmd_verify_upgrade_events() { - local wasm="${1:-}" expected_version="${2:-}" - [ -n "$wasm" ] || \ - err "usage: verify-upgrade-events " - [ -n "$expected_version" ] || \ - err "usage: verify-upgrade-events " - [ -f "$wasm" ] || err "wasm file not found: $wasm" - assert_version_argument "events upgrade" "$expected_version" "$SDK27_EVENTS_VERSION" - require_env ADMIN_SOURCE - require_cli ensure_deployments_dir + deployment_set "${kind}_contract" "$target_id" + deployment_set "${kind}_wasm_hash" "$wasm_hash" + deployment_set "${kind}_version" "$version" + deployment_set "${kind}_migrated_to_version" "$version" + deployment_set last_upgraded_at "$(date -u +%Y-%m-%dT%H:%M:%SZ)" + append_upgrade_log "upgrade-verified" "$kind" "$version" "$wasm_hash" + ok "$kind $version is live, migrated, has no pending upgrade and is unpaused." +} - local events_id profile_id expected_hash - events_id="$(events_contract_id)" - profile_id="$(profile_contract_id)" - assert_upgrade_governance_stable "$profile_id" "$events_id" - expected_hash="$(hash_wasm "$wasm")" - assert_sdk27_events_artifact "$wasm" "$expected_version" - assert_events_version "$events_id" "$expected_version" - if [ "$expected_version" = "$SDK27_EVENTS_VERSION" ]; then - assert_events_sdk27_wasm_live "$events_id" - fi - assert_migrated_version "$events_id" "$expected_version" - assert_no_pending_events_upgrade "$events_id" - assert_events_unpaused "$events_id" - if [ "$expected_version" = "1.5.0" ]; then - assert_profile_sdk27_ready "$profile_id" - fi - - deployment_set events_contract "$events_id" - deployment_set events_wasm_hash "$expected_hash" - deployment_set events_version "$expected_version" - append_upgrade_log "upgrade-verified" "$expected_version" "$expected_hash" - ok "Events $expected_version is migrated, has no pending upgrade, and is unpaused." +show_read() { + local label="$1" id="$2" + shift 2 + printf '%s: %s\n' "$label" "$(contract_read "$id" "$@" 2>/dev/null || echo '(read failed)')" } cmd_upgrade_status() { require_env ADMIN_SOURCE require_cli - local events_id profile_id - events_id="$(events_contract_id)" - profile_id="$(profile_contract_id)" - - echo "events.version:" - events_read "$events_id" version - echo "events.wasm_hash:" - deployed_wasm_hash "$events_id" - echo "events.is_paused:" - events_read "$events_id" is_paused - echo "events.get_pending_upgrade:" - events_read "$events_id" get_pending_upgrade - echo "events.get_migrated_to_version:" - events_read "$events_id" get_migrated_to_version - echo "profile.version:" - profile_read "$profile_id" version - echo "profile.wasm_hash:" - deployed_wasm_hash "$profile_id" - echo "profile.is_paused:" - profile_read "$profile_id" is_paused - echo "profile.get_pending_upgrade:" - profile_read "$profile_id" get_pending_upgrade - echo "profile.get_events_contract:" - profile_read "$profile_id" get_events_contract - echo "profile.get_pending_events_contract:" - profile_read "$profile_id" get_pending_events_contract - echo "profile.get_migrated_to_version:" - profile_read "$profile_id" get_migrated_to_version + local events_id profile_id kind id state + events_id="$(contract_id events)" + profile_id="$(contract_id profile)" + + for kind in events profile; do + if [ "$kind" = events ]; then id="$events_id"; else id="$profile_id"; fi + echo "$kind: $id" + show_read " version" "$id" version + printf ' wasm_hash: %s\n' "$(deployed_wasm_hash "$id" 2>/dev/null || echo '(read failed)')" + show_read " migrated_to_version" "$id" get_migrated_to_version + state="$(migrate_state "$kind" "$id" 2>/dev/null)" || state="unknown (simulation failed)" + printf ' migrate (simulated): %s\n' "$state" + show_read " pending_upgrade" "$id" get_pending_upgrade + show_read " is_paused" "$id" is_paused + show_read " admin" "$id" get_admin + done + show_read "events release_validator" "$events_id" get_release_validator + show_read "events pending_release_validator" "$events_id" get_pending_release_validator + show_read "profile events_contract" "$profile_id" get_events_contract + show_read "profile pending_events_contract" "$profile_id" get_pending_events_contract } cmd_verify() { - require_env INITIAL_ADMIN_KEY # for the read-source; any key works for invoke-as-read + require_env ADMIN_SOURCE require_cli local events_id profile_id - events_id="$(deployment_get events_contract)" - profile_id="$(deployment_get profile_contract)" - [ -n "$events_id" ] || err "events contract not in deployment file" - [ -n "$profile_id" ] || err "profile contract not in deployment file" - - info "Verifying mainnet state..." - - echo "events.get_admin:" - stellar contract invoke --network "$NETWORK" --source "$INITIAL_ADMIN_KEY" --id "$events_id" -- get_admin - - echo "events.get_fee_bps:" - stellar contract invoke --network "$NETWORK" --source "$INITIAL_ADMIN_KEY" --id "$events_id" -- get_fee_bps - - echo "events.get_fee_account:" - stellar contract invoke --network "$NETWORK" --source "$INITIAL_ADMIN_KEY" --id "$events_id" -- get_fee_account - - echo "events.is_paused:" - stellar contract invoke --network "$NETWORK" --source "$INITIAL_ADMIN_KEY" --id "$events_id" -- is_paused - - echo "profile.get_admin:" - stellar contract invoke --network "$NETWORK" --source "$INITIAL_ADMIN_KEY" --id "$profile_id" -- get_admin - - ok "Verification reads complete. Compare against the runbook expectations." + events_id="$(contract_id events)" + profile_id="$(contract_id profile)" + + info "Mainnet state (compare with deployments/mainnet.json and docs/DEPLOYMENT.md)" + echo "events: $events_id" + show_read " version" "$events_id" version + show_read " migrated_to_version" "$events_id" get_migrated_to_version + show_read " pending_upgrade" "$events_id" get_pending_upgrade + show_read " is_paused" "$events_id" is_paused + show_read " admin" "$events_id" get_admin + show_read " fee_account" "$events_id" get_fee_account + show_read " fee_bps" "$events_id" get_fee_bps + show_read " profile_contract" "$events_id" get_profile_contract + show_read " release_validator" "$events_id" get_release_validator + show_read " pending_release_validator" "$events_id" get_pending_release_validator + show_read " supported_token_count" "$events_id" supported_token_count + echo "profile: $profile_id" + show_read " version" "$profile_id" version + show_read " migrated_to_version" "$profile_id" get_migrated_to_version + show_read " pending_upgrade" "$profile_id" get_pending_upgrade + show_read " is_paused" "$profile_id" is_paused + show_read " admin" "$profile_id" get_admin + show_read " events_contract" "$profile_id" get_events_contract + show_read " pending_events_contract" "$profile_id" get_pending_events_contract } case "$ACTION" in - "deploy-profile") - cmd_deploy_profile - ;; - "deploy-events") - cmd_deploy_events - ;; - "register-token") - cmd_register_token "$@" - ;; - "rotate-admin") - cmd_rotate_admin "$@" - ;; - "upload-profile-wasm") - cmd_upload_profile_wasm "$@" - ;; - "upload-events-wasm") - cmd_upload_events_wasm "$@" - ;; - "prepare-pause-profile") - cmd_prepare_pause_profile "$@" - ;; - "prepare-pause-events") - cmd_prepare_pause_events "$@" - ;; - "prepare-propose-upgrade-profile") - cmd_prepare_propose_upgrade_profile "$@" - ;; - "prepare-propose-upgrade-events") - cmd_prepare_propose_upgrade_events "$@" - ;; - "verify-proposed-upgrade-profile") - cmd_verify_proposed_upgrade_profile "$@" - ;; - "verify-proposed-upgrade-events") - cmd_verify_proposed_upgrade_events "$@" - ;; - "prepare-apply-upgrade-profile") - cmd_prepare_apply_upgrade_profile "$@" - ;; - "prepare-apply-upgrade-events") - cmd_prepare_apply_upgrade_events "$@" - ;; - "prepare-migrate-upgrade-profile") - cmd_prepare_migrate_upgrade_profile "$@" - ;; - "prepare-migrate-upgrade-events") - cmd_prepare_migrate_upgrade_events "$@" - ;; - "prepare-cancel-upgrade-profile") - cmd_prepare_cancel_upgrade_profile "$@" - ;; - "prepare-cancel-upgrade-events") - cmd_prepare_cancel_upgrade_events "$@" - ;; - "prepare-unpause-profile") - cmd_prepare_unpause_profile "$@" - ;; - "prepare-unpause-events") - cmd_prepare_unpause_events "$@" - ;; - "verify-upgrade-profile") - cmd_verify_upgrade_profile "$@" - ;; - "verify-upgrade-events") - cmd_verify_upgrade_events "$@" - ;; - "upgrade-status") - cmd_upgrade_status - ;; - "upgrade-events") - err "upgrade-events is removed; use the guarded prepare/sign/send flow in mainnet-deploy-runbook.md" - ;; - "propose-upgrade-events"|"apply-upgrade-events"|"migrate-upgrade-events"|"cancel-upgrade-events"|"unpause-events"|\ - "propose-upgrade-profile"|"apply-upgrade-profile"|"migrate-upgrade-profile"|"cancel-upgrade-profile"|"unpause-profile") - err "$ACTION cannot safely submit as the 2-of-3 admin; use the matching prepare-* action, sign sequentially, and send" - ;; - "verify") - cmd_verify + deploy-profile) cmd_deploy_profile ;; + deploy-events) cmd_deploy_events ;; + register-token) cmd_register_token "$@" ;; + rotate-admin) cmd_rotate_admin "$@" ;; + upload-profile-wasm) cmd_upload_wasm profile "$@" ;; + upload-events-wasm) cmd_upload_wasm events "$@" ;; + prepare-pause-profile) cmd_prepare_pause profile "$@" ;; + prepare-pause-events) cmd_prepare_pause events "$@" ;; + prepare-propose-upgrade-profile) cmd_prepare_propose_upgrade profile "$@" ;; + prepare-propose-upgrade-events) cmd_prepare_propose_upgrade events "$@" ;; + verify-proposed-upgrade-profile) cmd_verify_proposed_upgrade profile "$@" ;; + verify-proposed-upgrade-events) cmd_verify_proposed_upgrade events "$@" ;; + prepare-apply-upgrade-profile) cmd_prepare_apply_upgrade profile "$@" ;; + prepare-apply-upgrade-events) cmd_prepare_apply_upgrade events "$@" ;; + prepare-migrate-events-page) cmd_prepare_migrate_events_page "$@" ;; + prepare-migrate-upgrade-profile) cmd_prepare_migrate_upgrade profile "$@" ;; + prepare-migrate-upgrade-events) cmd_prepare_migrate_upgrade events "$@" ;; + prepare-cancel-upgrade-profile) cmd_prepare_cancel_upgrade profile "$@" ;; + prepare-cancel-upgrade-events) cmd_prepare_cancel_upgrade events "$@" ;; + prepare-unpause-profile) cmd_prepare_unpause profile "$@" ;; + prepare-unpause-events) cmd_prepare_unpause events "$@" ;; + verify-upgrade-profile) cmd_verify_upgrade profile "$@" ;; + verify-upgrade-events) cmd_verify_upgrade events "$@" ;; + upgrade-status) cmd_upgrade_status ;; + verify) cmd_verify ;; + propose-upgrade-*|apply-upgrade-*|migrate-*|cancel-upgrade-*|pause-*|unpause-*|upgrade-*) + err "$ACTION cannot submit as the 2-of-3 admin; use the matching prepare-* action, sign sequentially, and send" ;; "") - err "no action specified. See mainnet-deploy-runbook.md for usage." + err "no action specified; see the usage at the top of this script and docs/upgrade-runbook.md" ;; *) - err "unknown action: $ACTION. See mainnet-deploy-runbook.md for usage." + err "unknown action: $ACTION; see the usage at the top of this script" ;; esac diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index dfa9806..cd715f3 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -4,23 +4,24 @@ There are two coherent ways to build a contract for a platform like Boundless: -**Custody-only on-chain.** Contract holds money. Everything else (event records, submissions, winners, reputation) lives off-chain in Postgres. The platform is the source of truth. Cheap to audit; useless for transparency; reintroduces all the trust we're trying to remove. +**Custody-only on-chain.** Contract holds money. Everything else (event records, winners, reputation) lives off-chain in Postgres. The platform is the source of truth. Cheap to audit; useless for transparency; reintroduces all the trust we're trying to remove. -**Custody plus the records that matter on-chain.** Contract holds money, event existence, key terms, submission anchors, winner records, and reputation. The platform is the source of truth for everything that benefits from iteration speed (descriptions, KYC, role policies, AI) but cannot edit the things that demand transparency. +**Custody plus the records that matter on-chain.** Contract holds money, event existence, the terms that decide who is owed what, winner awards, and reputation. The platform is the source of truth for everything that benefits from iteration speed (descriptions, applications, KYC, role policies, AI) but cannot edit the things that demand transparency. We took the second path. This document explains the boundary. -The boundary has moved once: through contract version 1.0.0, per-user credit balances also lived on-chain in the profile contract. The 1.0.0 โ†’ 1.1.0 upgrade (2026-06) removed them. Credits are a product-pricing lever, not a settlement promise โ€” they were being retuned at product speed, which is exactly the iteration-speed test above. They now live in an off-chain ledger in boundless-nestjs; the profile contract holds only reputation scores and per-token earnings. +The boundary has moved twice, both times toward the platform. Through 1.0.0 the profile contract held per-user credit balances; 1.1.0 removed them, because credits are a pricing lever that product retunes often, which is exactly the iteration-speed test above. Through 1.7.0 the events contract also held applicant and submission records (`apply`, `apply_to_bounty`, `submit` and their registries); 2.0.0 removed them, because no payout ever read them: what the chain enforces is the award recorded at selection. Both now live in boundless-nestjs. ## What goes on-chain | Family | Lives in | Why | |--------|----------|-----| -| Event existence (id, owner, pillar, token, total_budget) | events contract | Organizers cannot quietly delete events that went badly. | -| Event key terms (release_kind, deadline, winner_distribution) | events contract | These define what is owed to whom; mutating them off-chain would let the platform rewrite outcomes. | -| Submission anchors (applicant, content_uri, timestamp) | events contract | Tamper-proof participation history. | -| Winner records (recipient, position, amount, milestone, paid_at) | events contract | The promise of "you won this much" has to be enforced by the chain. | -| Escrow balance and fee withholding | events contract | The platform cannot hold the keys to event funds. | +| Event existence (id, pillar, owner, token, total budget, title, content URI) | events contract | Organizers cannot quietly delete events that went badly. | +| Terms that decide payouts (release kind, prize floors, fee override) | events contract | A published prize table is a guarantee: `select_winners` may pay above a position's floor but never below it. Mutating these off-chain would let the platform rewrite outcomes. The deadline is stored for reference and not enforced. | +| Winner awards, the grant roster, and payment state (recipient, position, amount, milestone, paid_at) | events contract | The promise of "you won this much" has to be enforced by the chain. | +| Contributors and their amounts | events contract | Refunds on cancellation are computed from them. | +| Escrow balance, owed total, and fee withholding | events contract | The platform cannot hold the keys to event funds. | +| Event manager delegation | events contract | Selection and cancellation authority must be provable. | | Token whitelist | events contract | Admin-managed; on-chain so the whitelist is auditable. | | Reputation scores | profile contract | The platform cannot inflate or deflate reputation. | | Per-token earnings | profile contract | The promise of "you've earned this much" matches the chain's record of releases. | @@ -30,42 +31,44 @@ The boundary has moved once: through contract version 1.0.0, per-user credit bal | Family | Why | |--------|-----| +| Applications, submissions and entries | Moved off chain in 2.0.0. Judging works from them, but no payout reads them; the award recorded at selection is what the chain enforces. | | Rich content (descriptions, banners, write-ups, comments) | Stored in S3, referenced by content_uri. Cheap to mutate; on-chain would burn storage. | | Draft state | Drafts never hit the contract. Only published events do. | | KYC tiers and verification details | PII. | | Role policies and per-event reviewer assignments | Iterate rapidly without contract upgrades. | -| Credit balances and credit charges (application costs, refunds) | Off-chain ledger since the 1.1.0 upgrade (2026-06). Credits are pricing policy, not settlement; keeping them on-chain froze product tuning behind contract upgrades. | -| Tier brackets and credit-discount rules | Off-chain policy that interprets on-chain scores; lets product tune without audit. | +| Credit balances and charges | Off-chain ledger since 1.1.0. Credits are pricing policy, not settlement. | +| Tier brackets and other rules that interpret on-chain scores | Lets product tune without an audit. | | AI features (organizer assist, judging assist, similarity detection) | Out of scope for any contract. | | Moderation queue, notifications, analytics, exports | None of these benefit from immutability. | -| Indexed event queries | Linear-scan getters in the contract burn cost; off-chain mirror serves them cheaply. | +| Indexed event queries | Linear-scan getters in the contract burn cost; an off-chain mirror serves them cheaply. | ## Why two contracts and not one -Soroban's compiled WASM size limit is 64 KB. The platform contract that holds events + escrow + multi-token + idempotency lands around 50 KB once all operation bodies are implemented. Adding reputation and earnings operations would push it over. +Soroban's compiled WASM size limit is 64 KB. The events contract, with escrow, multi-token support, idempotency and every pillar's flows, already sits close to it. Adding reputation and earnings would push it over. -The natural split line: events are per-event; profile is per-user. Cross-family operations (apply bootstraps the applicant's profile; select_winners bumps reputation and registers earnings) happen at the events-to-profile boundary, where the events contract calls the profile contract with explicit auth. +The natural split line: events are per-event; profile is per-user. Cross-family operations (a payout bumps the winner's reputation and registers the earnings) happen at the events-to-profile boundary, where the events contract calls the profile contract with explicit auth. Three contracts would have been over-engineering. Two contracts split is the smallest cut that keeps both under the ceiling while keeping cross-contract calls bounded. ## The cross-contract dance ``` -event owner require_auth() in events contract (select_winners) - events contract holds the binding for the profile contract address - events contract calls profile.bump_reputation(winner, delta, "win", child_op_id) - events contract calls profile.register_earnings(winner, token, amount, child_op_id) +winner signs claim_prize (or the owner signs claim_milestone) in the events contract + events contract pays the recipient from escrow + events contract calls profile.bootstrap(recipient, child_op_id) + events contract calls profile.bump_reputation(recipient, delta, "win", child_op_id) + events contract calls profile.register_earnings(recipient, token, amount, child_op_id) profile contract verifies events_contract.require_auth() profile contract mutates reputation / earnings, emits events ``` -Users cannot call profile mutations directly. The profile contract verifies the caller is the registered events contract address (or admin for direct grants and slashes). The `events_contract` binding in the profile contract is two-step rotatable so the events contract can be upgraded or replaced without re-deploying profile. +The profile calls are best-effort: the payment is final, so a profile failure never reverts it. Users cannot call the profile mutations directly; the profile contract only accepts them from its bound events contract, and the admin can only lower a score (`admin_slash_reputation`, with a reason). A user may create their own empty profile with `bootstrap_self`. The binding is set once at deploy and later rotated through a timelocked two-step (`propose_events_contract`, `accept_events_contract`), so the events contract can be replaced without redeploying profile. ## Multichain readiness without multichain code -v1 ships Stellar-only. The Chain Abstraction ADR (`boundless-chain-abstraction-adr.md`) defines what the off-chain orchestrator does to keep the doors open: `chain_id` everywhere in nestjs schema, `ChainAdapter` interface with `StellarAdapter` as the only implementation, per-chain wallets and fee accounts. +v1 ships Stellar-only. The off-chain orchestrator keeps the doors open: chain ids throughout the backend schema, a chain adapter interface with Stellar as its only implementation, and per-chain wallets and fee accounts. -The contracts themselves do nothing for multichain. The only hook is the `profile_contract` binding on the events contract: when profile relocates to a cross-chain-aware deployment (someday), the events contract swaps the address. No event-contract code change. +The contracts themselves do nothing for multichain. The only hook is the `profile_contract` binding on the events contract: if profile ever relocates to a cross-chain-aware deployment, the events contract swaps the address. No events-contract code change. ## Deployment-epoch IDs @@ -78,35 +81,39 @@ fn id_base(env: &Env) -> u64 { } ``` -The off-chain orchestrator's `EventReference` type includes the contract address so a single u64 alone is never enough to point at an event globally. The chain prefix from the ADR completes the global namespacing. +The off-chain orchestrator's `EventReference` type includes the contract address so a single u64 alone is never enough to point at an event globally. ## Idempotency -Every state-mutating op accepts an `op_id: BytesN<32>` derived deterministically off-chain. The contract refuses to replay. The orchestrator interprets the replay error as success-from-prior-attempt. `OpSeen` markers use temporary storage, which auto-expires (Soroban TTL). The orchestrator caps reconciliation at 14 days to stay inside that window. +Every state-mutating op accepts an `op_id: BytesN<32>` derived deterministically off-chain. The contract refuses to replay. The orchestrator interprets the replay error as success-from-prior-attempt. `OpSeen` markers are keyed by the authorizing caller and the `op_id`, so a permissionless call cannot squat a privileged caller's id, and live in temporary storage, which expires on its own (Soroban TTL). The orchestrator caps reconciliation at 14 days to stay inside that window. ## Token whitelist and multi-token -The events contract supports any SAC-compatible token, but only tokens admin-registered with `register_supported_token`. The whitelist is on-chain so the registry is auditable. The pre-flight check on registration verifies the fee account has a trustline for the new token by attempting a zero-amount self-transfer; missing trustline reverts. +The events contract supports any SAC-compatible token, but only tokens the admin registers with `register_supported_token`. The whitelist is on-chain so the registry is auditable. -Launch whitelist: USDC. Phase 2: XLM. Adding a token after launch is documented in the platform contract PRD Section 8.4. +The contract does not check that the fee account can receive a token: a Stellar Asset Contract's `balance()` cannot tell a missing trustline from a zero balance. A missing trustline makes every deposit in that token revert, so the operator checks it off chain before registering a token or rotating the fee account (`scripts/admin/verify-fee-trustline.sh`, which `register_token.sh` and `deploy_mainnet.sh register-token` run). Mainnet whitelists USDC and native XLM. ## Authority model -Three roles, no overlap: +| Role | Who | Can | +|------|-----|-----| +| Admin | The platform's 2-of-3 multisig | Rotate the admin (two-step), set the fee rate and fee account, register and deregister tokens, change the profile binding, pause and unpause, upgrade through the timelock, appoint or clear the release validator. Cannot move escrow. | +| Event owner | The organizer, set at `create_event` | Fund the event, release grant and crowdfunding milestones (`claim_milestone`), forfeit a grant milestone it rejects, take management back before the first award (`reclaim_management`). Manages the event itself until it delegates. | +| Event manager | Optional, per event | Whoever currently manages (the owner at first) proposes a successor with `propose_manager`, which takes over once it accepts within 17,280 ledgers. Selects winners, starts a cancellation, delegates onward. Never holds custody: refunds route to the owner and contributors by construction. | +| Release validator | Optional, platform-wide | Co-signs every crowdfunding milestone release with the campaign owner. The admin proposes it and the key itself accepts within 120,960 ledgers; the admin can clear it at once, and co-signs itself while none is appointed. Decides when a release happens, never where the money goes or how much. | +| Winner | A recorded award's recipient | Collect its own prize with `claim_prize`. | +| Contributor | Anyone who adds funds | `add_funds`, and `claim_refund` for a refund the contract had to hold back. | +| Anyone | No signature | Drive a started cancellation forward (`process_cancel_batch`, `finalize_cancel`), so an absent owner or manager cannot strand it. | -- **Admin.** Platform deployment multisig. Can rotate admin, change fee bps, change fee account, register and deregister tokens, change profile contract binding, pause and unpause, upgrade. All admin ops require `admin.require_auth()`. -- **Event owner.** The organizer, set at create_event. Can cancel their event, select winners, claim milestones. `owner.require_auth()` on every owner op. -- **Applicant.** Per user. Can apply, submit, withdraw application, withdraw submission for themselves. `applicant.require_auth()` on every applicant op. - -Admin rotations are two-step (set_admin then accept_admin within 7 days at testnet cadence). Same pattern for profile-contract binding rotation. Prevents accidental key changes. +Every role-gated call uses `require_auth()` on that role's address. Admin rotations are two-step (set_admin then accept_admin within 120,960 ledgers), the same pattern as the profile binding and the release validator, so a typo or a key nobody holds can never take over. ## Pause -Admin can pause the entire events contract or the entire profile contract. Pause blocks every state-mutating op except admin ops. Reads continue. Designed for emergency response, not routine operation. +The admin can pause the events contract or the profile contract. Pause blocks every event-lifecycle call; reads and admin calls continue, so an upgrade can run while paused. Designed for emergency response and upgrade windows, not routine operation. ## Upgrade -Standard Soroban `update_current_contract_wasm`. Storage layout migrations are the caller's responsibility. Soroban does not move data automatically; we plan storage shapes to be additive across upgrades. +Upgrades are timelocked. The admin proposes a wasm hash and version (`propose_upgrade`), and `apply_upgrade` swaps the code no earlier than 17,280 ledgers (about a day) later on mainnet builds; testnet builds compile the wait to zero. The proposal is public for the whole window and can be cancelled. Storage shapes are planned to be additive; when a layout has to change, as it did for prize floors in 1.7.0, `migrate_events` converts old records in pages and `migrate` refuses to stamp the new version until none remain. The procedure is `docs/upgrade-runbook.md`. ## The 64 KB discipline diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md index 234b447..7b0e316 100644 --- a/docs/DEPLOYMENT.md +++ b/docs/DEPLOYMENT.md @@ -1,275 +1,246 @@ -# Deployment runbook - -Deploys the `boundless-events` and `boundless-profile` Soroban contracts to a -Stellar network, wires them together, and emits the env values the nestjs -orchestrator needs. - -Scripts: `scripts/deploy/{deploy,register_token,verify}.sh`. - ---- - -## 0. Decisions to lock before deploying - -Each of these is a per-network parameter the contracts are constructed with. -Pick once per environment and document. - -| Parameter | Where it goes | What it does | -|---|---|---| -| **Network** | `stellar --network` | testnet / futurenet / mainnet. | -| **Admin identity** | both contracts' `admin` | controls `set_admin`, `set_fee_bps`, `pause`, `upgrade`, `register_supported_token`. **Use a Stellar multisig account for mainnet.** Testnet can be a single key. | -| **Fee account** | events `fee_account` | G-address that receives the platform fee on every deposit. Must hold a trustline for every registered token. **Should be a separately-keyed account from admin.** | -| **Fee bps** | events `fee_bps` | Basis points. 100 = 1%, 250 = 2.5%. Contract caps at 1000 (10%) per audit L4. | -| **USDC asset address** | events `register_supported_token` | Token contract (SAC) address. See Section 4. | - -> Contract versions up to 1.0.0 also took a `default_bootstrap_credits` constructor parameter on the profile contract. The 1.1.0 upgrade (2026-06) removed on-chain credits โ€” they are now an off-chain ledger in boundless-nestjs โ€” so the profile constructor takes only `admin`. - -Production values land in `deployments/.json` after `deploy.sh` runs. - ---- - -## 1. Prerequisites (one-time per workstation) - -```sh -# stellar CLI โ€” version 26.0.0 or newer required. -# Older CLIs reject Rust 1.90.0 wasm32v1-none output with -# "reference-types not enabled" at simulation time. -brew install stellar/tap/stellar-cli # or cargo install --locked stellar-cli@26.1.0 -stellar --version # confirm >= 26.0.0 - -# rust toolchain -rustup target add wasm32v1-none - -# verify build still passes locally -cd contracts/events && stellar contract build --locked && cd ../.. -cd contracts/profile && stellar contract build --locked && cd ../.. -``` - -### Create the admin identity (per network) +# Deploying the contracts + +This covers a fresh deployment of `boundless-profile` and `boundless-events`: +build, deploy, wire the two together, register tokens, verify, and on mainnet +hand admin to the multisig. Upgrading a live deployment is in +`docs/upgrade-runbook.md`; how a multisig transaction is built, signed and +submitted is in `docs/contract-ops-runbook.md`; who may sign what is in +`docs/admin-custody-policy.md`. + +Testnet and futurenet deploy with `scripts/deploy/*.sh`. Mainnet deploys with +`./deploy_mainnet.sh`, which adds a typed confirmation, checks the CLI network +config, and refuses to deploy over an existing record. + +## 1. What a deployment is made of + +| Parameter | Where it goes | +|---|---| +| Admin | Constructor of both contracts. A single CLI identity on testnet. On mainnet a throwaway deployer key that hands admin to the 2-of-3 multisig straight after the deploy. | +| Fee account | Events constructor (`fee_account`). Receives the platform fee on every deposit and crowdfunding release, so it needs an authorized trustline for every registered token. Keep it separate from the admin. | +| Fee bps | Events constructor (`fee_bps`). 250 is 2.5%. The contract refuses fees above 1000 (10%). | +| Profile binding | Events constructor (`profile_contract`), then `profile.set_events_contract(events)`. The second call works once; later changes go through the timelocked rotation in `docs/upgrade-runbook.md`. | +| Tokens | `register_supported_token` on events, one call per token. | + +The profile constructor takes only `--admin`. The events constructor takes +`--admin --fee_account --fee_bps --profile_contract`, so profile is always +deployed first. + +Each deploy writes a local record to `deployments/.json` (and +mainnet upgrades append to `deployments/mainnet-upgrades.jsonl`). The +`deployments/` directory is gitignored: the records live on the operator's +machine, so keep a copy with the team's ops notes. Published contract ids are +in the README. + +## 2. Toolchain + +- Rust 1.93.0 with the `wasm32v1-none` target (`rust-toolchain.toml` pins it). +- soroban-sdk 28.0.0 (workspace `Cargo.toml`). +- Stellar CLI 28.1.0, the version CI pins; `deploy_mainnet.sh` refuses any + other. `cargo install --locked stellar-cli@28.1.0`. +- `jq`. + +Build with `scripts/build-release.sh`, which runs `stellar contract build +--locked` with machine paths remapped, so the same commit gives the same hash +on any machine of the same platform. Mainnet builds use +`scripts/build-release-linux.sh`, which runs that build in CI's Linux x86-64 +environment through Docker, so its hashes match CI's from any machine. A plain +`cargo build --target wasm32v1-none` is refused by SDK 28. Testnet and +futurenet builds add `--features testnet`, which sets the upgrade timelock to +0 ledgers; mainnet builds leave it off and carry the 17,280-ledger timelock. +The scripts choose the right build for the network. + +## 3. Testnet and futurenet + +### 3.1 Identities ```sh -# Generates and funds a testnet admin identity via friendbot. stellar keys generate boundless-admin --network testnet --fund - -# Show its G-address. -stellar keys address boundless-admin -``` - -For mainnet, generate without `--fund`, send XLM manually, and convert the -account to a multisig before any contract deploy. See the wallet runbook in -`boundless-infra/`. - -### Create or pick the fee account - -```sh stellar keys generate boundless-fee --network testnet --fund -stellar keys address boundless-fee # -> G... ; this goes into FEE_ACCOUNT +stellar keys address boundless-fee # this is FEE_ACCOUNT ``` -The fee account does NOT need to be a CLI identity (it never signs contract -calls). Treat the value as data; what matters is that it has trustlines for -every token before that token is registered. +The fee account never signs a contract call. It only needs to exist and hold +trustlines. ---- - -## 2. Configure deployment parameters +### 3.2 Parameters ```sh cp .env.deploy.example .env.deploy -$EDITOR .env.deploy -``` - -Required values: - -``` -ADMIN_IDENTITY=boundless-admin -FEE_ACCOUNT=G... # output of `stellar keys address boundless-fee` -FEE_BPS=250 # 2.5% +$EDITOR .env.deploy # ADMIN_IDENTITY, FEE_ACCOUNT, FEE_BPS ``` -`.env.deploy` is gitignored. Do not commit. - ---- +`.env.deploy` is gitignored and is parsed as plain `KEY=VALUE` lines, never +executed. -## 3. Deploy + wire +### 3.3 Deploy and wire ```sh ./scripts/deploy/deploy.sh testnet ``` -The script does, in order: +The script builds both contracts with `--features testnet`, deploys profile, +deploys events against it, calls `profile.set_events_contract`, and writes +`deployments/testnet.json` (including `deployer_identity`, which +`./deploy_and_upgrade.sh` uses as its default signer). It prints the two +contract ids for the backend environment. -1. `stellar contract build` on both contracts. -2. Deploys `boundless-profile` first (events constructor needs its address). -3. Deploys `boundless-events` with `fee_account`, `fee_bps`, and the profile contract id. -4. `profile.set_events_contract(events_id)` so profile recognizes the events contract for cross-contract auth. -5. Writes the deployment record to `deployments/testnet.json`. -6. Prints the env-var lines for the nestjs side. +### 3.4 Register tokens -Expected output tail: - -``` -==> done. summary written to deployments/testnet.json - -set these in the nestjs deployment env: - BOUNDLESS_EVENTS_CONTRACT_ADDRESS=C... - BOUNDLESS_PROFILE_CONTRACT_ADDRESS=C... - -next: ./scripts/deploy/register_token.sh testnet -``` - ---- - -## 4. Add the fee-account trustline + register the token - -USDC on testnet uses the Circle test issuer. The token contract address -depends on whether you wrap the Stellar Classic asset or use Circle's Soroban -deployment directly. Check Stellar's developer portal for the current testnet -USDC SAC address before running this step. - -### 4a. Add the trustline (off-chain) - -The contract's `register_supported_token` does NOT verify the trustline (a -Soroban contract cannot authorize a deeper-than-root call). The admin runbook -covers it instead: +Give the fee account a trustline first, then register: ```sh -# Where boundless-fee is the CLI identity that owns the FEE_ACCOUNT key. -# (If FEE_ACCOUNT is a separate non-CLI account, run this on that account's -# signing setup.) -stellar tx new change-trust \ - --source boundless-fee \ - --network testnet \ +stellar tx new change-trust --source boundless-fee --network testnet \ --line USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5 -# Verify: -stellar contract invoke \ - --id CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75 \ - --network testnet \ - -- balance --id "$(stellar keys address boundless-fee)" +./scripts/deploy/register_token.sh testnet \ + CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA \ + USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5 ``` -(`CCW67TSZV3SSS...` is the testnet USDC SAC address at the time of writing; -verify against current docs.) +`CBIELTK6โ€ฆ` is the testnet USDC SAC. The script checks that the asset you name +is the one the token contract wraps (`stellar contract id asset`) and runs +`scripts/admin/verify-fee-trustline.sh` before it signs; the contract checks +neither, and a missing trustline makes every `create_event` and `add_funds` in +that token revert. For native XLM pass `native` as the asset and the id that +`stellar contract id asset --asset native --network testnet` prints. -### 4b. Register on the events contract +### 3.5 Verify ```sh -./scripts/deploy/register_token.sh testnet +./scripts/deploy/verify.sh testnet ``` -The script prompts to confirm the trustline exists, then invokes -`register_supported_token`. The record updates `deployments/testnet.json` with -the supported token. +It prints the record next to each contract's version, migration marker, admin, +fee account, fee bps, bindings, release validator and pause flag. Both admins +should be the deployer, the bindings should point at each other, and neither +contract should be paused. ---- +## 4. Mainnet -## 5. Verify +### 4.1 Before you start -```sh -./scripts/deploy/verify.sh testnet -``` - -Cross-checks the deployment record against on-chain state. Both contracts -should report the expected admin, the events contract should report the -profile contract id, the profile contract should report the events contract -address, and both should be `is_paused == false`. +- The release has been through the third-party audit, and the same commit has + been deployed and exercised on testnet. +- The admin multisig is provisioned and passes + `scripts/admin/verify-multisig.sh` with the signer roster pinned + (`docs/multisig-guide.md`, Part E). +- The fee account exists, is funded, and holds an authorized trustline for + every token you will register. +- Two people who can stop the deploy are present for the whole window. -If anything looks wrong, treat it as a deploy regression and re-deploy fresh. -Soroban storage costs are real but minimal at this scale. +### 4.2 Network and environment ---- +Configure a named network once and use only that name. `deploy_mainnet.sh` +checks that it carries the public passphrase and a real RPC URL, and refuses +to run while `STELLAR_RPC_URL` or `STELLAR_NETWORK_PASSPHRASE` is set (mixing +the two breaks RPC resolution; see `docs/contract-ops-runbook.md`, rule 5). -## 6. Update nestjs orchestrator env +```sh +stellar network add boundless-mainnet \ + --rpc-url \ + --network-passphrase "Public Global Stellar Network ; September 2015" +export STELLAR_NETWORK=boundless-mainnet +unset STELLAR_RPC_URL STELLAR_NETWORK_PASSPHRASE -Take the `BOUNDLESS_EVENTS_CONTRACT_ADDRESS` and -`BOUNDLESS_PROFILE_CONTRACT_ADDRESS` lines from `deploy.sh`'s output and put -them in the nestjs deployment environment (Railway, etc.): +stellar keys generate boundless-deployer # throwaway initial admin +stellar keys address boundless-deployer # fund it with about 10 XLM +export INITIAL_ADMIN_KEY=boundless-deployer +export FEE_ACCOUNT=G... # the fee account +export INITIAL_GLOBAL_FEE_BPS=250 ``` -STELLAR_RPC_URL=https://soroban-rpc.testnet.stellar.org -STELLAR_NETWORK_PASSPHRASE=Test SDF Network ; September 2015 -BOUNDLESS_EVENTS_CONTRACT_ADDRESS=C... -BOUNDLESS_PROFILE_CONTRACT_ADDRESS=C... -``` -The env schema (`src/config/env-schema.ts`) validates both addresses are -56-char strings starting with `C`. Mistakes surface at app boot. +The deployer key exists only to deploy and rotate. It is destroyed in 4.6. + +### 4.3 Deploy and wire ---- +```sh +./deploy_mainnet.sh deploy-profile +./deploy_mainnet.sh deploy-events +``` -## 7. Apply the Prisma migration +Each command asks you to type `mainnet`, builds its contract without the +testnet feature, deploys it, and records the id and the deployed wasm hash in +`deployments/mainnet.json`. It stops if the deployed hash differs from the +local build. `deploy-events` also calls `profile.set_events_contract`. Either +command refuses to run if the record already names that contract. -Against the active database (dev / staging / production): +### 4.4 Register tokens ```sh -cd ../boundless-nestjs -npx prisma migrate deploy +./deploy_mainnet.sh register-token \ + CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75 \ + USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN ``` -Creates the `escrow_op` table + three enums. Migration file: -`prisma/migrations/20260601213000_add_escrow_op/migration.sql`. +`CCW67TSZโ€ฆ` is the mainnet USDC SAC. As on testnet, the asset must be the one +the contract wraps and the fee account trustline must pass before anything is +signed. For native XLM pass `native` and the id from +`stellar contract id asset --asset native --network "$STELLAR_NETWORK"`. +`register-token` only works while the deployer is still admin; after the +rotation, register through the multisig (`docs/contract-ops-runbook.md`, +Section 5) and run `verify-fee-trustline.sh` first. -Verify: +### 4.5 Verify, smoke, rotate admin ```sh -npx prisma db pull --print 2>&1 | grep -A 8 "^model EscrowOp" -# or, on the DB directly: -psql "$DATABASE_URL" -c '\d escrow_op' +ADMIN_SOURCE=$(stellar keys address boundless-deployer) ./deploy_mainnet.sh verify ``` ---- - -## 8. Smoke-test the orchestrator end-to-end +Before rotating, run one small end-to-end flow against the new contracts with +the backend's smoke scripts (see the boundless-nestjs repo, which also owns +the env values, migrations and orchestrator checks that follow a deploy). If +anything is wrong, the deployer can still `pause` both contracts on its own. -After the nestjs deployment picks up the new env vars and the migration is -applied: +Then hand admin to the multisig: ```sh -# From a node REPL or a small script in the nestjs repo: -import { EscrowOrchestratorService } from './modules/escrow-contract/...'; - -// Build an unsigned create_event XDR. No tokens move; this only assembles -// the transaction and stores an EscrowOp row. -const op = await orchestrator.beginCreateEvent({ - entityKind: 'HACKATHON', - entityId: 'hck_smoke_test', - params: { /* CreateEventParams */ }, -}); - -console.log(op.opId, op.status, op.unsignedXdr); +EXPECTED_SIGNERS=,, ./deploy_mainnet.sh rotate-admin ``` -The expected state is `PENDING_SIGN` with a non-empty `unsignedXdr`. If the -RPC call fails, check the contract address env vars and that the deployment -record matches what's on chain. +`rotate-admin` runs `scripts/admin/verify-multisig.sh` against the multisig +(and the roster, when `EXPECTED_SIGNERS` is set), asks for the typed +confirmation, and calls `set_admin` on both contracts from the deployer. The +multisig then accepts on each contract. Wait about ten seconds after +`set_admin` so the nomination is in a closed ledger, then build and simulate: ---- +```sh +EVENTS_ID=$(jq -r .events_contract deployments/mainnet.json) +stellar contract invoke --network "$STELLAR_NETWORK" \ + --source-account --id "$EVENTS_ID" --build-only \ + -- accept_admin \ + | stellar tx simulate --network "$STELLAR_NETWORK" \ + --source-account > events-accept-admin.xdr +``` -## 9. Rollback +Sign it sequentially with two signers and submit it with `stellar tx send` +(`docs/contract-ops-runbook.md`, Section 5). Repeat for the profile contract. +Then confirm both admins changed and record the four transaction hashes: -The contract layer has no migration story for breaking changes; a bad deploy -means deploying fresh and pointing the orchestrator at the new addresses. +```sh +ADMIN_SOURCE= ./deploy_mainnet.sh verify +jq --arg a '.admin = $a' deployments/mainnet.json > tmp.json \ + && mv tmp.json deployments/mainnet.json +``` -For the orchestrator, every `EscrowOp` row carries the contract addresses -it targeted (via `signer_hint` + the deployment record); a redeploy creates -new event_ids and a new namespace. +Prove the signing path once with a no-op admin call, for example +`set_fee_bps` to its current value. -Migration rollback: +### 4.6 Destroy the deployer key ```sh -# Reverse the schema migration manually if needed. -psql "$DATABASE_URL" -c 'DROP TABLE escrow_op; DROP TYPE "EscrowOpKind"; DROP TYPE "EscrowOpStatus"; DROP TYPE "EscrowOpEntityKind";' -# Then delete the migration directory and re-generate the Prisma client. +stellar keys rm boundless-deployer ``` -Or, more cleanly, write a follow-up migration that drops the table. +The account keeps any leftover XLM but has no authority over either contract. +Sweep it first if you want the balance back. ---- +## 5. If a deploy goes wrong -## Cross-references +Before the rotation, the deployer pauses either contract directly +(`stellar contract invoke ... -- pause`). After it, pausing is a 2-of-3 +multisig call: `./deploy_mainnet.sh prepare-pause-events `. -- `scripts/deploy/deploy.sh`, `register_token.sh`, `verify.sh` -- `boundless-platform-contract-prd.md` Section 12 (deployment) -- `boundless-payout-prd.md` Section 9.1 (orchestrator integration) -- `boundless-credits-reputation-prd.md` Section 9 (credit policy โ€” implemented as an off-chain ledger in boundless-nestjs since the 1.1.0 upgrade) -- `.env.deploy.example` (per-network parameter template) +A fresh deploy has no in-place undo. If the contracts are misconfigured in a +way the admin setters cannot fix, deploy a new pair, point the backend at the +new ids, and leave the old pair paused. diff --git a/docs/admin-custody-policy.md b/docs/admin-custody-policy.md index 35176cc..0f99fd3 100644 --- a/docs/admin-custody-policy.md +++ b/docs/admin-custody-policy.md @@ -10,8 +10,8 @@ The admin key controls the most sensitive operations on the Boundless contracts: Two phases. Both are 2-of-3 multi-sig; they differ in how the per-signer keys are stored. -- **Launch baseline (current):** software signers โ€” each signer runs Freighter (or an equivalent Stellar wallet) on their own machine, with a strong unique passphrase and a paper-only backup. This ships now. -- **Target state:** hardware-isolated signers per the original policy text below โ€” Yubikey, Ledger, or air-gapped machine. **Hardware upgrade trigger:** when total escrow TVL crosses the threshold set in section 10 below. +- **Launch baseline (current):** software signers. Each signer runs Freighter (or an equivalent Stellar wallet) on their own machine, with a strong unique passphrase and a paper-only backup. This ships now. +- **Target state:** hardware-isolated signers per the original policy text below: Yubikey, Ledger, or air-gapped machine. **Hardware upgrade trigger:** when total escrow TVL crosses the threshold set in section 10 below. Everything else in this document (thresholds, rotation, drills, operational hygiene) applies to **both phases identically.** The verify-multisig script does not care whether keys are hardware or software; it only checks the on-chain signer config. @@ -21,16 +21,19 @@ Section 3 describes the target-state hardware procedure. Section 3-bis describes ## 1. What the admin can do -The admin authority on `boundless-events` (and equivalently on `boundless-profile`) gates: +The admin authority on `boundless-events` gates: -- `set_fee_bps(new_bps)` โ€” change the global default fee rate. -- `set_fee_account(new_account)` โ€” change the address that receives fee revenue. -- `set_profile_contract(new_addr)` โ€” change which profile contract events writes to. -- `set_admin(new_admin)` โ€” rotate the admin authority (two-step with `accept_admin`). -- `pause()` โ€” emergency stop on all write ops. -- `unpause()` โ€” resume write ops. -- `upgrade(new_wasm_hash)` โ€” replace contract logic. -- `register_supported_token(token)` / `deregister_supported_token(token)` โ€” token whitelist. +- `set_fee_bps(new_bps)`: change the global default fee rate. +- `set_fee_account(new_account)`: change the address that receives fee revenue. +- `set_profile_contract(new_addr)`: change which profile contract events writes to. +- `set_admin(new_admin)`: rotate the admin authority (two-step with `accept_admin`). +- `pause()`: emergency stop on every event-lifecycle call. Admin calls keep working. +- `unpause()`: resume them. +- `propose_upgrade(wasm_hash, version)`, `apply_upgrade()`, `cancel_pending_upgrade()`: replace contract logic. Mainnet builds from events 2.0.0 and profile 1.2.1 make `apply_upgrade` wait 17,280 ledgers (about a day) after the proposal. `migrate_events(max_events)` and `migrate()` finish an upgrade (`docs/upgrade-runbook.md`). +- `register_supported_token(token)` / `deregister_supported_token(token)`: token whitelist. +- `propose_release_validator(target)`, `cancel_pending_release_validator()`, `clear_release_validator()`: appoint, withdraw a proposal for, or remove the co-signer for crowdfunding milestone releases (from events 2.0.0; see ยง4.1). The proposed key must accept with its own signature. While none is appointed, the admin co-signs those releases itself. + +The same multisig is admin of `boundless-profile`, where it holds `set_admin`, `pause` / `unpause`, the same upgrade calls, the timelocked rotation of the profile's events-contract binding (`propose_events_contract`, `accept_events_contract`, `cancel_pending_events_contract`), and `admin_slash_reputation(user, delta, reason)`. There is no other authority. The admin cannot move funds out of escrow directly; the contract enforces that. The admin can only change the rules of future operations and pause current ones. @@ -64,7 +67,7 @@ Three is the smallest set that supports 2-of-N. As the team grows, expand to 5 ( --- -## 3. Key generation and storage (target state โ€” hardware) +## 3. Key generation and storage (target state: hardware) Each signer generates their own key. We do not let any single person see another signer's key. The procedure per signer: @@ -75,9 +78,9 @@ Each signer generates their own key. We do not let any single person see another We do not have a "platform-held" backup. Loss of a signer's key without their personal recovery is a real operational risk; that is why the threshold is 2 of 3 (we can lose one and still recover). -## 3-bis. Key generation and storage (launch baseline โ€” Freighter) +## 3-bis. Key generation and storage (launch baseline: Freighter) -Per signer, in isolation. **The threat model here is "compromised machine" โ€” software keys are extractable from any machine that gets owned.** The hygiene below is what makes this safe-enough to ship and is required, not optional. +Per signer, in isolation. **The threat model here is "compromised machine": software keys are extractable from any machine that gets owned.** The hygiene below is what makes this safe-enough to ship and is required, not optional. 1. **Dedicated browser profile** on a personal machine (not a shared workstation, not a CI runner). No other browser extensions installed in that profile beyond Freighter. No untrusted tabs while signing. 2. **Generate the keypair in Freighter** with a strong, unique passphrase. Recommended: 6-word [Diceware](https://en.wikipedia.org/wiki/Diceware) or equivalent, never reused for any other purpose. Not your 1Password master, not your email password. @@ -115,17 +118,55 @@ The standard threshold is 2 of 3. The following operations have different requir |---|---|---| | `pause()` | **2 of 3 (lower bar)** | Emergency. Cap damage first; recover later. | | `unpause()` | 2 of 3 | Resume after fix is in place. | -| `upgrade(new_wasm_hash)` | 2 of 3 | Standard. Requires both pre-deploy review + audit refresh. | +| `propose_upgrade`, `apply_upgrade`, `cancel_pending_upgrade`, `migrate_events`, `migrate` | 2 of 3 | Standard. A proposal requires pre-deploy review and an audit refresh. | | `set_fee_bps(new_bps)` | 2 of 3 | Standard. | | `set_fee_account(new_account)` | **3 of 3 (higher bar)** | Most-sensitive op. Wrong address sends fees somewhere we cannot retrieve. | | `set_admin(new_admin)` | **3 of 3** | Rotating the admin itself. Highest-stakes change. | | `set_profile_contract` | 2 of 3 | Standard. | | `register_supported_token` / `deregister_supported_token` | 2 of 3 | Routine policy. | +| `propose_release_validator` | **3 of 3 (higher bar)** | Hands a routine co-signing role to a key outside this multi-sig (ยง4.1). | +| `clear_release_validator`, `cancel_pending_release_validator` | 2 of 3 | Removing or withdrawing returns co-signing to this multi-sig; it must be quick when a validator key is suspect. | The Stellar multi-sig itself does not support per-operation thresholds directly; we enforce these by signer convention with logged sign-off. Tools we build (admin signing portal) will enforce them programmatically. --- +### 4.1 Crowdfunding release validator + +Every crowdfunding milestone release needs the campaign owner's signature and a +co-signature. Before events 2.0.0 the co-signer was this multi-sig, which put +the keys that can upgrade the contract into a routine payout flow. From 2.0.0 +the admin can appoint a release validator to co-sign instead. + +- **What it can do.** Co-sign a release the campaign owner has also signed. The + contract computes the amount and always pays the owner, so the validator + decides when a release happens, never where the money goes or how much. +- **What it cannot do.** Anything else: it holds no admin power and cannot + move escrow on its own. +- **Custody.** A key held by none of the three admin signers. It may be its own + multi-sig (for example the operations team) or a backend-held key under the + same envelope encryption as managed wallets. A backend-held validator means a + backend compromise can approve releases early for campaigns whose owner is + also a managed wallet; choose accordingly. +- **Rotation.** Two steps, like the admin itself. The multi-sig calls + `propose_release_validator(target)` (`ReleaseValidatorProposed`), and the new + key calls `accept_release_validator` with its own signature within 120,960 + ledgers, about 7 days (`ReleaseValidatorUpdated`). Until it accepts, the + current validator, or the admin, keeps co-signing, so a typo or a key nobody + holds can never take over. A new proposal replaces a pending one, and + `cancel_pending_release_validator` withdraws it (`ValidatorProposalCancelled` + in both cases). +- **Removal.** `clear_release_validator` takes effect at once and returns + co-signing to the admin. That is the response to a validator key that is + lost or suspect; do not wait for a replacement to accept first. +- **Backend key.** When the validator key is held by the backend + (`RELEASE_VALIDATOR_SECRET_KEY`, or `_FILE`), the admin portal releases an + approved milestone in one call; otherwise whoever holds the key signs the + built release at the Lab. Accept the appointment with the same key the + backend is configured with. +- **Monitoring.** Alert on every `ReleaseValidatorProposed`, + `ReleaseValidatorUpdated` and `ValidatorProposalCancelled`. + ## 5. Signer rotation ### 5.1 Planned rotation (signer leaves the team) @@ -137,7 +178,7 @@ The Stellar multi-sig itself does not support per-operation thresholds directly; 5. New multi-sig accepts via `accept_admin`. 6. Verify on-chain via `get_admin`. 7. Outgoing signer destroys their key copy. -8. Document the rotation in `deployments/admin-rotations.jsonl`. +8. Document the rotation in the operator's local log, `deployments/admin-rotations.jsonl` (`deployments/` is gitignored; keep a copy with the team's ops notes). ### 5.2 Emergency rotation (signer key compromised or lost) @@ -183,9 +224,9 @@ For every admin operation: - [ ] Written request in `#ops-admin-requests` Slack channel with the proposed operation and reasoning. - [ ] Each signer confirms review in the same channel before signing. -- [ ] Signers coordinate on a Soroban CLI invocation; or use an admin signing portal (when built). +- [ ] The founder prepares a simulated transaction with the Stellar CLI (`docs/contract-ops-runbook.md`, Section 5) or the admin signing portal (when built), and every signer decodes it before signing. - [ ] On-chain operation is verified by the requester before the channel thread is closed. -- [ ] Operation logged in `deployments/admin-operations.jsonl`. +- [ ] Operation logged in the operator's local `deployments/admin-operations.jsonl`. This is not paranoia; it is a paper trail. Every fee change, every upgrade, every signer rotation has an auditable record. @@ -230,7 +271,7 @@ When the trigger fires, the upgrade procedure is: 3. Create a NEW multi-sig account with the three NEW hardware-backed addresses; verify with `./scripts/admin/verify-multisig.sh mainnet`. 4. Run the rotation per section 5.1 (`set_admin(new_multisig) โ†’ accept_admin`). 5. Destroy the software keys on each signer machine. Burn the paper backups. -6. Run the testnet drill on the new hardware multi-sig per `docs/multisig-preflight.md` ยง4. +6. Run the testnet drill on the new hardware multi-sig per `docs/multisig-guide.md` ยงE.10. 7. Log the rotation in `deployments/admin-rotations.jsonl` with both old and new multi-sig addresses + the threshold that triggered. The thresholds above are starting points. Review them at the same cadence as the annual policy review, or sooner if the team's risk tolerance changes. diff --git a/docs/audit/testnet-grant-run.md b/docs/audit/testnet-grant-run.md new file mode 100644 index 0000000..204b8a0 --- /dev/null +++ b/docs/audit/testnet-grant-run.md @@ -0,0 +1,524 @@ +# Testnet grant run + +Run 2026-10-03T18:06:56.506Z against `CBEODVJGUYCIYTVXD7KI5UG3BJ2UE4T7AGI2TGY3T4Q5GQRFGTRYVTZP` with the BGT test asset `CBEOUEMDTM56NRTOOSXCPGMD33RPD5YWEKJ542HAEVREAYCC4QIZ3XIU`. +317 of 317 checks passed across 154 transactions. +Highest fee paid by one transaction: 9998776 stroops. + +## setup + +- pass: BGT CBEOUEMDTM56NRTOOSXCPGMD33RPD5YWEKJ542HAEVREAYCC4QIZ3XIU is whitelisted on CBEODVJGUYCIYTVXD7KI5UG3BJ2UE4T7AGI2TGY3T4Q5GQRFGTRYVTZP (2.0.0) + + - [provision 2 accounts](https://stellar.expert/explorer/testnet/tx/7c685d046acea0cf323b8d9868b8fd93d3c6ab5b37c6fb192967a622eef88c1d) + - [provision 4 accounts](https://stellar.expert/explorer/testnet/tx/df6af281c3087efb852e3cdce1c15f0a82491bbd33fac16fedce097898ae7596) + - [provision 15 accounts](https://stellar.expert/explorer/testnet/tx/e679f186cdbf2b9d472970a3bbdc778cd1641f66d3f3e69f6d8fd587f629836a) + - [provision 15 accounts](https://stellar.expert/explorer/testnet/tx/a5eb0c85f7679eda38fd060f094ca7d667d84b3c359a8c51ce61d1011b56523e) + - [provision 15 accounts](https://stellar.expert/explorer/testnet/tx/22b2e9c031c404069cb181e3d45f94f2340b47c3dbfe5d2b7ae7609baa62c3d4) + - [provision 7 accounts](https://stellar.expert/explorer/testnet/tx/131ef06179e414362d2085e2271c957227cdc98d4b7c059a85668924e92c1218) + - [provision 3 accounts](https://stellar.expert/explorer/testnet/tx/ecbc1097b28dabd8d9b60177bc605049f88209dffa20466909940fb5983123df) + +## micro grant + +- pass: publish the grant +- pass: owner paid budget plus fee +- pass: select three recipients +- pass: release milestone 0 to GAG3YV +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GAUSXM +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GD4QY3 +- pass: milestone 0 paid exactly +- pass: completes when the last award is paid + + - [create_event](https://stellar.expert/explorer/testnet/tx/bff76c4f7acc7f98760865e403ed5687d78733f23e1c785348ce7b5a86b09e3d) + - [select_winners](https://stellar.expert/explorer/testnet/tx/167ea947488e4658b5eb88267cbc7608d2826f4bd8e16b582018454cf0132b07) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/6f738b752a546afb8d0e9e60651dcdf6752476c2001dca25b534adb48804abe5) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/66f5b15d0463c72209a55715ddbb2d704e36e92787bdf804b008e5b66cbe8c19) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/c1628333683853e479fd1ace196bfd3095fd9a29f8e90a70ef4f5eeecb6313a8) + +## tiered, rounding, any order + +- pass: publish the grant +- pass: owner paid budget plus fee +- pass: select three tiers +- pass: release milestone 2 to GADYBG +- pass: milestone 2 paid exactly +- pass: release milestone 0 to GBRG5F +- pass: milestone 0 paid exactly +- pass: release milestone 1 to GD3WIU +- pass: milestone 1 paid exactly +- pass: release milestone 2 to GBRG5F +- pass: milestone 2 paid exactly +- pass: release milestone 0 to GADYBG +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GD3WIU +- pass: milestone 0 paid exactly +- pass: release milestone 1 to GBRG5F +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GADYBG +- pass: milestone 1 paid exactly +- pass: release milestone 2 to GD3WIU +- pass: milestone 2 paid exactly +- pass: tier 1 received its whole award +- pass: tier 2 received its whole award +- pass: completed + + - [create_event](https://stellar.expert/explorer/testnet/tx/f9d66a52d1ea981a64d80b7c71a321429207a0895320358d8968a8c9e56c3ff2) + - [select_winners](https://stellar.expert/explorer/testnet/tx/f48ced0aa477e07e4fb68c743ef2595ac6a87af92c82c04e2306b45ac0f2825e) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/3734a44f17950b4a8a65ed0ffdb5fc5c308f54f13cb94c3dbf97b9a69f35c585) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/59374c0a23b51075a581d2c5e15fa407be8ef95e605013754745cd0ee7f54cfa) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/e5c2ba47fc881a8ddc1f39d0c4105a9aa3bd214338611d1f0b867456310aad6e) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/2f0c2eea34a9833b85d9049def3bcde4d463f552c6b17b49af6dcc2fd0f89a76) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/49941ec16dd25620c7b9c4f5a2d61ceaa622606e85e5af558035d4eaab0beafb) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/f2176dc27c1a6a36e7f7036e4382146d7e7b4a3b4ca93c96b44ecbf2fae6fca3) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/58f7cb213f7f31195275af96ec11d1e5ff174ef87ac691e05003c0928bbd91d0) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/288f75d577fd7c9fb0531f7123e73e7c24da90b4dd9f4daccc01fe222f61c30a) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/84af8971fc063d65b83f37ff40afbe7bbc1dd6b045a05eb567c9ecb30f838468) + +## forfeit and the cancel guard + +- pass: publish the grant +- pass: owner paid budget plus fee +- pass: select one recipient +- pass: release milestone 0 to GCDARJ +- pass: milestone 0 paid exactly +- pass: forfeit milestone 1 +- pass: a forfeit pays nothing +- pass: cancel refused while an award is owed (AwardsOutstanding) +- pass: release milestone 2 to GCDARJ +- pass: milestone 2 paid exactly +- pass: start cancel +- pass: grant cancelled +- pass: forfeited share returned to the owner + + - [create_event](https://stellar.expert/explorer/testnet/tx/b87715e8887699381c8cbeb63a93da82646dacacbd841c9960aac0454c1d3fac) + - [select_winners](https://stellar.expert/explorer/testnet/tx/088d8bfcd1597438d521b2dd641077068693b4de6b9a1e1b07c6f261b589d9dd) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/a430fc40b967d16bd8633bd7b24ea73cefc91bc21306d5a2f53eee12641b5e46) + - [forfeit_milestone](https://stellar.expert/explorer/testnet/tx/b96cfc4aeaa0f024b4a608fe9dea8dd0fc6ffa268ec4acd6eaf42cedb245f10e) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/56a09ed1691b673f645f491a3ff62f4db9d7f048855df0481c7e72b0f9cbeabf) + - [start_cancel](https://stellar.expert/explorer/testnet/tx/2a0d5145604453db88e2a9fdca3269ab588044c4ff2f80c14a54c1065ea580eb) + +## partners, pro rata + +- pass: publish the grant +- pass: owner paid budget plus fee +- pass: partner adds 20.0000000 +- pass: partner paid amount plus fee +- pass: award more than the budget, funded by the partner +- pass: release milestone 0 to GCA65U +- pass: milestone 0 paid exactly +- pass: partner adds 15.0000000 +- pass: partner paid amount plus fee +- pass: release milestone 1 to GCA65U +- pass: milestone 1 paid exactly +- pass: the late top-up keeps the grant open +- pass: start cancel +- pass: an empty refund batch is refused (InvalidBatchSize) +- pass: anyone can crank +- pass: anyone can finalize +- pass: partner 1 refunded pro rata +- pass: partner 2 refunded pro rata +- pass: owner gets nothing when partners are short + + - [create_event](https://stellar.expert/explorer/testnet/tx/d629631e613016bf786b8fd5844ece081896ce62c4bd472ec36b8c8ce83c9a8f) + - [add_funds](https://stellar.expert/explorer/testnet/tx/befd68dce6d058fefc0da9000d8956f38b0e7cbbba19f3fb88b15707f8ef55b2) + - [select_winners](https://stellar.expert/explorer/testnet/tx/058076ba208b7c625022d04bf248eaadb7a1a08113491b72b520fb9b50ca7aba) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/0bfdcaec66e7f2ec136f0ede9ffbfddad9e173afdeef02e6e38bca19bf016b23) + - [add_funds](https://stellar.expert/explorer/testnet/tx/ce7af8bdb4ab3d27e58c3231e94264586041771fcfbd1c262be12d4bbd1d36b6) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/7b92dbb0b5279e4621b140d4eb526771d7ac4a674f5b534bf0907a0df5e37296) + - [start_cancel](https://stellar.expert/explorer/testnet/tx/a14d2884832b9eb53293d4d069606acddf0b7d2770ad2141a2d19c53349ec2de) + - [process_cancel_batch](https://stellar.expert/explorer/testnet/tx/f0178dedb3f92bc9cd7ab4b6dedcebfd286aece1bcfaa5d148daaa0b135b1bdb) + - [finalize_cancel](https://stellar.expert/explorer/testnet/tx/bdda49e0394d31de6788b8a01591983b9eabd9e3742202e3167f6c608263123f) + +## frozen partner + +- pass: publish the grant +- pass: owner paid budget plus fee +- pass: partner adds 10.0000000 +- pass: partner paid amount plus fee +- pass: partner adds 10.0000000 +- pass: partner paid amount plus fee +- pass: start cancel +- pass: refund batch +- pass: finalize cancel +- pass: grant cancelled +- pass: other partners are refunded +- pass: owner residual paid +- pass: frozen partner refund held +- pass: a frozen account cannot take its refund yet (HostError: Error(Contract, #11)) +- pass: refund claimed after unfreezing +- pass: frozen partner made whole +- pass: a second claim is refused (NoRefundOwed) + + - [create_event](https://stellar.expert/explorer/testnet/tx/da2a1869751d7da5014ab4518efd2d0f7f898fab700be9582a3d49541e5c30fa) + - [add_funds](https://stellar.expert/explorer/testnet/tx/51647f68ee81d423b216a10ca0adab36da2363f3c446423caf23c3190aeff9a4) + - [add_funds](https://stellar.expert/explorer/testnet/tx/0b17ad6afa05b1685ca34bfc2a43061670c147a82c05579f30e3d26015b14eca) + - [freeze](https://stellar.expert/explorer/testnet/tx/2bb14ddd42f0e93a25a524857dfa998e4320ecfa1d1acfbaa0701779a1bc9b21) + - [start_cancel](https://stellar.expert/explorer/testnet/tx/94a1a9fd22fb3d687e6338bc9644eb0363ed9ff6e3c4bf83ab47992d8553979d) + - [process_cancel_batch](https://stellar.expert/explorer/testnet/tx/39af2679ca4f07ea5b4ab4a26bfa8309ac8e413aedddbef70c706f45a341585f) + - [finalize_cancel](https://stellar.expert/explorer/testnet/tx/28289796ee0f4fad1bf61fb042539ce79559f2bbfa216ca4d8a13826861a4a0d) + - [unfreeze](https://stellar.expert/explorer/testnet/tx/d9bda9b42038fe3f0d8141a417369394089571239f3058ea00be6ba7331eb04f) + - [claim_refund](https://stellar.expert/explorer/testnet/tx/05bb0a7d788d1dd5b754f29b7db53a03141b3a1b743b50fe9dc90b5e406983a2) + +## refusals + +- pass: publish the grant +- pass: owner paid budget plus fee +- pass: one recipient, two awards (DuplicateRecipient) +- pass: award smaller than its milestones +- pass: reputation bump over the cap +- pass: more than 40 recipients +- pass: awards beyond the escrow +- pass: select +- pass: a second selection +- pass: milestone out of range +- pass: someone never selected +- pass: release milestone 0 to GAFWBO +- pass: milestone 0 paid exactly +- pass: the same milestone twice +- pass: release with an op id +- pass: the op id replayed +- pass: reputation bump over the cap on release +- pass: claim_prize is not a grant path +- pass: cancel refused while owed +- pass: forfeit milestone 2 +- pass: a forfeit pays nothing +- pass: forfeit milestone 3 +- pass: a forfeit pays nothing +- pass: start cancel +- pass: grant cancelled + + - [create_event](https://stellar.expert/explorer/testnet/tx/5dc59e21f7f6049c972687c72969e83ae3dff443eec51b5554af0a69f6e7fc13) + - [select_winners](https://stellar.expert/explorer/testnet/tx/73b61ad9ae46013e6b2543a5c0356d2a65109d1947ac80de302b284a03b84ac5) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/09fdeb0bad95ca16efdf3925e3872abb5d892c81e30e1be475d0fc6445804d7c) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/2cd16bf9ace33ecdd122560f19c01f596d909471fc5e839a14e0447d965274af) + - [forfeit_milestone](https://stellar.expert/explorer/testnet/tx/fa7e0123246123aa395bf32ec86410a43b75ffa5e864885bcef3a8e3007e4573) + - [forfeit_milestone](https://stellar.expert/explorer/testnet/tx/310e316b7df97b9153086f89a8f94f051a81d3b21d592ef86f0cf8c5b893f4c4) + - [start_cancel](https://stellar.expert/explorer/testnet/tx/7671a2264d61c708a6b3dfc7db00cd9e2f5a5508c5f9ab0264ff0b8ab9805274) + +## signatures + +- pass: publish the grant +- pass: owner paid budget plus fee +- pass: a stranger cannot select (HostError: Error(Auth, InvalidAction)) +- pass: owner selects +- pass: a recipient cannot release their own milestone (HostError: Error(Auth, InvalidAction)) +- pass: nothing moved +- pass: release milestone 0 to GAZ3NU +- pass: milestone 0 paid exactly + + - [create_event](https://stellar.expert/explorer/testnet/tx/709043ae8556bf6e7251084145aeee4999fb9ca131d9395a0f3b997f961975ab) + - [select_winners](https://stellar.expert/explorer/testnet/tx/553dca78a0d8f03e9c3944789e9256848f8d646e99dd717c832a6a44701171b3) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/a5b71774cb923e9b380892e533cb38341b5c59d629a48500b9bacfe45cdef7f6) + +## manager handover + +- pass: publish the grant +- pass: owner paid budget plus fee +- pass: manager accepts +- pass: manager recorded +- pass: the owner no longer selects (HostError: Error(Auth, InvalidAction)) +- pass: the manager selects +- pass: no reclaim after selection +- pass: the manager cannot release (HostError: Error(Auth, InvalidAction)) +- pass: release milestone 0 to GCCCB3 +- pass: milestone 0 paid exactly +- pass: release milestone 1 to GCCCB3 +- pass: milestone 1 paid exactly +- pass: publish the grant +- pass: owner paid budget plus fee +- pass: second manager accepts +- pass: owner takes management back +- pass: the owner manages again +- pass: owner selects after reclaiming +- pass: release milestone 0 to GCCCB3 +- pass: milestone 0 paid exactly + + - [create_event](https://stellar.expert/explorer/testnet/tx/4bc695b5acac2246ffbb9f13155bf8ad96bea25862d4a6c5a9753d8273f7d8ea) + - [accept_manager](https://stellar.expert/explorer/testnet/tx/2acc3221c0f0dd006cc167d1d46eaf0f66581a439da9beb4cc98aa0f1ac7e28c) + - [select_winners](https://stellar.expert/explorer/testnet/tx/ce962cea51d9ae1af7ef8e711e6ca725e026e33e2169ba72720ece0aa0f0e703) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/d865f61ecc1ef0d7e902e6c9f736a25810873aac36af7217b4b6bea94c1348de) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/697337e087807d3d1977d3cc35dcbaeaf5332fda6ddaacc0e624421ffdf04f10) + - [create_event](https://stellar.expert/explorer/testnet/tx/8a3f9f325d900eda63688cc3799f428ce6b350c9443f30cb9261d4d8abe579de) + - [accept_manager](https://stellar.expert/explorer/testnet/tx/87ced2faea51a5addf75fe33346cf42f1ad597bf4ae87db5aa5220b2e31595d3) + - [reclaim_management](https://stellar.expert/explorer/testnet/tx/59db16a6c43d1004aa6bd9ebe62c9d5e72375a738c70aa29c9aa93eb67d2bd1e) + - [select_winners](https://stellar.expert/explorer/testnet/tx/912f4c9a102b0a7a6d1422dfb394043654478e8912c9e91a0c673351bf49e133) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/bf89b4b16223d9dfe0c5de752be31630098291e6fa3fa463194b27d41c8e335b) + +## 40 recipients + +- pass: publish the grant +- pass: owner paid budget plus fee +- pass: select 40 recipients in one transaction +- pass: release milestone 0 to GCMQHP +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GCZOKQ +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GB5XFM +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GAUXJN +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GA5BQH +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GCC4AW +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GDBJKE +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GBXCQ2 +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GBDFD5 +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GBASYN +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GBBJZJ +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GC4X7Y +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GB5334 +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GDMPEB +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GAJZGD +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GCJFRI +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GASYF2 +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GBO5RV +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GAPMBQ +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GAICKT +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GDLXNY +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GANKX4 +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GBRWFB +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GCQJUK +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GCSX3H +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GCBO72 +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GBBT2W +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GC3Y4C +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GDL5WI +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GD35UM +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GAUT2V +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GARB66 +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GCDVP2 +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GCMMO3 +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GAL6XX +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GB33S4 +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GAVQFR +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GDODL3 +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GDUONY +- pass: milestone 0 paid exactly +- pass: release milestone 0 to GCFFIF +- pass: milestone 0 paid exactly +- pass: release milestone 1 to GCMQHP +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GCZOKQ +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GB5XFM +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GAUXJN +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GA5BQH +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GCC4AW +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GDBJKE +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GBXCQ2 +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GBDFD5 +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GBASYN +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GBBJZJ +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GC4X7Y +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GB5334 +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GDMPEB +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GAJZGD +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GCJFRI +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GASYF2 +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GBO5RV +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GAPMBQ +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GAICKT +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GDLXNY +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GANKX4 +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GBRWFB +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GCQJUK +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GCSX3H +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GCBO72 +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GBBT2W +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GC3Y4C +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GDL5WI +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GD35UM +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GAUT2V +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GARB66 +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GCDVP2 +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GCMMO3 +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GAL6XX +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GB33S4 +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GAVQFR +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GDODL3 +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GDUONY +- pass: milestone 1 paid exactly +- pass: release milestone 1 to GCFFIF +- pass: milestone 1 paid exactly +- pass: completed +- pass: a full page of winners reads in one call +- pass: the rest on the next page + + - [create_event](https://stellar.expert/explorer/testnet/tx/5b3621a0c46f37574e4be924fcca449a8f80eadb98fecce00d1daced47fddf68) + - [select_winners](https://stellar.expert/explorer/testnet/tx/a87168e3ad6d51a5eed768a4aa24da438e3ecedc18b886ca8fb0fdbfc3acaa36) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/23f8d6077c0354614d93873392cf9c30c870d3ebca7e15a08b6d4d5a544557bb) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/d5287744777a577c7dbf21150ece30d9a21eb49d98c897c8a28328b22cec2709) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/04b7ea265a2928c71b04337599460c79c65d05e5b52f0917dbf274cb4109a3c3) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/05a5e6a0ba310287f7c11cfd0528fc5eea356079e8b25687ae71ef7da44d91d8) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/f878750ae8426e5732811e15f2c222287ffa7c156ad4be001e36f2883d08101a) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/dbb23b6ca88ebfd9a29603b582004788d1d7ea3b2754afe49227557c28c5a12c) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/f6d52cfd80428bbd94b9998dcb376579e10d98e7ccb7aa80a017d15f6c4b4309) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/746d35a2f00d9101bc9d5b9926d20d88028d435363f0a47540d355e3efe5e8e9) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/eb92fce7d6b6d745abd04c4f29f04b6cfaea5fb45fd09ad26da56ded801eacb6) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/0ebb79d7b968e8dde8575c90599ce1c8d3433221cb63f2c375e65bd9d18a8b46) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/67a972d25a70ac897688c1f87aed5e717c645e3959132a62e4072cd5ffbde2cd) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/63ebece9126c8f049b74c9cf239d2a0f1955c59d029c4f010c400c7203c9a904) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/6ac1b605783d592109ef3dd6dd453e846953bcaedea890d3aa1409c85708ff75) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/65e8093bdd02fe513df63533adda74d66a277a9c0f707fc35d3b1b5e4916a0c3) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/1743c96061be4b6e74b307d62d18b25ffa0c03cff2b57e2ff06192894fdc7731) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/6358c78d14886b5c610f5df1fc05d2527d709dfdc20ba2700e275b47492375b8) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/28d624ec90efa19b15bc1b31304aae9cf265f0bf5b70df2e912cb9a3cb013f99) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/6c7854c001b7b71be35e59f465d44e379637c58f15223b437f0deef40de1f05c) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/c2870ad5bc9e993110b3db04d661c2a0a4f19c0d68dc1ae02701287914e055ea) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/b1bdc179b28dd40f425a303982d4e386cf0c665cb596bc77ccab99add2b56f54) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/3d83a45d747cde093c5b6af8c10a07949021ea63fdaa1ac7d4f74110f0425b74) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/ad7c147f92d25d9190188240dc3c1cbddc7e56fccc177ec7aedb6f4b25e832e1) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/6e3a6a4c9c9871b6dc0575a59b7ded1fc4d8aa94fefe45a55037665286986d68) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/17de75246c2c8e9890b1099674f3493caea9ea5f11e9387983acaea41b2ebf2f) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/d90b836ac725750e8bad15671c90f9fd8e1a2c389c4853a50f4cddfe4365078a) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/811f8d3607bc37d33d098105dbdc64f0bb53da5cb91b4f9baff7e2a05ee6071f) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/1350bdc035bb5a0bc9af4d68ebf0a561e8a1ed738fcd5624204faeb95ea7432c) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/824713f30cf0640738f7a2a02265f4a079469803d316a38b0ed9aa64cc42dbad) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/b95cd2b1a3234530539d5e690f82e9c95dfb9c47335f81fa3208d0531c74c18d) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/9310b3d386ad03004d6bcf68944ccb101d643cdb30e5069cca5b0ec38140e334) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/de59a4bec1ecf311ed1c8b06d687a9a0c945a957d78635c575f6660f453586d0) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/eb5006e77c8f810771a0a3b4ff703d69414ffb8b7b181ccdb734e873d8d06646) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/d5faf0c3fbbffc7dfbba737da93d1e08b851504f66d3ae279e5d9eb82bbc92c0) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/39ade78a649b43d6225b876fb82563c1bcc416d51b1d4b5ab75cfb721e964d85) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/dbce262fc6969bb486ea7f9f15119dcce23a1ed389f654a08eeae666eb230408) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/3aa5ef54fd80098a01309010c228f8364cd878151be755be21ff05061de6ee29) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/270d23e193bf35fb73401172e9e65c6aafb4920a41c66cb07af2568bbc33369e) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/4dfdab6b8d1872fd20d547fd75892bbef1ba875186c6f76e9ce3bea058c97193) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/22a6adcfdb4d343bb4a71e6c56e88cf2af4eea31e835525fd5b92588f31b26e7) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/0ffe6850247a8951e37c4b3e87f807a1e903c1cd9aa2cde609b1c51d69b2faa2) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/e9fec6d55482e6a89a406dbf7721d0f652344952730b7751a45326b51da87866) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/9058e452d7338004c7ff5d4df51522063cdf3043fe0427c31ba2ca346155aee0) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/a4c713986b33bc17dc575d85868a93019ec94c622382acd204e9c49d2330f53e) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/82881a31331821c8fc4ecb5d6d93756c4c16734c4522019a51390ee8cc2f42b4) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/b5463bb20ffc7f5f5f0b890b33898cd1c7bfffd4983a8b333c42d22b24824d69) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/5542deaf56b44093225375f148bac5a3a6eb3835698ec460ae9ea130e02d1a65) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/95f94c1f6a69a45988aeeecadaa757862094d90834c185071c35a729f1f151f2) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/1b014aa0fad6d6e48c9879aae9bbda30a38644df027280b4ec6e3463596370fa) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/42608bb2260b00d07792a2deafa23889bfb8e24f904fddb4830f92dc56a80b3e) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/4df0343587573126f6088340f42014cc2efdd5de03550258b8808161cdaec3e6) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/c2d7f3fc1bb55ac53d22bd212e1d7eb2067b99e5f05e91d48d9af413b7a483a1) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/af3995eeeed8113bba31779bd9d009b292d6f194e6279405707b380f12057069) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/c51e9a2bf1d79541047b2ab311f2d0e75b4aefe8d2d591eaf7b4d966be646c15) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/a477adeb467f6f99ef72f61adcfba41fcda27951b8e4f488f81b89752088bbf9) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/041c96314b7177614699bebeabb4f7aab43d8756e1b1c8a7102952681433f5b6) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/623fac10464498a668ec6f911fdfbb788bf5f96a5c2184af627f7f1c390a83e0) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/1a0cbf82c2ccebdf58eeed1f8491f7e9a507a73ca02e9407411009604c8c477d) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/81c7e0f540939e1aa757ee58d11e9afdd82c988073506a4027d562aeb90a0dc6) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/691e84aade02c4bbc042a7521e8de2871e5e8116d8cd1ba2c2cc7f495ba8f323) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/932083f17db357ef4e3be21944113e067c65a379e7c10ecb5127fcd05e5a54ab) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/291ef7e0ed995ec29c8a5829c7b2c51895aaac57ac924f3c731e8991c2eab14c) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/07d655308139dd92c6715c16e2e9e384c69d211e1b9b3feea9635b3ada69fad8) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/eb8dadc139cd424087b7945d693c14e1e37a550993d2c883a234ad1716758dba) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/01e8f88b659c150ca4db0953ac18452fde6f9331629243501a2716020aeb81e1) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/bdedc172240a74e9c22171cdca9b7c2acea5430e92361cc48e7572cc7a425ee3) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/4f56d4cf8d716bd8fe2aecd75845d79c00ada2f133e77b853d3b52b6ae9a8641) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/1ae396451987af20fa5d84572fa1367bb583c29df6c1bb53568fd55f75094121) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/02e18ff8fd754609b0beaffcac09a04f2a6947437d6f9ff3ed9ca2c56d0f60ec) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/90dd0b4f772a1c7338a2c48e6cfacd6c9e13d8242f11f2adb9f2d132e78256a3) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/ef389a41dc0fc07104b4db90be90552ad5637f35ebea0373acd573676c270e20) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/8f73ebde17b8dba39522e8418da3ff69a848706a8e8a547fe69622f3590110a0) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/31ff0e1484b51bd9f516e17af47900119f026ff6cf0eb949d99221fe43559359) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/39f2bb3ef0caa38d0055768d8f2d0887fcfb1e0c8d73ea358c3a7f3bb66aa0b3) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/2b3d2b2d5e3c5590767920e2187c8da44b2834ffd342d535267dfbd322553f53) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/1d2cb3a8c8f6a677db407fc3c0d8c3a0920e516b4ba1f250317009fb6ea2b1c3) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/7f69276a1c98e739525f41d25fb6b069059ba26d39fce6b4cfcbb17f31fbc33d) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/f423a13d264a35c1f8671c17ebdcc3ce2fc3f4998b70218140f9ed054ac8b451) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/d08345f465bca3379ecc3f425b1b234dcb134d76484ae8f4e19ca38557dcc91f) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/97e4020b7e83f209dc113031f8d80941ea24b4fc3b26cb4fe8e3cc96af067add) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/e26a0edc3fece1843ef312073e3da51d4f2bd7aeb90b702fc7c32111c06fb9e5) + +## crowdfunding release validator + +- pass: the validator is appointed on chain +- pass: publish the grant +- pass: owner paid budget plus fee +- pass: a backer pledges 60 +- pass: backers pay no fee +- pass: the creator alone cannot release (HostError: Error(Auth, InvalidAction)) +- pass: release 0 co-signed by the validator +- pass: creator paid net of fee +- pass: fee withheld at release +- pass: release 1 co-signed by the validator +- pass: creator paid net of fee +- pass: fee withheld at release +- pass: campaign completes on its last release + + - [provision 1 accounts](https://stellar.expert/explorer/testnet/tx/8a0c5f15009718f71186a8578ca7c0d46c72afe88c2801e36b39f97f8d3dd91b) + - [create_event](https://stellar.expert/explorer/testnet/tx/6bba582caaa23cd9388a94ef19bf3b526e2c5b4b938e0840c07ecaf0beb3a702) + - [add_funds](https://stellar.expert/explorer/testnet/tx/679c3042532de989fb5bf5e179b41e0da161f7a0c0ecfa8c43165e8ecebe7a09) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/4b54a1423654e438cffe02278ba8ab5055dede22d1384aa8f8851393123cf83f) + - [claim_milestone](https://stellar.expert/explorer/testnet/tx/2c0f4f33129245dee815d52fa74f92557c8e942aad5e9ee82666b57606b98f31) + +## fees + +- pass: fee account received exactly the fees charged + diff --git a/docs/contract-ops-runbook.md b/docs/contract-ops-runbook.md index 6bd52d4..254922c 100644 --- a/docs/contract-ops-runbook.md +++ b/docs/contract-ops-runbook.md @@ -1,90 +1,142 @@ -# Boundless contract operations runbook (testnet drill + multisig ops) +# Contract operations runbook -**For:** the contracts engineer and the multisig signers. -**Companion docs:** `multisig-guide.md` (plain-English signer setup), `admin-custody-policy.md` (policy), `mainnet-deploy-runbook.md` (mainnet cold deploy). -**Why this exists:** the mainnet runbook tells you *what* to run. This runbook tells you *how it actually behaves* โ€” the silent-failure modes we hit during the testnet dress rehearsal and the exact fixes. Read Section 1 before you touch any multisig op. +For the contracts engineer and the multisig signers. This is the canonical +description of how an admin transaction is built, simulated, signed and +submitted, written from the testnet dress rehearsal and the mainnet upgrades. +What to run for a deploy is in `docs/DEPLOYMENT.md`, for an upgrade in +`docs/upgrade-runbook.md`; signer setup is in `docs/multisig-guide.md` and +the policy in `docs/admin-custody-policy.md`. Read Section 1 before you touch +any multisig operation. --- -## 1. Hard-won rules (read this first) +## 1. Rules learned the hard way -These are the things that cost us hours on testnet. Every one of them fails **silently or confusingly** if you get it wrong. +Each of these fails silently or confusingly when you get it wrong. -1. **A Soroban contract call must be SIMULATED before it can be signed.** - `--build-only` produces a transaction with **no footprint and no resource fee** (`ext = 0`, fee = base only). Submitting it gives `TxMalformed`. You MUST pipe it through `stellar tx simulate` to attach the Soroban data: +1. **A Soroban contract call must be simulated before it can be signed.** + `--build-only` produces a transaction with no footprint and no resource fee + (`ext = 0`, base fee only). Submitting it gives `TxMalformed`. Pipe it + through `stellar tx simulate` to attach the Soroban data: ```bash stellar contract invoke --id --source-account --network testnet --build-only -- \ | stellar tx simulate --source-account --network testnet ``` - The output of `tx simulate` is what you sign. This applies to **every** contract call signed offline/multisig (`accept_admin`, `pause`, `set_fee_bps`, `register_supported_token`, `propose_upgrade`, โ€ฆ). - -2. **Native account operations do NOT need simulate.** Building the multisig itself (`stellar tx new set-options` to add signers / set thresholds) is classic Stellar โ€” the CLI signs and submits it directly. Only **Soroban contract invokes** need the simulate step. - -3. **Multisig signing is sequential: each signer signs the PREVIOUS signer's output.** - Signer 1 signs the prepared XDR โ†’ gets XDR-A. Signer 2 signs **XDR-A** (not the original) โ†’ gets XDR-B with both signatures. Two separate one-signature XDRs **do not combine** โ€” you'll get `tx_bad_auth` / below threshold. - -4. **Submit with the CLI, not Stellar Lab, while operating.** - `stellar tx send "" --network ` prints `SUCCESS` or the **exact** error. Lab's "Submit" can report success-looking states while the tx never lands. Use Lab only for *signing* (it talks to Freighter); submit from the CLI so failures are loud. + The output of `tx simulate` is what you sign. This applies to every + contract call signed offline or by the multisig: `accept_admin`, `pause`, + `set_fee_bps`, `register_supported_token`, `propose_release_validator`, + `propose_upgrade`, `apply_upgrade`, `migrate_events`, `migrate`, and the + rest. The `prepare-*` commands in `deploy_mainnet.sh` do this for you. + +2. **Native account operations do not need simulate.** Building the multisig + itself (`stellar tx new set-options` to add signers or set thresholds) is + classic Stellar: the CLI signs and submits it directly. Only Soroban + contract invokes need the simulate step. + +3. **Multisig signing is sequential: each signer signs the previous signer's + output.** Signer 1 signs the prepared XDR and gets XDR-A. Signer 2 signs + XDR-A, not the original, and gets XDR-B with both signatures. Two separate + one-signature XDRs do not combine; you get `tx_bad_auth` or below + threshold. + +4. **Submit with the CLI, not Stellar Lab.** + `stellar tx send "" --network ` prints `SUCCESS` or the + exact error. Lab's Submit can report a success-looking state while the + transaction never lands. Use Lab only for signing (it talks to Freighter). 5. **Never mix `--network ` with `--network-passphrase`.** - Doing both makes the CLI stop resolving the RPC URL โ†’ `error: network passphrase is used but rpc-url is missing`. Pick ONE: - - `--network testnet` (carries passphrase + RPC), **or** - - `--rpc-url https://soroban-testnet.stellar.org --network-passphrase "Test SDF Network ; September 2015"` (no `--network`). - -6. **`--source-account` accepts a public key (G-address) when `--build-only` is set.** - That's how you build a transaction sourced from the multisig (which has no secret key locally). Without `--build-only`, the CLI tries to sign with that key and fails. - -7. **Don't run `set_admin` and `accept_admin` instantly back-to-back.** - `accept_admin` simulates against the latest closed ledger. If the `set_admin` nomination isn't in a closed ledger yet, you get `Error(Contract, #6)` = `PendingAdminMismatch`. Wait a few seconds (or run them as separate steps). On mainnet this never happens โ€” the two halves are done by different people at different times. - -8. **Simulate โ†’ sign โ†’ send promptly.** The prepared XDR has time bounds. If you sit on it, `tx send` returns `txTooLate`. Just regenerate (re-run the build-only | simulate) and sign again. - -9. **The explorer defaults to mainnet.** Testnet accounts/contracts only show under the `/testnet/` path: `https://stellar.expert/explorer/testnet/account/` or `/contract/`. "Account not found" on the default explorer almost always means you're on the wrong network, not that the tx failed. - -10. **Key/contract-id drift is real.** A keystore alias (e.g. `boundless-deployer`) can resolve to a different address than you remember if the local `.stellar` config was replaced by the global config. Always `stellar keys address ` to confirm *which* key you're about to sign with, and keep deployed contract IDs written down (shell vars don't survive a new terminal). + Doing both makes the CLI stop resolving the RPC URL: + `error: network passphrase is used but rpc-url is missing`. Pick one: + - `--network testnet` (carries passphrase and RPC), or + - `--rpc-url https://soroban-testnet.stellar.org --network-passphrase "Test SDF Network ; September 2015"` with no `--network`. + + On mainnet use one named network (`docs/DEPLOYMENT.md`, 4.2); + `deploy_mainnet.sh` refuses to run while `STELLAR_RPC_URL` or + `STELLAR_NETWORK_PASSPHRASE` is set. + +6. **`--source-account` accepts a public key (G-address) with `--build-only`.** + That is how you build a transaction sourced from the multisig, which has no + secret key locally. Without `--build-only` the CLI tries to sign with that + key and fails. + +7. **Do not run `set_admin` and `accept_admin` back to back.** + `accept_admin` simulates against the latest closed ledger. If the + `set_admin` nomination is not in a closed ledger yet, simulation fails with + no pending rotation (events `#12`, profile `#6`). Wait a few seconds. On + mainnet the two halves are done by different people at different times. + +8. **Simulate, sign and send promptly.** The prepared XDR has time bounds. If + you sit on it, `tx send` returns `txTooLate`. Rebuild and sign again. + +9. **Build the next envelope only after the previous one lands.** Every + envelope uses the multisig account's current sequence number, so two + envelopes prepared together carry the same sequence and the second fails + with `tx_bad_seq`. + +10. **The explorer defaults to mainnet.** Testnet accounts and contracts only + show under `/testnet/`: `https://stellar.expert/explorer/testnet/account/` + or `/contract/`. "Account not found" usually means the wrong + network, not a failed transaction. + +11. **Know which key you are about to sign with.** CLI 28 reads identities and + networks only from its global config (`~/.config/stellar`, or + `--config-dir`); a `.stellar` directory in the repo is ignored. An alias + such as `boundless-deployer` can therefore resolve to a different key on + another machine. Run `stellar keys address ` before every signing + session, and keep contract ids in the local deployment record rather than + in shell variables. --- ## 2. Prerequisites -- `stellar` CLI โ‰ฅ 23.x (`stellar --version`). The `.stellar config migrate` / "new release" warnings are harmless noise. +- Stellar CLI 28.1.0 (`stellar --version`), the version CI and + `deploy_mainnet.sh` require. - `jq` and `curl`. -- Each signer has Freighter set up on their own machine in a dedicated browser profile, set to the right network, and has sent you their G-address (see `multisig-guide.md` Part D). +- Each signer has Freighter set up in a dedicated browser profile on their own + machine, on the right network, and has sent you their G-address + (`docs/multisig-guide.md`, Part D). --- ## 3. The two transaction shapes -| Shape | Examples | How you build + sign | +| Shape | Examples | Build and sign | |---|---|---| -| **Native account op** | `set-options` (add signer, set thresholds), payment | `stellar tx new --source-account --network ` โ€” CLI signs + submits if the source key is local. For multisig: `--build-only`, then sign in Lab, then `stellar tx send`. **No simulate.** | -| **Soroban contract call** | `accept_admin`, `pause`, `set_fee_bps`, `register_supported_token`, `propose_upgrade`, `apply_upgrade`, `migrate` | `stellar contract invoke โ€ฆ --build-only -- ` **then `| stellar tx simulate โ€ฆ`**, then sign in Lab, then `stellar tx send`. **Simulate is mandatory.** | +| Native account operation | `set-options` (add signer, set thresholds), payment | `stellar tx new --source-account --network `; the CLI signs and submits if the key is local. For the multisig: `--build-only`, sign in Lab, `stellar tx send`. No simulate. | +| Soroban contract call | `accept_admin`, `pause`, `set_fee_bps`, `register_supported_token`, `propose_upgrade`, `apply_upgrade`, `migrate_events`, `migrate` | `stellar contract invoke ... --build-only -- `, piped through `stellar tx simulate`, signed in Lab, sent with `stellar tx send`. Simulate is mandatory. | + +`accept_release_validator` is the one admin-flow call the multisig does not +sign: the proposed validator key authorizes it. Build it with +`--source-account ` and have whoever holds that key sign +it. --- -## 4. Full testnet dress rehearsal +## 4. Testnet dress rehearsal -This mirrors the mainnet sequence end to end on throwaway testnet contracts. Worked reference values from our drill are shown in `โ€นcommentsโ€บ`. +This mirrors the mainnet sequence on throwaway testnet contracts. Reference +values from our drill are in `โ€นcommentsโ€บ`. ### 4.1 Build ```bash cd boundless-contract -stellar contract build --locked -# โ†’ target/wasm32v1-none/release/boundless_{events,profile}.wasm +./scripts/build-release.sh --package boundless-events +./scripts/build-release.sh --package boundless-profile +# target/wasm32v1-none/release/boundless_{events,profile}.wasm ``` ### 4.2 Deploy the profile contract (events depends on it) ```bash -DEPLOYER=$(stellar keys address boundless-deployer) # confirm WHICH key this is +DEPLOYER=$(stellar keys address boundless-deployer) # confirm which key this is PROFILE_ID=$(stellar contract deploy \ --wasm target/wasm32v1-none/release/boundless_profile.wasm \ --source boundless-deployer --network testnet \ -- \ --admin "$DEPLOYER") -echo "PROFILE_ID=$PROFILE_ID" # WRITE THIS DOWN โ€นdrill: CA63ATN2โ€ฆโ€บ +echo "PROFILE_ID=$PROFILE_ID" # write this down โ€นdrill: CA63ATN2โ€ฆโ€บ ``` -> Since the 1.1.0 credit-removal upgrade (2026-06) the profile constructor takes only `--admin`. Contract 1.0.0 additionally required `--default_bootstrap_credits`; credits now live in an off-chain ledger in boundless-nestjs. See Section 7. ### 4.3 Deploy the events contract ```bash @@ -98,10 +150,10 @@ EVENTS_ID=$(stellar contract deploy \ --fee_account "$FEE_ACCOUNT" \ --fee_bps 250 \ --profile_contract "$PROFILE_ID") -echo "EVENTS_ID=$EVENTS_ID" # WRITE THIS DOWN โ€นdrill: CDP55GFHโ€ฆโ€บ +echo "EVENTS_ID=$EVENTS_ID" # write this down โ€นdrill: CDP55GFHโ€ฆโ€บ ``` -### 4.4 Wire profile โ†’ events (first-set-only) +### 4.4 Wire profile to events (first set only) ```bash stellar contract invoke --id "$PROFILE_ID" --source boundless-deployer --network testnet \ -- set_events_contract --new_addr "$EVENTS_ID" @@ -116,137 +168,160 @@ stellar contract invoke --id "$EVENTS_ID" --source boundless-deployer --network ### 4.6 Verify the deploy (reads, no signing) ```bash -for fn in version get_admin get_fee_bps get_fee_account get_profile_contract is_paused supported_token_count ; do +for fn in version get_admin get_fee_bps get_fee_account get_profile_contract is_paused supported_token_count get_release_validator; do echo -n "$fn: "; stellar contract invoke --id "$EVENTS_ID" --source-account "$DEPLOYER" --network testnet --send no -- $fn done stellar contract invoke --id "$EVENTS_ID" --source-account "$DEPLOYER" --network testnet --send no \ -- is_supported_token --token "$USDC" ``` -Expect `get_admin` = deployer, `is_supported_token` = `true`, `supported_token_count` = `1`, `is_paused` = `false`. +Expect `get_admin` = deployer, `is_supported_token` = `true`, +`supported_token_count` = `1`, `is_paused` = `false`, +`get_release_validator` = `null`. ### 4.7 Build the 2-of-3 multisig -(Signers are: you, your co-founder, and a **cold recovery key** held offline. Thresholds 0/2/2, master disabled.) +Signers are you, your co-founder, and a cold recovery key held offline. +Thresholds 0/2/2, master disabled. ```bash stellar keys generate boundless-multisig-bootstrap --network testnet BOOT=$(stellar keys address boundless-multisig-bootstrap) # โ€นdrill: GDLEW45Lโ€ฆโ€บ curl "https://friendbot.stellar.org/?addr=$BOOT" -# Add the 3 signers (NATIVE op, no simulate) โ€” one tx each +# Add the three signers (native op, no simulate), one transaction each for G in G_YOU... G_COFOUNDER... G_COLD... ; do stellar tx new set-options --source-account boundless-multisig-bootstrap \ --signer "$G" --signer-weight 1 --network testnet done -# Lock it: 2-of-3 + disable the bootstrap master key (the critical flag) +# Lock it: 2-of-3 and disable the bootstrap master key (the critical flag) stellar tx new set-options --source-account boundless-multisig-bootstrap \ --low-threshold 0 --med-threshold 2 --high-threshold 2 --master-weight 0 \ --network testnet -./scripts/admin/verify-multisig.sh "$BOOT" testnet # must print: PASS: all 6 checks passed +./scripts/admin/verify-multisig.sh "$BOOT" testnet # must print: PASS: all 8 checks passed ``` -Read the 3 signer addresses the script prints and confirm them by eye. +Read the three signer addresses the script prints and confirm them by eye. +With `EXPECTED_SIGNERS=,,` set, the script also pins the roster +and runs a ninth check. -### 4.8 Rotate admin: deployer โ†’ multisig (the heart of it) -Do this for **both** `$EVENTS_ID` and `$PROFILE_ID`. +### 4.8 Rotate admin: deployer to multisig +Do this for both `$EVENTS_ID` and `$PROFILE_ID`. ```bash -# Step A โ€” current admin (deployer) nominates the multisig. CLI signs + submits. +# Step A: the current admin (deployer) nominates the multisig. CLI signs and submits. stellar contract invoke --id "$EVENTS_ID" --source boundless-deployer --network testnet \ -- set_admin --new_admin "$BOOT" ``` -**Wait ~10 seconds** (Rule 7), then: +Wait about ten seconds (Rule 7), then: ```bash -# Step B โ€” build + SIMULATE the accept_admin (multisig as source) +# Step B: build and simulate accept_admin with the multisig as source stellar contract invoke --id "$EVENTS_ID" --source-account "$BOOT" --network testnet --build-only -- accept_admin \ | stellar tx simulate --source-account "$BOOT" --network testnet ``` -Take that prepared XDR โ†’ **Lab sign (you โ†’ co-founder)** โ†’ submit: +Sign the prepared XDR in Lab (you, then co-founder) and submit: ```bash stellar tx send "" --network testnet ``` Verify: ```bash stellar contract invoke --id "$EVENTS_ID" --source-account "$BOOT" --network testnet --send no -- get_admin -# โ†’ $BOOT +# $BOOT ``` -Repeat Aโ†’B for `$PROFILE_ID`. +Repeat A and B for `$PROFILE_ID`. -### 4.9 Operate as the multisig (and see the failure mode) -The deployer now has zero admin power. Prove the multisig can run ops: +### 4.9 Operate as the multisig, and see the failure mode +The deployer now has no admin power. Prove the multisig can run operations: ```bash -# pause (simulate is mandatory) stellar contract invoke --id "$EVENTS_ID" --source-account "$BOOT" --network testnet --build-only -- pause \ | stellar tx simulate --source-account "$BOOT" --network testnet ``` -โ†’ Lab 2-of-3 โ†’ `stellar tx send` โ†’ `is_paused` should be `true`. Then `unpause` the same way. +Sign 2-of-3 in Lab, `stellar tx send`, and `is_paused` reads `true`. Then +`unpause` the same way. -**The "1-of-3 must fail" drill:** build a `pause`, submit with **only one** signature โ†’ `tx send` rejects it (`tx_bad_auth`). Seeing this on purpose is the point. +The 1-of-3 drill: build a `pause`, submit it with one signature, and +`tx send` rejects it (`tx_bad_auth`). Seeing this on purpose is the point. --- -## 5. Day-to-day multisig operation (the canonical flow) +## 5. Day-to-day multisig operation -Any time the multisig needs to do a contract op (`set_fee_bps`, `pause`, `register_supported_token`, an upgrade step, โ€ฆ): +Any time the multisig makes a contract call (`set_fee_bps`, `pause`, +`register_supported_token`, a release-validator change, an upgrade step): ```bash -# 1. BUILD + SIMULATE โ†’ prepared, unsigned XDR +# 0. Confirm the admin account is still the multisig on file +EXPECTED_SIGNERS=,, ./scripts/admin/verify-multisig.sh "$BOOT" + +# 1. Build and simulate: a prepared, unsigned XDR stellar contract invoke --id --source-account "$BOOT" --network --build-only -- [--arg val ...] \ - | stellar tx simulate --source-account "$BOOT" --network + | stellar tx simulate --source-account "$BOOT" --network > op.xdr + +# 2. Every signer decodes it and checks source, contract, function and arguments +stellar tx decode --output json-formatted < op.xdr -# 2. SIGN (Lab, in order) -# signer 1 signs the prepared XDR โ†’ XDR-A -# signer 2 signs XDR-A โ†’ XDR-B (2 of 3 โ€” pull the cold key only for set_fee_account) +# 3. Sign in Lab, in order +# signer 1 signs the prepared XDR -> XDR-A +# signer 2 signs XDR-A -> XDR-B -# 3. SUBMIT (CLI, so errors are visible) +# 4. Submit from the CLI, so errors are visible stellar tx send "" --network -# 4. VERIFY with a read +# 5. Verify with a read stellar contract invoke --id --source-account "$BOOT" --network --send no -- ``` -`set_fee_account` is the only op the policy keeps at **3-of-3** โ€” and that's a *process* rule (collect all three signatures, including the cold key), not enforced on-chain. See `admin-custody-policy.md` ยง4. +For upgrades, pause and unpause on mainnet, `deploy_mainnet.sh prepare-*` +replaces step 1 and adds the state checks in `docs/upgrade-runbook.md`. + +An emergency `pause` is the one operation that may go ahead before the paper +trail. Pause first, then write the incident record in `#ops-admin-requests`: +what was seen, who signed, the transaction hash, and what has to be true +before anyone prepares the `unpause`. + +The policy keeps `set_fee_account`, `set_admin` and +`propose_release_validator` at 3-of-3 (`docs/admin-custody-policy.md`, +Section 4). That is a process rule: collect all three signatures, including +the cold key. The chain only enforces 2-of-3. --- -## 6. Troubleshooting (error โ†’ cause โ†’ fix) +## 6. Troubleshooting | Symptom | Cause | Fix | |---|---|---| -| `network passphrase is used but rpc-url is missing` | Mixed `--network ` with `--network-passphrase` | Use `--network testnet` alone, or go fully explicit with `--rpc-url โ€ฆ --network-passphrase โ€ฆ` (Rule 5) | -| `TxMalformed` on submit of a contract call | The XDR was `--build-only` and never simulated (no footprint/resource fee) | Pipe through `stellar tx simulate` and sign that output (Rule 1) | -| `tx_bad_auth` / `op_low_threshold` | Not enough signatures combined โ€” usually the 2nd signer signed the original, not the 1st signer's output | Re-sign in order: each signer signs the previous XDR (Rule 3) | -| `Error(Contract, #6)` (`PendingAdminMismatch`) on `accept_admin` | `set_admin` not yet in a closed ledger | Wait a few seconds and re-run the simulate (Rule 7). If still failing, re-run `set_admin` | -| `Error(Contract, #5)` (`NotAdmin`) | The source isn't the current admin (e.g. already rotated to the multisig) | Check `get_admin`; act as the real admin | -| `Error(Contract, #7)` (`PendingAdminExpired`) | The nomination window lapsed | Re-run `set_admin`, then accept promptly | -| `txTooLate` | Time bound elapsed between simulate and submit | Regenerate the prepared XDR and sign quickly (Rule 8) | -| "Account/contract not found" in explorer | Looking at mainnet | Use the `/testnet/` URL (Rule 9) | -| Lab says submitted but admin unchanged / no tx on the account | Submit silently failed in Lab | Submit from the CLI with `stellar tx send` to see the real error (Rule 4) | - -**Diagnosis tools (read-only):** +| `network passphrase is used but rpc-url is missing` | Mixed `--network ` with `--network-passphrase` | Use the named network alone, or go fully explicit with `--rpc-url ... --network-passphrase ...` (Rule 5) | +| `TxMalformed` when submitting a contract call | The XDR was `--build-only` and never simulated | Pipe through `stellar tx simulate` and sign that output (Rule 1) | +| `tx_bad_auth` / `op_low_threshold` | Not enough signatures combined, usually because the second signer signed the original instead of the first signer's output | Re-sign in order (Rule 3) | +| `tx_bad_seq` | Two envelopes were prepared against the same sequence | Rebuild the second after the first lands (Rule 9) | +| `Error(Contract, #12)` on events or `#6` on profile from `accept_admin` | No pending rotation yet: `set_admin` is not in a closed ledger | Wait a few seconds and simulate again (Rule 7); if it persists, re-run `set_admin` | +| `Error(Contract, #13)` on events or `#7` on profile | The nomination expired (120,960 ledgers) | Re-run `set_admin`, then accept promptly | +| Submit fails with an auth error although simulation passed | The source is not the current admin, so the recorded authorization belongs to an address nobody signed for | Check `get_admin` and build as the real admin | +| `txTooLate` | Time bounds passed between simulate and submit | Rebuild and sign quickly (Rule 8) | +| "Account/contract not found" in the explorer | Looking at mainnet | Use the `/testnet/` URL (Rule 10) | +| Lab says submitted but nothing changed | Lab's submit failed silently | Submit with `stellar tx send` to see the real error (Rule 4) | + +Upgrade-specific errors are listed in `docs/upgrade-runbook.md`, Section 6. + +Read-only diagnosis: ```bash -# Did a tx actually land on an account? +# Did a transaction land on an account? curl -s "https://horizon-testnet.stellar.org/accounts//transactions?order=desc&limit=5" \ | jq -r '._embedded.records[] | "\(.created_at) successful=\(.successful) \(.hash)"' -# Multisig config sanity +# Multisig configuration curl -s "https://horizon-testnet.stellar.org/accounts/" | jq '{signers,thresholds}' ``` --- -## 7. Pre-mainnet code fixes (found during the drill) - -1. ~~**`deploy_mainnet.sh` deploy-profile uses `--bootstrap_credits`**, but the profile constructor arg is **`--default_bootstrap_credits`**.~~ Overtaken by the 1.1.0 credit-removal upgrade (2026-06): the profile constructor no longer takes any credits argument (credits are an off-chain ledger in boundless-nestjs). Deploy scripts must pass only `--admin` when deploying profile from current source. -2. **`INITIAL_VERSION` is still `0.2.0`** while the code now includes the supported-token enumeration. A fresh mainnet deploy would stamp `0.2.0` for a contract that differs from the audited `0.2.0` surface. Bump it (e.g. `1.0.0`) and update the upgrade-test fixtures + the runbook's expected-version checks. -3. **Re-audit the supported-token enumeration** โ€” it's new contract code added after the last audit; the mainnet pre-flight gate ("all critical/high resolved") must cover it. - ---- - -## 8. Mainnet deltas - -Everything in Section 4โ€“5 is identical on mainnet except: -- Build **without** `--features testnet` (full upgrade timelock). `deploy_mainnet.sh` already does this. -- `--network mainnet` (or explicit `--rpc-url --network-passphrase "Public Global Stellar Network ; September 2015"`). -- The bootstrap is funded with **real XLM** (โ‰ฅ5), not friendbot. -- The cold recovery key actually lives in a safe; the daily signers are you + co-founder. -- After rotation, **destroy the initial deploy key** (`shred -u`); it has no power post-rotation but leave nothing lying around. -- The enumerable token index is complete **from genesis** โ€” register USDC at deploy time and state enumeration is authoritative forever (no import-by-address needed, unlike the in-place-upgraded testnet contract). +## 7. Mainnet differences + +Sections 4 and 5 hold on mainnet except: +- Build without `--features testnet`, so the 17,280-ledger upgrade timelock is + compiled in. `deploy_mainnet.sh` does this. +- Use the named mainnet network from `docs/DEPLOYMENT.md` 4.2. +- Fund the bootstrap with real XLM (at least 5), not friendbot. +- The cold recovery key lives in a safe; the daily signers are you and your + co-founder. +- After the rotation, destroy the deployer key (`stellar keys rm`); it has no + power left, but leave nothing lying around. +- Register USDC at deploy time. The token index is then complete from genesis, + so `supported_token_count` and `supported_token_at` are authoritative. diff --git a/docs/dune-analytics.md b/docs/dune-analytics.md index 1ceff3d..5e709d6 100644 --- a/docs/dune-analytics.md +++ b/docs/dune-analytics.md @@ -1,4 +1,4 @@ -# Boundless On-chain Analytics โ€” Dune Integration Guide +# Boundless on-chain analytics: Dune integration guide This document covers everything needed to build and maintain the Boundless Dune dashboard: the complete emitted-event schema (topic names, ScVal layout, field @@ -44,17 +44,17 @@ Each row in `history_contract_events` has: | `contract_id` | `VARCHAR` | Contract address (StrKey) | | `topics_decoded` | `VARCHAR` | JSON **array of ScVal objects**. The event name is at `$[0].symbol`, e.g. `[{"symbol":"EventCreated"}]` | | `data_decoded` | `VARCHAR` | JSON **ScVal map**: `{"map":[{"key":{"symbol":"id"},"val":{"u64":"7"}}, ...]}`. Each value is wrapped by its ScVal type | -| `closed_at_date` | `DATE` | **Partition column** โ€” always filter it to avoid full-table scans | +| `closed_at_date` | `DATE` | **Partition column**; always filter it to avoid full-table scans | | `topics` / `data` | `VARCHAR` | Raw XDR (use the `*_decoded` columns instead) | | `type_string` | `VARCHAR` | Event type string (`"contract"` for Soroban events) | -| `transaction_hash` | `VARBINARY` | Transaction hash โ€” wrap with `to_hex()` for a readable string | +| `transaction_hash` | `VARBINARY` | Transaction hash; wrap with `to_hex()` for a readable string | | `successful` | `BOOLEAN` | Whether the transaction succeeded | **Decoding, correctly (verified against live `stellar.history_contract_events`):** -1. **Event name** is *not* `$[0]` โ€” that element is an object. Use: +1. **Event name** is *not* `$[0]`; that element is an object. Use: `JSON_EXTRACT_SCALAR(topics_decoded, '$[0].symbol')`. -2. **Fields** are *not* flat `$.field` โ€” they live inside a positional `map`, +2. **Fields** are *not* flat `$.field`; they live inside a positional `map`, each value wrapped by its ScVal type. Rebuild the map into `MAP(field_name โ†’ ScVal JSON)`, then read each field by type: @@ -75,7 +75,7 @@ map_from_entries( The canonical, Dune-tested queries live in [`docs/dune-queries/`](./dune-queries); start with `10_event_created_decode_test.sql`. The snippets in ยง4 below illustrate -intent โ€” treat the `.sql` files as the source of truth. +intent; treat the `.sql` files as the source of truth. --- @@ -100,7 +100,7 @@ Emitted by `create_event` for every pillar. | `title` | `String` | Human label; omit from aggregates | **TVL note.** For all pillars except Crowdfunding, the **full** `total_budget` -is escrowed at create time โ€” the protocol fee is charged *on top* (the owner +is escrowed at create time. The protocol fee is charged *on top* (the owner pays `budget + fee`; the fee is forwarded to the fee account, and escrow is credited the full `total_budget`). So `total_budget` is exactly the escrow inflow; use it directly. For Crowdfunding, escrow starts at 0 and grows via @@ -108,10 +108,12 @@ inflow; use it directly. For Crowdfunding, escrow starts at 0 and grows via (non-Crowdfunding) + `FundsAdded.amount`, debiting `WinnerPaid` + `MilestoneClaimed` + `ContributorRefunded` + `OwnerResidualRefunded`. -> **Fee revenue is not derivable from these events.** The fee is transferred to -> the fee account with no dedicated event and is not embedded in any event -> `amount`. For protocol-fee analytics, read `stellar.history_transactions` / -> effects for transfers to the fee account, not `history_contract_events`. +> **Deposit fees are not derivable from these events.** The fee charged on top +> of a deposit is transferred to the fee account with no dedicated event and is +> not embedded in any event `amount`. For protocol-fee analytics, read +> `stellar.history_transactions` / effects for transfers to the fee account, +> not `history_contract_events`. The one exception is the fee withheld from a +> crowdfunding release, which `MilestoneFeeCharged` reports from 2.0.0. #### `EventCancelled` Emitted at the end of the cancel flow (`start_cancel` fast-path or @@ -134,14 +136,39 @@ fee-free, with the fee taken later at `claim_milestone`). | `amount` | `I128` | Amount credited to escrow | | `new_remaining` | `I128` | `remaining_escrow` after this deposit | +#### `CancellationStarted` +From 2.0.0. Emitted by `start_cancel`, before any refund moves, with the +arithmetic the refunds will follow. + +| Field | ScVal type | Notes | +|-------|-----------|-------| +| `event_id` | `U64` | | +| `branch` | enum string (`"OwnerOnly"`, `"FullPartnerThenResidual"`, `"ProRataPartners"`) | How the pool is split | +| `remaining` | `I128` | `remaining_escrow` when cancellation began | +| `non_owner_total` | `I128` | Sum of partner contributions still refundable | + #### `ContributorRefunded` -Emitted once per contributor per batch during paged cancel. +Emitted once per contributor per batch during paged cancel, and again when a +held refund is collected with `claim_refund`. From 2.0.0 a contributor whose +pro-rata share rounds down to nothing gets one with `amount = 0`. | Field | ScVal type | Notes | |-------|-----------|-------| | `event_id` | `U64` | | | `contributor` | `Address` | | -| `amount` | `I128` | Refunded amount | +| `amount` | `I128` | Refunded amount; may be 0 | + +#### `RefundDeferred` +From 2.0.0. The contributor's account could not take its refund (frozen, or no +trustline), so the amount stays in the contract for them to collect later with +`claim_refund`, which emits `ContributorRefunded`. No tokens move with this +event: count the outflow at the later `ContributorRefunded`, not here. + +| Field | ScVal type | Notes | +|-------|-----------|-------| +| `event_id` | `U64` | | +| `contributor` | `Address` | | +| `amount` | `I128` | Held for the contributor | #### `OwnerResidualRefunded` Emitted when the event owner receives their escrow residual at cancel time. @@ -156,6 +183,9 @@ Emitted when the event owner receives their escrow residual at cancel time. ### 2.2 Participation events +**Removed in 2.0.0.** Applying and submitting moved off chain, so these events +stop at the 2.0.0 upgrade and appear only in history from earlier versions. + #### `Applied` Emitted when a builder applies to a Bounty or Grant. @@ -174,7 +204,7 @@ Emitted when a builder withdraws their application before submitting. #### `Submitted` Emitted on every `submit` call (first submit and re-submits). Hackathon, Bounty, -Grant only โ€” Crowdfunding has no submission step. +Grant only; Crowdfunding has no submission step. | Field | ScVal type | Notes | |-------|-----------|-------| @@ -202,17 +232,32 @@ Emitted once at the end of `select_winners`, regardless of pillar. | `event_id` | `U64` | | | `count` | `U32` | Number of winners chosen | +#### `WinnerAwarded` +From 2.0.0. One per award in a `select_winners` call, emitted just before +`WinnersSelected`. Nothing is paid yet: prizes are paid at `WinnerPaid`, grant +awards milestone by milestone at `MilestoneClaimed`. + +| Field | ScVal type | Notes | +|-------|-----------|-------| +| `event_id` | `U64` | | +| `recipient` | `Address` | | +| `position` | `U32` | | +| `amount` | `I128` | The whole award | + #### `WinnerPaid` -**Single-release pillars only** (Hackathon, Bounty). One event per winner. -Grant and Crowdfunding winners receive funds via `MilestoneClaimed`. +Emitted by `claim_prize` when a winner collects a prize, so **single-release +pillars only** (Hackathon, Bounty), one event per award. It is not emitted by +`select_winners`, which only records awards (`WinnerAwarded`); contracts before +1.3.0 paid at selection and emitted it from there, so older history mixes both. +Grant and Crowdfunding recipients are paid through `MilestoneClaimed`. | Field | ScVal type | Notes | |-------|-----------|-------| | `event_id` | `U64` | | | `recipient` | `Address` | Winner wallet | -| `position` | `U32` | 1st, 2nd, โ€ฆ | +| `position` | `U32` | 1st, 2nd, and so on | | `amount` | `I128` | Amount transferred (stroops) | -| `milestone` | `U32` or `NULL` | Always `NULL` when emitted by `select_winners` | +| `milestone` | `U32` or `NULL` | Always `NULL` from `claim_prize` | #### `MilestoneClaimed` Grant and Crowdfunding payouts. One event per (recipient, milestone). @@ -222,7 +267,31 @@ Grant and Crowdfunding payouts. One event per (recipient, milestone). | `event_id` | `U64` | | | `recipient` | `Address` | | | `milestone` | `U32` | 0-based milestone index | -| `amount` | `I128` | Payout amount | +| `amount` | `I128` | Gross amount that left escrow. For Crowdfunding the creator received `amount - fee`; see `MilestoneFeeCharged` | + +#### `MilestoneFeeCharged` +From 2.0.0. Crowdfunding only, emitted right after `MilestoneClaimed` when the +release withheld a fee. + +| Field | ScVal type | Notes | +|-------|-----------|-------| +| `event_id` | `U64` | | +| `recipient` | `Address` | | +| `milestone` | `U32` | | +| `fee` | `I128` | Sent to the fee account | + +#### `MilestoneForfeited` +From 2.0.0. Grants only. The owner closed a milestone without paying it. No +tokens move: the share stays in escrow, no longer owed to anyone, and leaves +with the rest of the pool at cancellation (`OwnerResidualRefunded` / +`ContributorRefunded`). + +| Field | ScVal type | Notes | +|-------|-----------|-------| +| `event_id` | `U64` | | +| `recipient` | `Address` | | +| `milestone` | `U32` | | +| `amount` | `I128` | The share released from the award | --- @@ -241,7 +310,11 @@ These are useful for governance dashboards but not for TVL/payout metrics. | `TokenDeregistered` | `token: Address` | Token removed from whitelist | | `ManagerProposed` | `event_id: U64`, `target: Address`, `expires_at_ledger: U32` | Two-step manager delegation proposed for an event | | `ManagerChanged` | `event_id: U64`, `new_manager: Address` | Manager delegation accepted (authority transferred) | -| `PendingManagerCancelled` | `event_id: U64` | Pending manager proposal vetoed | +| `PendingManagerCancelled` | `event_id: U64` | Pending manager proposal withdrawn, or replaced by a new one (from 2.0.0) | +| `ManagementReclaimed` | `event_id: U64`, `owner: Address` | From 2.0.0. The owner took management back before the first award | +| `ReleaseValidatorProposed` | `target: Address`, `expires_at_ledger: U32` | From 2.0.0. A crowdfunding release co-signer proposed; inactive until it accepts | +| `ValidatorProposalCancelled` | _(no fields)_ | From 2.0.0. A pending co-signer proposal withdrawn, replaced or cleared | +| `ReleaseValidatorUpdated` | `validator: Address` or `NULL` | From 2.0.0. Co-signer accepted, or cleared (back to the admin) | | `Paused` | _(no fields)_ | Contract paused | | `Unpaused` | _(no fields)_ | Contract unpaused | @@ -251,7 +324,7 @@ These are useful for governance dashboards but not for TVL/payout metrics. | Event name | Key fields | Notes | |-----------|-----------|-------| -| `PendingUpgradeProposed` | `wasm_hash, new_version, available_at_ledger, expires_at_ledger` | Upgrade queued (timelocked ~1 day) | +| `PendingUpgradeProposed` | `wasm_hash, new_version, available_at_ledger, expires_at_ledger` | Upgrade queued; it can apply from `available_at_ledger` | | `PendingUpgradeCancelled` | `cancelled_at_ledger: U32` | Upgrade cancelled before apply | | `UpgradeApplied` | `wasm_hash, new_version: String` | Preferred event; new wasm is live | | `Upgraded` | `new_wasm_hash` | Legacy alias for `UpgradeApplied`; indexers should prefer `UpgradeApplied` | @@ -264,18 +337,18 @@ These are useful for governance dashboards but not for TVL/payout metrics. TVL (Total Value Locked) = escrow currently held by the contract. **Inflows (+)** -- `EventCreated.total_budget` โ€” for Hackathon, Bounty, Grant (Crowdfunding starts at 0) -- `FundsAdded.amount` โ€” every partner / community top-up +- `EventCreated.total_budget`: for Hackathon, Bounty, Grant (Crowdfunding starts at 0) +- `FundsAdded.amount`: every partner / community top-up **Outflows (โˆ’)** -- `WinnerPaid.amount` โ€” immediate payout at `select_winners` (Single pillars) -- `MilestoneClaimed.amount` โ€” milestone payout (Grant + Crowdfunding) -- `ContributorRefunded.amount` โ€” partner refund during cancel -- `OwnerResidualRefunded.amount` โ€” owner residual refund during cancel +- `WinnerPaid.amount`: a prize collected with `claim_prize` (Single pillars) +- `MilestoneClaimed.amount`: milestone payout (Grant + Crowdfunding) +- `ContributorRefunded.amount`: partner refund during cancel, or a held refund collected with `claim_refund` +- `OwnerResidualRefunded.amount`: owner residual refund during cancel **Protocol fee** is charged on top of the deposited amount (the payer sends `amount + fee`; the fee is forwarded to the fee account). Every event `amount` -therefore equals exactly what escrow was credited or released โ€” use them +therefore equals exactly what escrow was credited or released; use them directly, no fee adjustment in SQL. The fee itself is *not* in any event; see the fee-revenue note in ยง2.1. @@ -302,7 +375,7 @@ Amounts are in stroops (7 decimal places); divide by `1e7` for human units. > Canonical, Dune-tested query: [`docs/dune-queries/04_total_payouts.sql`](./dune-queries/04_total_payouts.sql) -### 4.5 Unique participants (applicants + recipients) +### 4.5 Unique participants (recipients, plus applicants before 2.0.0) > Canonical, Dune-tested query: [`docs/dune-queries/05_unique_participants.sql`](./dune-queries/05_unique_participants.sql) @@ -335,17 +408,17 @@ dashboard: | Row | Panel | Query | |-----|-------|-------| -| 1 | **TVL (current)** โ€” single number | ยง4.1 | -| 1 | **Total paid out** โ€” single number | ยง4.4 (sum only) | -| 1 | **Events created** โ€” single number | ยง4.3 (count only) | -| 1 | **Unique builders** โ€” single number | ยง4.5 | -| 2 | **TVL over time** โ€” area chart | ยง4.2 | -| 2 | **Monthly payouts** โ€” bar chart | ยง4.4 | -| 3 | **Events by pillar** โ€” donut chart | ยง4.3 (count, no time) | -| 3 | **Funded vs completed vs cancelled** โ€” bar | ยง4.7 | -| 4 | **Average budget & time-to-payout** โ€” table | ยง4.8 | -| 4 | **Payout volume by token** โ€” table | ยง4.9 | -| 5 | **Crowdfunding daily contributions** โ€” line chart | ยง4.10 | +| 1 | **TVL (current)**, single number | ยง4.1 | +| 1 | **Total paid out**, single number | ยง4.4 (sum only) | +| 1 | **Events created**, single number | ยง4.3 (count only) | +| 1 | **Unique builders**, single number | ยง4.5 | +| 2 | **TVL over time**, area chart | ยง4.2 | +| 2 | **Monthly payouts**, bar chart | ยง4.4 | +| 3 | **Events by pillar**, donut chart | ยง4.3 (count, no time) | +| 3 | **Funded vs completed vs cancelled**, bar | ยง4.7 | +| 4 | **Average budget & time-to-payout**, table | ยง4.8 | +| 4 | **Payout volume by token**, table | ยง4.9 | +| 5 | **Crowdfunding daily contributions**, line chart | ยง4.10 | --- @@ -364,7 +437,7 @@ dashboard: ## 7. Maintenance notes -- **Contract upgrades.** After `apply_upgrade` + `migrate`, verify the new +- **Contract upgrades.** After `apply_upgrade`, `migrate_events` and `migrate`, verify the new version's events still decode correctly. The `Migrated` event in Dune confirms the on-chain migration ran; cross-check with `UpgradeApplied`. - **New tokens.** When `TokenRegistered` appears for a new address, add it @@ -372,7 +445,7 @@ dashboard: - **Fee changes.** The protocol fee is charged on top of the deposited amount, so event `amount` fields already equal the escrow credit/release. No SQL adjustment is needed if the fee rate changes. (Fee revenue itself is not in - these events โ€” see ยง2.1.) + these events; see ยง2.1.) - **Crowdfunding vs other pillars.** `EventCreated.total_budget` is a *funding goal* for Crowdfunding, not an escrow deposit. Exclude `pillar = 'Crowdfunding'` from inflow sums based on `EventCreated` and diff --git a/docs/dune-queries/01_tvl_current.sql b/docs/dune-queries/01_tvl_current.sql index 423918d..f1e5f97 100644 --- a/docs/dune-queries/01_tvl_current.sql +++ b/docs/dune-queries/01_tvl_current.sql @@ -7,7 +7,7 @@ -- fields -> rebuild data_decoded '$.map' into MAP(name -> ScVal JSON), -- then read each field by its ScVal type ($.i128, $.u64, ...). -- --- Inflows: EventCreated.total_budget (non-Crowdfunding โ€” escrowed at creation) +-- Inflows: EventCreated.total_budget (non-Crowdfunding, escrowed at creation) -- FundsAdded.amount (partner top-ups + crowdfunding contributions) -- Outflows: WinnerPaid.amount, MilestoneClaimed.amount, -- ContributorRefunded.amount, OwnerResidualRefunded.amount diff --git a/docs/dune-queries/03_bounties_funded.sql b/docs/dune-queries/03_bounties_funded.sql index 09b064a..f6c82b9 100644 --- a/docs/dune-queries/03_bounties_funded.sql +++ b/docs/dune-queries/03_bounties_funded.sql @@ -1,4 +1,4 @@ --- Boundless On-chain: Events created โ€” count and budget by pillar and month +-- Boundless On-chain: Events created: count and budget by pillar and month -- Panel type: grouped bar chart x=month y=events_created color=pillar -- -- Decoding: see 10_event_created_decode_test.sql. diff --git a/docs/dune-queries/05_unique_participants.sql b/docs/dune-queries/05_unique_participants.sql index ae6027b..75d66b9 100644 --- a/docs/dune-queries/05_unique_participants.sql +++ b/docs/dune-queries/05_unique_participants.sql @@ -19,7 +19,9 @@ WITH ev AS ( AND JSON_EXTRACT_SCALAR(topics_decoded, '$[0].symbol') IN ('Applied', 'WinnerPaid', 'MilestoneClaimed', 'EventCreated') ) --- Builders: applied to or received a payout from any event +-- Builders: applied to or received a payout from any event. `Applied` covers +-- only history from before 2.0.0, when applying moved off chain; from 2.0.0 a +-- builder is counted here once paid. SELECT 'builders' AS role, COUNT(DISTINCT addr) AS unique_wallets diff --git a/docs/dune-queries/09_crowdfunding_contributions.sql b/docs/dune-queries/09_crowdfunding_contributions.sql index d4559b2..0ae3466 100644 --- a/docs/dune-queries/09_crowdfunding_contributions.sql +++ b/docs/dune-queries/09_crowdfunding_contributions.sql @@ -1,4 +1,4 @@ --- Boundless On-chain: Contribution inflows โ€” daily volume +-- Boundless On-chain: Contribution inflows, daily volume -- Panel type: line chart x=day y=total_contributed_display -- -- FundsAdded fires for every add_funds call (crowdfunding contributions AND diff --git a/docs/dune-queries/10_event_created_decode_test.sql b/docs/dune-queries/10_event_created_decode_test.sql index 921e817..f85dc58 100644 --- a/docs/dune-queries/10_event_created_decode_test.sql +++ b/docs/dune-queries/10_event_created_decode_test.sql @@ -4,12 +4,12 @@ -- Real stellar.history_contract_events shapes (verified against live data): -- topics_decoded : JSON array of ScVal objects. Event name is at $[0].symbol -- (e.g. [{"symbol":"EventCreated"}]), NOT $[0]. --- data_decoded : ScVal map โ€” {"map":[{"key":{"symbol":"id"},"val":{"u64":"7"}}, ...]}. +-- data_decoded : ScVal map: {"map":[{"key":{"symbol":"id"},"val":{"u64":"7"}}, ...]}. -- Each field's value is wrapped by its ScVal type; there is no -- flat $.id. We rebuild it into a MAP(field_name -> ScVal JSON) -- with map_from_entries(), then read each field by its type. --- closed_at_date : PARTITION column โ€” always filter it (avoids full scans). --- transaction_hash : varbinary โ€” to_hex() for a readable hash. +-- closed_at_date : PARTITION column; always filter it (avoids full scans). +-- transaction_hash : varbinary; to_hex() for a readable hash. WITH ev AS ( SELECT diff --git a/docs/figures/threat-model-figure-1-system-dfd.svg b/docs/figures/threat-model-figure-1-system-dfd.svg new file mode 100644 index 0000000..5ccc758 --- /dev/null +++ b/docs/figures/threat-model-figure-1-system-dfd.svg @@ -0,0 +1,157 @@ + +Figure 1. Boundless system data-flow diagram with trust boundaries + + + + +TB1 ยท Internet / Backend + + +TB3 ยท External service + + +TB5 ยท Off-chain / On-chain + + +TB6 ยท events โ†” profile + +User wallets ยท managed (custodial) or external + + +Builder wallet + + +Organizer wallet + + +Manager wallet + + + + + + +Didit KYC +docs stay at Didit + + +Platform admin +2-of-3 multi-sig + +Web app (browser) +Next.js ยท holds no keys + + +PostgreSQL +no PII ยท encrypted keys + +Backend API & orchestrator +auth ยท KYC guard ยท tx builder +indexer ยท custodial wallet signer + +Admin portal +staff only ยท step-up TOTP + +Stellar RPC +managed endpoint + + +Events storage +instance ยท persistent ยท temporary + +boundless-events +escrow ยท lifecycle +awards ยท cancellation + +boundless-profile +reputation ยท earnings + +Token contract +USDC SAC + + +Profile storage +profiles ยท earnings ยท binding + + +Ledger balances +escrow ยท fee account ยท wallets + +critical custody +all escrow sits in one contract balance ยท per-event accounting: remaining_escrow, EventOwedTotal + + + + + +HTTPS + +external wallets sign locally + + +REST / JWT + signed XDR + + +documents (direct) + + +HMAC-signed webhook + + +OIDC + TOTP + + +admin API + + +read/write + + +signed XDR + + +getEvents + + +admin ops via RPC ยท 2-of-3 signature +events & profile ยท pause ยท fees ยท upgrade + + +invoke + + +read/write + + +bootstrap +bump_reputation +register_earnings + + +read/write + + +transfer +deposit ยท release ยท refund + + +debit / credit + + +External entity + +Boundless process + +On-chain contract + +Third-party process + + +Data store + +Data flow + +Dashed: local signature / admin ops + +Trust boundary + diff --git a/docs/figures/threat-model-figure-2-escrow-lifecycle.svg b/docs/figures/threat-model-figure-2-escrow-lifecycle.svg new file mode 100644 index 0000000..ad4078b --- /dev/null +++ b/docs/figures/threat-model-figure-2-escrow-lifecycle.svg @@ -0,0 +1,347 @@ + +Figure 2. Escrow lifecycle and authorization: who signs each boundless-events transition, how the escrow pool moves, and which ledger accounts are credited + + + + + + +Signers ยท off-chain wallets (external entities) + + +Owner +organizer wallet; +funds the event + + + +Manager +delegate; the owner +until one accepts + + + +Contributor +partner or +community wallet + + + +Builder +participant wallet; +never holds escrow + + + +Winner +stored award +recipient + + +Anyone +permissionless crank; +no signature + + + +Admin +2-of-3 multi-sig; +critical custody + + + +TB7 ยท Owner โ†” Manager + + + +Backend relay ยท tx builder ยท indexer +signs for managed wallets ยท bypassable (TB2) + + +signed XDR via RPC ยท require_auth() verifies the chip signer + + +direct to RPC ยท relay optional + + +TB5 ยท Off-chain / On-chain + +boundless-events 2.0.0 +Managed wallets are backend-signed under envelope encryption; the admin quorum is never server-held. Crowdfunding releases need the release validator (rose chip). +Settlement path + + +1 +create_event + +Owner +pool += budget; +fee โ†’ fee account +(same tx; fee โ‰ค 10%); +ฮฃ floors โ‰ค budget; +crowdfunding: pool +starts at 0 + +Active + + +2 +accept_manager + +Manager +optional; no funds +move; authority +owner โ†’ manager; +custody stays with +the owner (TB7) + + +3 +add_funds + +Contributor +pool += amount +(min 10 tokens); +fee at deposit; +crowdfunding: no fee +now, fee at release + + +4 +participation + +Builder +off chain from 2.0.0: +applications and +entries live in the +backend; no contract +call, no funds move + + +5 +select_winners + +Manager +owed += ฮฃ amounts; +pool unchanged; +owed โ‰ค pool; โ‰ฅ floors; +each position once; +90-day window: only +blocks cancel (8) + + +6 +claim_prize + +Winner +pool โˆ’= amount; +owed โˆ’= amount; +winner pulls own +award; single release +(hackathon, bounty); +pool 0 โ†’ Completed + +Completed + + + + + + + +Cancellation path + + +8 +start_cancel + +Manager +refused while prizes are +claimable (90 days); +owed reset to 0; +Active โ†’ Cancelling; +owner-only funds: refund +owner, Active โ†’ Cancelled + +Cancelling + + +9 +process_cancel_batch + +Anyone +pool โˆ’= refunds; +โ‰ค 15 refunds per call, +repeat until done; +pro rata when pool < +outside contributions; +only while Cancelling + + +10 +finalize_cancel + +Anyone +pool โˆ’= residual; +โ†’ owner; pool = 0; +only after all refunds +are processed; +Cancelling โ†’ Cancelled + +Cancelled + +Milestone release + + +7 +claim_milestone + +Owner + + +Release validator +pool โˆ’= milestone amount; +grant: award รท milestones, only +to a roster recipient (from 5); +owed โˆ’= amount; +crowdfunding: pool รท milestones +left, paid to the owner only; +fee at release; release validator +co-signs (admin if none) + + + + + + +โ‰ค 15 refunds/call + + +any time while Active + + +owner-only funds ยท start_cancel refunds the owner inline ยท Active โ†’ Cancelled + + +grant: milestone schedule from the award (5) + + +pool = 0 + + +token transfer ยท deposit / release / refund + +Escrow pool + +critical custody +contract token balance; +one balance for all events; +fees are forwarded, +never pooled + + + + + +remaining_escrow += unreserved + reserved +unreserved +EventOwedTotal (reserved) +released +โ†‘ deposits (1, 3) โ†“ claims (6, 7), refunds (9), owner residual (8, 10) +reserved: โ†‘ select_winners (5) โ†“ claims (6, 7) reset to 0 at 8 +after step +1โ€“4 + +5 + + +6ยท7 + + + +8 + + +9 + + +10 + + + +released (derived) ยท left the pool to: +Recipient accounts +prize ยท 6 + + + +Winner wallet +milestone ยท 7 (grantee / crowdfunding owner) + + + +Milestone recipient +refunds ยท 9 (full, or pro rata) + + + +Contributor wallets +residual ยท 8 (owner-only funds), 10 + + + +Owner wallet +fee ยท 1, 3 (crowdfunding: 7) ยท never pooled + + + +Fee account + + +External entity + +Process ยท contract + +Process ยท Boundless + +Event state + +Data store + +Data / token flow + +Conditional path + +Trust boundary +Signer chips + +Owner +must sign (require_auth) + +Manager +the owner until a manager accepts + +Anyone +permissionless ยท no signature + + +Admin +2-of-3 multi-sig ยท critical custody + diff --git a/docs/audit-2026-06-stellar-skill.md b/docs/history/audit-2026-06-stellar-skill.md similarity index 90% rename from docs/audit-2026-06-stellar-skill.md rename to docs/history/audit-2026-06-stellar-skill.md index 72b839d..281c641 100644 --- a/docs/audit-2026-06-stellar-skill.md +++ b/docs/history/audit-2026-06-stellar-skill.md @@ -1,4 +1,14 @@ -# Boundless contract audit โ€” June 2026 +# Boundless contract audit, June 2026 + +> Historical record. This is the in-house audit of the events and profile +> contracts at version 1.0.0, run on 2026-06-04 against the SDF +> `stellar-dev-skill`; its findings were fixed or accepted that month. It +> describes code that no longer exists: on-chain credits went in 1.1.0, +> applicant and submission records in 2.0.0, and upgrades now go through +> `propose_upgrade`, `apply_upgrade` and `migrate`. The current security +> analysis is `docs/threat-model.md` and the current upgrade procedure is +> `docs/upgrade-runbook.md`. File paths and function names below are as +> audited. Audit run against the freshly-installed Stellar Development Foundation `stellar-dev-skill` (https://github.com/stellar/stellar-dev-skill), specifically @@ -8,15 +18,6 @@ Part 5 (Common Pitfalls). Scope: `contracts/events` and `contracts/profile` source. Tests, deploy scripts, and off-chain runbooks are out of scope here; they get their own pass. -> **Historical note (post-audit):** this report describes the contracts as -> audited, at version 1.0.0, when the profile contract still held per-user -> credit balances on-chain (`profile/src/credits.rs`, the `credits` field on -> `Profile`, `application_credit_cost` on events). The 1.0.0 โ†’ 1.1.0 upgrade -> (2026-06) removed on-chain credits; they are now an off-chain ledger in -> boundless-nestjs, and the profile contract holds only reputation scores and -> per-token earnings. Credit-related references below are accurate for the -> code as audited and are preserved unedited. - ## TL;DR Boundless ships solid Soroban hygiene: typed errors, typed `DataKey` keys, @@ -43,10 +44,10 @@ hackathon scale. Everything else is moderate or below. ## Severity legend -- **HIGH** โ€” pre-mainnet blocker, or active footgun if missed. -- **MEDIUM** โ€” recoverable, but worth fixing this quarter. -- **LOW** โ€” polish, documentation, semantic cleanup. -- **POSITIVE** โ€” patterns the skill explicitly recommends and we got right. +- **HIGH**: pre-mainnet blocker, or active footgun if missed. +- **MEDIUM**: recoverable, but worth fixing this quarter. +- **LOW**: polish, documentation, semantic cleanup. +- **POSITIVE**: patterns the skill explicitly recommends and we got right. # HIGH @@ -96,13 +97,13 @@ be proactively bumped or the entry archives and is unreadable. A grep over the repo turns up zero `extend_ttl` calls. Long-lived data at risk: -- `Event(u64)` โ€” escrow holdings for a multi-month hackathon -- `Profile(Address)` โ€” every user's credits + reputation -- `EarningsByToken(user, token)` โ€” per-user earnings record -- `MilestoneClaimed(event, recipient, milestone)` โ€” replay protection on +- `Event(u64)`: escrow holdings for a multi-month hackathon +- `Profile(Address)`: every user's credits + reputation +- `EarningsByToken(user, token)`: per-user earnings record +- `MilestoneClaimed(event, recipient, milestone)`: replay protection on grant payouts -- `EventWinners(u64)` โ€” anchor + payout audit trail -- `CrowdfundingMilestonesClaimed(u64)` โ€” divisor for dynamic-split math +- `EventWinners(u64)`: anchor + payout audit trail +- `CrowdfundingMilestonesClaimed(u64)`: divisor for dynamic-split math Archival of any of these silently breaks the corresponding flow. For crowdfunding specifically, archived `CrowdfundingMilestonesClaimed` resets @@ -141,12 +142,12 @@ Two follow-on effects: invocation. Soroban resource limits will reject this even before the size cap hits. - `select_winners` walks `EventWinners` to check the replay anchor, but - caps at `MAX_WINNERS_PER_SELECT = 50` โ€” that one's bounded. + caps at `MAX_WINNERS_PER_SELECT = 50`, so that one is bounded. Fix: split each list into per-element keys with an index counter. ```rust -// proposal โ€” index + per-entry storage +// proposal: index + per-entry storage DataKey::EventApplicantCount(u64) DataKey::EventApplicant(u64, u32) -> Address DataKey::EventApplicantIndex(u64, Address) -> u32 // for O(1) lookup @@ -206,7 +207,7 @@ A wrong or malicious address gets full control over the user-incentive ledger. The skill (Part 3, vulnerability category 1) lists authorization-via-trusted-caller as one of the top categories to harden. -Fix: rotate this through the same two-step pattern as `set_admin` โ€” write +Fix: rotate this through the same two-step pattern as `set_admin`: write `PendingEventsContract`, require the new contract to call `accept_events_contract` from its own admin (or hold for N ledgers before auto-accepting). Keeps off-chain multisig as the first layer, on-chain @@ -269,7 +270,7 @@ Two coherent fixes; either works but you need to pick: - (B) Grow `total_budget` inside `add_funds` so the percent math reflects the topped-up pool. -Today is neither โ€” top-ups grow the escrow but don't change anything else. +Today is neither: top-ups grow the escrow but don't change anything else. This is a product decision more than a security one, but the contract should match the product policy explicitly. @@ -300,7 +301,7 @@ Adding a trustline-existence read on token register is the cleanest spot ## M3. No on-chain version function See H6. Worth listing separately because the `version()` view is the lowest -effort piece โ€” it doesn't need timelock infrastructure. +effort piece; it doesn't need timelock infrastructure. ## M4. Profile-side counters are dead fields @@ -332,7 +333,7 @@ drop the fields and migrate the existing rows on the same upgrade. File: `contracts/events/src/grant.rs:64-211`. Comment says the off-chain layer admin-co-signs the builder's claim, but the contract requires only -`event.owner.require_auth()` โ€” and for crowdfunding the owner is the +`event.owner.require_auth()`, and for crowdfunding the owner is the builder. Today this is fine because abstracted wallets hold the signing key on the @@ -374,7 +375,7 @@ pub fn get_admin(env: &Env) -> Result { ``` Reversed semantic. Should be `Error::NotInitialized` (which doesn't exist -yet โ€” add to enum). Misleads operators reading logs. +yet; add to enum). Misleads operators reading logs. ## L3. `admin::get_admin` uses `.expect("admin not configured")` @@ -433,7 +434,7 @@ them in a refactor. - **P2.** Typed `DataKey` enum prevents storage key collisions (skill Part 3, "Storage Security"). - **P3.** `OpSeen(BytesN<32>)` idempotency markers stored in `temporary()` - with auto-TTL โ€” correct storage type per skill Part 5. + with auto-TTL, the correct storage type per skill Part 5. - **P4.** Two-step admin rotation with TTL on `PendingAdmin`, including the `expires_at_ledger` check inside `accept_admin` (skill Part 3, vulnerability category 1). @@ -447,7 +448,7 @@ them in a refactor. 7). - **P8.** Token whitelist with admin-gated `register` / `deregister`, plus per-event `require_supported` check (skill Part 3, "Cross-Contract - Calls" โ€” restricting external token surface). + Calls", restricting external token surface). - **P9.** Child op_id derivation (`derive_child` / `derive_child_indexed`) gives every cross-contract call its own idempotency marker so the profile-side `OpSeen` set never collides with the events-side parent op. @@ -455,24 +456,24 @@ them in a refactor. (release kind, deadline-required, distribution shape) co-located with the pillar logic. Refactor-friendly. - **P11.** `select_winners` does a two-pass total-owed check before any - transfers โ€” `InsufficientEscrow` fires before money moves. + transfers, so `InsufficientEscrow` fires before money moves. - **P12.** `claim_milestone` last-milestone sweep math (`already_claimed + 1 == total_milestones โ‡’ pay remainder`) avoids stranded dust on per-recipient grant payouts. - **P13.** All public functions return typed `Result<_, Error>`, never raw panics from user-facing paths (skill Part 3, "Error handling"). -- **P14.** `ProfileClient` defined via `#[contractclient]` typed trait โ€” +- **P14.** `ProfileClient` defined via `#[contractclient]` typed trait: no string-named cross-contract calls (skill Part 3, "Cross-Contract Calls"). - **P15.** `saturating_*` arithmetic throughout. Skill Part 3 category 4 (integer overflow) gets shut down structurally. - **P16.** Profile contract gates ALL credit / reputation / earnings - mutations on `require_events_contract` โ€” single trusted-caller surface, + mutations on `require_events_contract`, a single trusted-caller surface, documented (skill Part 3, "Authorization"). - **P17.** Partners-first refund priority on `cancel_event` with explicit case A / case B math, no rounding gives the owner contributor money. - **P18.** Per-event `fee_bps_override` snapshotted at create time and - reused by `add_funds` โ€” fee model stays stable even if the contract + reused by `add_funds`, so the fee model stays stable even if the contract default changes mid-flight. - **P19.** `withdraw_application` blocks when a submission already exists, closing the "withdraw, refund credits, resubmit free" loop. @@ -490,7 +491,7 @@ Pre-mainnet blockers: high-leverage on the profile contract's auth model. **Ship before mainnet.** 3. H3 + H4. Storage layout change for the per-event lists and - submissions. Heavier โ€” needs paged read/write helpers and a + submissions. Heavier: needs paged read/write helpers and a migration. **Ship before any hackathon > 500 participants.** Q3 polish: @@ -521,7 +522,7 @@ Backlog: - Severity calibrated for a contract that holds production escrow at hackathon scale. - No off-chain claims taken at face value (e.g., "admin signs on behalf of - the builder") โ€” every authorization invariant verified at the contract + the builder"); every authorization invariant verified at the contract layer first. Out of scope: tests under `contracts/*/src/tests/`, deploy scripts, diff --git a/docs/history/mainnet-sdk27-upgrade-2026-07.md b/docs/history/mainnet-sdk27-upgrade-2026-07.md new file mode 100644 index 0000000..9bd019b --- /dev/null +++ b/docs/history/mainnet-sdk27-upgrade-2026-07.md @@ -0,0 +1,335 @@ +# Mainnet SDK 27 upgrade procedure and 2026-06 audit delta + +> Historical record. Sections 7.2 to 7.5 and 8 of the former +> `docs/mainnet-deploy-runbook.md`, last revised 2026-07-24. They were the +> pinned procedure for moving mainnet from SDK 23 to SDK 27 builds (events +> 1.1.0 to 1.5.0 and profile 1.1.0 to 1.2.0, behind a zero-event guard), plus +> a summary of the contract surface changes from the June 2026 audit. Mainnet +> never ran these exact builds: the operator's upgrade log records events going +> from 1.1.0 to 1.6.0 between 2026-07-28 and 2026-07-30, and profile reached +> 1.2.0 in the August upgrade (`mainnet-upgrade-runbook-2026-08.md`). +> `docs/upgrade-runbook.md` replaces this procedure, and `deploy_mainnet.sh` no +> longer pins versions or hashes. Commands and paths are as written then; +> `scripts/test-sdk27-compat.sh` and `docs/sdk27-compatibility-fixtures.md` +> have since become `scripts/test-storage-compat.sh` and +> `docs/storage-compatibility.md` and cover a later upgrade. + +### SDK 27 compatibility gate + +The suite upgrades the exact mainnet `1.1.0` WASMs and ledger `63617727` +snapshot, plus synthetic SDK 23 rows for every persisted layout, through H6 +to the pinned events `1.5.0` and profile `1.2.0` WASMs. It then exercises +configuration, governance, event reads, winners, submissions, contributions, +cancellation, prize claims, earnings, indexes, cursors, and legacy replay +markers. Fixture hashes, provenance, and regeneration are recorded in +`docs/sdk27-compatibility-fixtures.md`. + +Before any SDK 27 mainnet proposal: + +```bash +./scripts/test-sdk27-compat.sh +``` + +CI must have rebuilt the contracts and matched the pinned fixtures. Abort if a +fixture hash differs, a compatibility test fails, or the zero-event check no +longer returns `EventNotFound`. The SDK 27 contracts retain a read fallback for +legacy temporary `OpSeen(BytesN<32>)` rows; new markers use the domain-scoped +key. + +Sections 7.2 through 7.5 are the executable SDK 27 procedure for events `1.1.0` โ†’ `1.5.0` and profile `1.1.0` โ†’ `1.2.0`. +The mainnet script intentionally rejects other upgrade target versions. A +future release must update its reviewed version/hash pins and compatibility +fixtures before preparing a proposal. + +### 7.2 Freeze and propose SDK 27 + +This is a coordinated two-contract upgrade. Keep both contracts paused from before either proposal until both migrations and post-upgrade reads have succeeded. Set the live contract IDs explicitly if `deployments/mainnet.json` is unavailable. `ADMIN_SOURCE` is the admin multi-sig G-address, not a secret or single-signer alias. `UPLOAD_SOURCE` is a separate funded, signable CLI identity; uploading WASM does not require contract-admin authority. + +Freeze governance changes for the whole window: do not call `set_admin`, +`accept_admin`, `propose_events_contract`, `accept_events_contract`, or +`cancel_pending_events_contract` on either contract while upgrade XDRs are +being prepared, signed, or submitted. Before every signed submission, rerun +the corresponding preparation or verification command against current ledger +state. The script requires both current admins to equal `ADMIN_SOURCE`, the +profile's active events binding to equal `EVENTS_ID`, and +`get_pending_events_contract` to be `null`. + +```bash +export EVENTS_ID=CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ +export PROFILE_ID=CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC +export ADMIN_SOURCE=$MULTISIG_ADMIN_ADDRESS +export UPLOAD_SOURCE=boundless-upgrade-uploader + +./scripts/test-sdk27-compat.sh + +EVENTS_WASM=contracts/compatibility/fixtures/events-1.5.0-sdk27.wasm +PROFILE_WASM=contracts/compatibility/fixtures/profile-1.2.0-sdk27.wasm + +# Upload the exact compatibility-tested artifacts before downtime. +./deploy_mainnet.sh upload-profile-wasm "$PROFILE_WASM" +./deploy_mainnet.sh upload-events-wasm "$EVENTS_WASM" + +# Freeze events first. This command only prepares XDR. +./deploy_mainnet.sh prepare-pause-events /tmp/events-1.5.0-pause.xdr +``` + +Sign and submit the events pause XDR. Only after it lands, prepare, sign, and submit the profile pause: + +```bash +./deploy_mainnet.sh prepare-pause-profile /tmp/profile-1.2.0-pause.xdr +``` + +Never prepare the next admin XDR before the prior one lands; each uses the multi-sig source account's current sequence. Then: + +```bash +./deploy_mainnet.sh upgrade-status +# Both is_paused values must be true, both versions must be 1.1.0, +# both pending-upgrade values must be null, profile.get_events_contract must +# equal EVENTS_ID, and profile.get_pending_events_contract must be null. +``` + +Prepare the profile proposal: + +```bash +./deploy_mainnet.sh prepare-propose-upgrade-profile \ + "$PROFILE_WASM" "1.2.0" /tmp/profile-1.2.0-propose.xdr +``` + +Sign and submit it, then verify what landed: + +```bash +./deploy_mainnet.sh verify-proposed-upgrade-profile "$PROFILE_WASM" "1.2.0" +``` + +Only then prepare, sign, and submit the events proposal: + +```bash +./deploy_mainnet.sh prepare-propose-upgrade-events \ + "$EVENTS_WASM" "1.5.0" /tmp/events-1.5.0-propose.xdr +``` + +Verify the events proposal and inspect both contracts: + +```bash +./deploy_mainnet.sh verify-proposed-upgrade-events "$EVENTS_WASM" "1.5.0" +./deploy_mainnet.sh upgrade-status +``` + +The guarded preparation and verification: + +- requires both live versions to be `1.1.0`, both contracts to be paused, and no conflicting upgrade to be pending; +- rechecks both active admins, the profile-to-events binding, and the absence of a pending profile events-contract rotation at every prepared or verified upgrade step; +- derives the first possible event ID from `id_base` and requires `get_event` to fail specifically with `EventNotFound` before the events pause, proposal, and apply; +- requires Stellar CLI `27.0.0` and pins the local events and profile files to the exact compatibility-tested SDK 27 hashes; +- uploads without re-optimizing and requires each returned hash to equal the local file's SHA-256; +- builds and simulates every admin transaction without bypassing the 2-of-3 signing flow; +- reads back each queued version and exact WASM hash after the signed proposals land; +- queries each live contract's executable hash after apply and rechecks it before migration, unpause, and final verification. + +Do not unpause either contract during the timelock. If `get_event` finds an +event or returns anything other than `EventNotFound`, abort without applying +either upgrade and investigate. Publish both `proposed_at_ledger` and +`available_at_ledger` values. Apply only after the later +`available_at_ledger` value has been reached. + +### 7.3 Apply, migrate, verify, and unpause + +Keep the exact proposed artifacts. Apply profile first while both contracts remain paused: + +```bash +./deploy_mainnet.sh upgrade-status +./deploy_mainnet.sh prepare-apply-upgrade-profile \ + "$PROFILE_WASM" "1.2.0" /tmp/profile-1.2.0-apply.xdr +``` + +Sign and submit the profile apply XDR. Confirm profile is `1.2.0`, has no pending proposal, and remains paused. Then prepare, sign, and submit events apply: + +```bash +./deploy_mainnet.sh upgrade-status +./deploy_mainnet.sh prepare-apply-upgrade-events \ + "$EVENTS_WASM" "1.5.0" /tmp/events-1.5.0-apply.xdr +``` + +Before preparing either apply transaction, the script rechecks the pinned +local artifact, queued hash, current versions, pause state, both admins, the +profile-to-events binding, and the absence of a pending events-contract +rotation. Before events apply it also rechecks the zero-event invariant and +the profile's live executable hash. After each signed apply lands, the next +guarded command queries the contract's live executable hash and requires the +exact pinned SDK 27 value. Status must show events `1.5.0`, profile `1.2.0`, +no pending proposals, the original profile-to-events binding, no pending +rotation, and both contracts still paused. + +Migrate profile first, then events. Prepare, sign, submit, and verify each transaction before moving to the next: + +```bash +./deploy_mainnet.sh prepare-migrate-upgrade-profile \ + "1.2.0" /tmp/profile-1.2.0-migrate.xdr +``` + +Sign and submit the profile migration. After it lands: + +```bash +./deploy_mainnet.sh upgrade-status + +./deploy_mainnet.sh prepare-migrate-upgrade-events \ + "1.5.0" /tmp/events-1.5.0-migrate.xdr +``` + +Sign and submit the events migration. After it lands: + +```bash +./deploy_mainnet.sh upgrade-status +# Migrated-to values must be profile 1.2.0 and events 1.5.0. +``` + +Unpause profile first so events cannot accept work while its profile dependency is frozen. After the profile unpause lands, unpause events: + +```bash +./deploy_mainnet.sh prepare-unpause-profile \ + "1.2.0" /tmp/profile-1.2.0-unpause.xdr +``` + +Sign and submit the profile unpause. After it lands: + +```bash +./deploy_mainnet.sh prepare-unpause-events \ + "1.5.0" /tmp/events-1.5.0-unpause.xdr +``` + +Sign and submit the events unpause. + +Only after both signed unpause transactions land: + +```bash +./deploy_mainnet.sh verify-upgrade-profile "$PROFILE_WASM" "1.2.0" +./deploy_mainnet.sh verify-upgrade-events "$EVENTS_WASM" "1.5.0" +./deploy_mainnet.sh upgrade-status +``` + +Final verification requires the exact local and live executable hashes, expected versions and migration markers, no pending proposals or events-contract rotation, the original profile-to-events binding, both expected admins, and both pause flags to be `false` before updating the deployment records. + +Common contract errors: + +- `UpgradeTimelockNotElapsed`: wait longer; leave the contract paused. +- `UpgradeProposalExpired`: cancel the pending proposal, then propose again. +- `UpgradeNotProposed`: no proposal is in storage; inspect `upgrade-status`. + +### 7.4 Rotating the events-contract address on `boundless-profile` + +`set_events_contract` is first-set-only (Section 2.4). If the events contract needs to be redeployed at a new address (e.g., recovery from a hard fork), the profile contract uses a separate timelocked rotation: + +```bash +# Propose the new events contract address. +stellar contract invoke \ + --network "$STELLAR_NETWORK" \ + --source-account $MULTISIG_ADMIN_ADDRESS \ + --id $PROFILE_ID \ + --build-only \ + -- propose_events_contract \ + --new_addr $NEW_EVENTS_ID \ + | stellar tx simulate --network "$STELLAR_NETWORK" --source-account $MULTISIG_ADMIN_ADDRESS \ + > /tmp/profile-propose-events-contract.xdr + +# Wait ~1 day (EVENTS_CONTRACT_TIMELOCK_LEDGERS = 17_280). +stellar contract invoke \ + --network "$STELLAR_NETWORK" \ + --source-account $MULTISIG_ADMIN_ADDRESS \ + --id $PROFILE_ID \ + --build-only \ + -- accept_events_contract \ + | stellar tx simulate --network "$STELLAR_NETWORK" --source-account $MULTISIG_ADMIN_ADDRESS \ + > /tmp/profile-accept-events-contract.xdr +``` + +Sign and submit each prepared XDR separately, verifying the proposal landed before preparing the accept transaction. + +Expiry is 7 days (`PENDING_EVENTS_CONTRACT_TTL_LEDGERS = 120_960`). + +### 7.5 Recovery + +Before either apply lands, cancel each affected proposal in profile-then-events +order, signing and submitting each XDR before preparing the next: + +```bash +./deploy_mainnet.sh prepare-cancel-upgrade-profile \ + /tmp/profile-1.2.0-cancel.xdr +./deploy_mainnet.sh prepare-cancel-upgrade-events \ + /tmp/events-1.5.0-cancel.xdr +``` + +Only prepare a cancel for a contract with a pending proposal. Cancellation +leaves both contracts paused. Either restart the proposal sequence or, when +abandoning the upgrade, unpause profile and then events, again submitting each +XDR before preparing the next: + +```bash +./deploy_mainnet.sh prepare-unpause-profile \ + "1.1.0" /tmp/profile-abandon-upgrade-unpause.xdr +./deploy_mainnet.sh prepare-unpause-events \ + "1.1.0" /tmp/events-abandon-upgrade-unpause.xdr +``` + +`apply_upgrade` is atomic per contract: a failed apply leaves that contract's +old WASM and proposal in place. Once either apply lands, do not downgrade or +unpause. Run `upgrade-status`, complete the other apply, and resume Section 7.3 +from the first missing migration or verification step. The unpause commands +require the exact live WASM and migration markers. + +--- + +## 8. 2026-06 Stellar-skill audit: delta from the previous runbook + +This section summarizes everything that changed in the contract surface between this revision and the prior runbook. Use it when reviewing customer / partner integrations. + +### 8.1 Removed + +- `upgrade(new_wasm_hash)`: replaced by `propose_upgrade` + `apply_upgrade`. See Section 7. +- `cancel_event(event_id, op_id)`: replaced by `start_cancel` + `process_cancel_batch` + `finalize_cancel`. See Section 8.4. +- `Profile.wins_count`, `submissions_count`, `applications_count`, `milestones_completed`: the off-chain indexer derives counters from the emitted events instead. +- `__link_keep`: linker keep-alive trick, no longer needed. + +### 8.2 Added + +- `version() -> String`: on-chain semver. Returns that package's `INITIAL_VERSION`; bumped by `apply_upgrade`. +- `propose_upgrade(wasm_hash, new_version)`, `apply_upgrade()`, `cancel_pending_upgrade()`, `migrate()`: timelocked upgrade flow. +- `start_cancel(event_id, op_id)`, `process_cancel_batch(event_id, max_refunds, op_id) -> u32`, `finalize_cancel(event_id, op_id)`: paged cancellation. +- `propose_events_contract(addr)`, `accept_events_contract()`, `cancel_pending_events_contract()`: two-step rotation for the profile contract's events binding. First-set still uses `set_events_contract`. +- Paged read accessors on the events contract: `get_winner_count`, `get_winner_at`, `get_contributor_count`, `get_contributor_at`. The aggregated reads (`get_winners`, `get_contributors`) cap at the per-event maximum and stay available for backwards compat. The applicant accessors went with the participation records in 2.0.0. +- New `EventStatus::Cancelling` variant. Any switch on EventStatus needs to handle it. +- New events: `PendingUpgradeProposed`, `UpgradeApplied`, `Migrated`, `PendingUpgradeCancelled`, `PendingEventsContractSet`, `EventsRotationCancelled`. `EventCreated` adds a `title` field. + +### 8.3 Behavioral changes + +- **`select_winners` math (M1)** now pays against `remaining_escrow` at the moment of the call, snapshotted before any release. Partner top-ups via `add_funds` flow to winners instead of staying trapped until cancel. +- **Crowdfunding `claim_milestone` requires admin co-sign (M5).** The builder's auth is necessary but no longer sufficient. Off-chain admin tooling must co-sign the tx. +- **`MAX_FEE_BPS` is 1_000 (10%) (L4)**, down from 5_000 (50%). Per-event overrides still respect the cap. +- **Storage type changes (H1)**: admin/config now lives in `instance()` storage. Persistent reads of event-scoped data bump TTL on every read (H2). No off-chain wiring change; deploy fresh contracts and the new layout takes effect. +- **Per-event lists are paged (H3, H4)**: `Vec
` lists and the `Map` collapse into per-element keys with an index counter. Soft caps at `MAX_APPLICANTS_PER_EVENT = 5_000` and `MAX_CONTRIBUTORS_PER_EVENT = 5_000`. Submissions key per-`(event, applicant)`. The aggregated reads cap at these limits. + +### 8.4 Paged cancel: sequence diagram + +``` +start_cancel(event_id, op_id) + โ”œโ”€ 0 contributors โ†’ status flips to Cancelled inline, owner refunded. + โ””โ”€ N contributors โ†’ status flips to Cancelling, + CancellationState stored from one NonOwnerContributionTotal read. + +process_cancel_batch(event_id, max_refunds, op_id) -> remaining + โ”œโ”€ permissionless once status is Cancelling. + โ”œโ”€ refunds up to min(max_refunds, MAX_REFUNDS_PER_BATCH = 25) contributors. + โ”œโ”€ advances cursor inside CancellationState. + โ””โ”€ returns the count of contributors still queued. Loop until 0. + +finalize_cancel(event_id, op_id) + โ”œโ”€ permissionless once status is Cancelling. + โ”œโ”€ requires cursor == count_at_start (errors with CancellationNotFinished otherwise). + โ”œโ”€ pays owner residual on the FullPartnerThenResidual branch. + โ””โ”€ status flips to Cancelled, CancellationState cleared. +``` + +Cap math: at `MAX_REFUNDS_PER_BATCH = 25`, refunding 5_000 contributors takes 200 batch transactions (~17 minutes wall clock at testnet ledger cadence). Most cancels are well under that limit. + +The paged-cancel automation worker lives in `boundless-nestjs` (see its own BACKLOG for the worker's status). The orchestrator's `beginStartCancel` kicks off step 1. Any account can sponsor steps 2 and 3, so an unavailable event manager cannot strand a cancellation already in progress. + +For the events `1.1.0` โ†’ `1.5.0` and profile `1.1.0` โ†’ `1.2.0` mainnet upgrade, `deploy_mainnet.sh` freezes the zero-event assumption: it pauses before proposal, verifies `is_paused == true` and `EventNotFound`, keeps the contract paused through the timelock, and repeats both checks immediately before apply. Any existing event or ambiguous RPC result aborts the upgrade. New events initialize `NonOwnerContributionTotal` at zero and `add_funds` maintains it in O(1). An older event with no contributors initializes the missing total lazily. If an older event already has contributors, `add_funds` and `start_cancel` fail with `CancellationTotalMissing` instead of using an incomplete total. diff --git a/docs/history/mainnet-upgrade-runbook-2026-08.md b/docs/history/mainnet-upgrade-runbook-2026-08.md new file mode 100644 index 0000000..d14b96f --- /dev/null +++ b/docs/history/mainnet-upgrade-runbook-2026-08.md @@ -0,0 +1,278 @@ +# Mainnet upgrade runbook: events 1.7.0 + profile 1.2.0 + +> Historical record. Prepared on 2026-08-18 for the mainnet upgrade to events +> 1.7.0 and profile 1.2.0, and only partly executed: both upgrades were +> proposed and applied, but neither `migrate_events` nor `migrate` ever ran on +> mainnet. Events still reports a 1.6.0 migration marker with its first two +> records in the pre-1.7.0 layout, and profile has no marker. These builds +> also zeroed the upgrade timelock. `docs/upgrade-runbook.md` supersedes this +> file; its "Mainnet 1.7.0 to 2.0.0" section finishes that migration as part +> of the 2.0.0 upgrade. Commands and paths below are as written then. + +Prepared 2026-08-18 from `feat/escrow-open-pool` @ `870e9a3`. + +Every chain reading below was taken at preparation time. **Re-read them before +signing.** What makes this upgrade safe is the state of mainnet, not the state +of the code. + +--- + +## 1. Artifacts + +| | events | profile | +|---|---|---| +| Contract | `CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ` | `CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC` | +| On chain now | 1.6.0 | 1.1.0 | +| Target | 1.7.0 | 1.2.0 | +| Wasm sha256 | `b87365c16102f7242a8fc3e770f615991841741c40673bb241cb254130be4c26` | `6b4804920a4068dfdcaaa711fac6390850e0a92f4b5ed4e46259694b61cbae12` | +| Size | 62,110 bytes (94% of the 64 KB ceiling) | 16,148 bytes | +| Data migration | **Yes: rewrites every EventRecord** | No; `migrate()` is a version stamp with an empty dispatch | + +Reproduce both hashes before signing: + +``` +stellar contract build --package boundless-events +stellar contract build --package boundless-profile +shasum -a 256 target/wasm32v1-none/release/boundless_events.wasm +shasum -a 256 target/wasm32v1-none/release/boundless_profile.wasm +``` + +Profile's public interface is byte-identical between 1.1.0 and 1.2.0 (verified +by diffing `pub fn` signatures). Its delta is internal: `checked_add` over +`saturating_add` with typed errors (#101), non-malleable child op_id derivation +and namespaced `OpSeen` (#95), SDK 27 storage gating (#102), and the zeroed +timelock. Because the interface is unchanged, events 1.7.0 runs against either +profile version, so the ordering below is convention, not a hard dependency. + +--- + +## 2. Pre-flight: re-run immediately before signing + +The events migration rewrites every `EventRecord`, because `winner_distribution` +and `prize_floors` differ in field name *and* value type: a pre-1.7.0 row cannot +be decoded by the new struct at all. That is only safe because no mainnet event +can still reach `select_winners`. + +``` +for id in 271539957145796609 271539957145796610; do + stellar contract invoke --id CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ \ + --source --network mainnet -- get_event --event_id $id +done +``` + +Expected, and true at preparation: + +| Event | Status | Remaining escrow | +|---|---|---| +| `271539957145796609` | Completed | 0 | +| `271539957145796610` | Completed | 0 | + +Then confirm: + +- `โ€ฆ608`, `โ€ฆ611`, `โ€ฆ612`, `โ€ฆ613` all return `#30 EventNotFound` (check the error + code, not just the absence of output; a loose probe reports false positives). +- `is_paused` is `false` on both contracts. +- `get_pending_upgrade` is `null` on both. It was at preparation; a stale + proposal must be cleared with `cancel_pending_upgrade` first. + +**Stop if any event reads Active, or a third event exists.** Its record cannot +be rewritten safely while it can still be selected against. + +--- + +## 3. Three things that will bite you + +**Every admin envelope must be simulated before signing.** `--build-only` +alone produces a transaction with `fee: 100` and no `SorobanTransactionData`: +no footprint, no resource fee. It will be rejected. Pipe every build through +`stellar tx simulate`, which fills both in (the profile propose goes from fee +100 to 318,317 stroops). The pattern throughout is: + +``` +stellar contract invoke --id --source-account boundless-mainnet-msig \ + --network mainnet --build-only -- \ + | stellar tx simulate --source-account boundless-mainnet-msig --network mainnet +``` + +Simulate against current ledger state, so build each envelope close to when it +will be signed rather than batching them up front. + +**The sequence number.** Both prepared envelopes were built against the admin +account's current sequence, so they carry the *same* `seq_num` +(`271536946373722128`). Only one can ever be submitted; the second fails with +`tx_bad_seq`. **Build each envelope only after the previous transaction has +confirmed.** The same applies to every `apply_upgrade`, `migrate_events` and +`migrate` call below: each is a separate admin transaction consuming a +sequence number. + +**The timelock is zero.** `UPGRADE_TIMELOCK_LEDGERS = 0` on both contracts, so +`propose_upgrade` and `apply_upgrade` can land in consecutive ledgers and there +is no window in which `cancel_pending_upgrade` can catch a mistake. The 1.1.0 +upgrade ran with roughly a day. Restoring it is issue #122 and a single-value +edit in `admin.rs`, but it changes both wasm hashes and invalidates every +envelope here. + +--- + +## 4. Signing + +Admin for both contracts is `GCVK72I6TVJVDTTY4UKU6MQT4QJ2T2AAG3NULNEUDM46L3UOQYDSO4O2`: +a 2-of-3 multisig (three weight-1 signers, master key weight 0 and therefore +unable to authorize anything on its own). No key on the build machine can sign +this. Follow `docs/contract-ops-runbook.md` Section 5 for the ceremony; sign +sequentially, then submit with `stellar tx send "" --network mainnet`. + +Decode every envelope before signing: + +``` +stellar xdr decode --type TransactionEnvelope --output json <<< "" +``` + +--- + +## 5. Sequence + +Profile first, matching the deploy convention that events depends on profile. +Each numbered step is a separate 2-of-3 signing ceremony unless marked read-only. + +### 5.1 Upload both wasms + +Any funded mainnet account; **no admin auth required**, so this needs no +ceremony. `apply_upgrade` fails if the wasm is not already on the network. + +``` +stellar contract upload --wasm target/wasm32v1-none/release/boundless_profile.wasm \ + --source --network mainnet # must print 6b480492โ€ฆ +stellar contract upload --wasm target/wasm32v1-none/release/boundless_events.wasm \ + --source --network mainnet # must print b87365c1โ€ฆ +``` + +### 5.2 Profile: 1.1.0 โ†’ 1.2.0 + +1. **propose_upgrade**, prepared envelope: + +``` +AAAAAgAAAACqr+kenVNRznjlFU8yE+QTqegANttFtJQbOeXujoYHJwAE220DxLFqAAAAEAAAAAAAAAAAAAAAAQAAAAAAAAAYAAAAAAAAAAH2o/HE+cZznpgt904v7VoQtlwY8dnSkPqh/UC5V+HG0gAAAA9wcm9wb3NlX3VwZ3JhZGUAAAAAAgAAAA0AAAAga0gEkgpAaN/cqqcR+sY5CFDgqS9LXtTkYllpS2HLrhIAAAAOAAAABTEuMi4wAAAAAAAAAQAAAAAAAAAAAAAAAfaj8cT5xnOemC33Ti/tWhC2XBjx2dKQ+qH9QLlX4cbSAAAAD3Byb3Bvc2VfdXBncmFkZQAAAAACAAAADQAAACBrSASSCkBo39yqpxH6xjkIUOCpL0te1ORiWWlLYcuuEgAAAA4AAAAFMS4yLjAAAAAAAAAAAAAAAQAAAAAAAAABAAAAB7njUAz7VZeB5oNZZV83d1x4r//FqENtrKnR0fjjVpsCAAAAAQAAAAYAAAAB9qPxxPnGc56YLfdOL+1aELZcGPHZ0pD6of1AuVfhxtIAAAAUAAAAAQAT6jAAAAAAAAACrAAAAAAABNsJAAAAAA== +``` + +Simulated: fee 318,317 stroops, resource fee 318,217, 684 write bytes. Decodes +to source `GCVK72I6โ€ฆ`, contract `CD3KH4OEโ€ฆ`, `propose_upgrade`, args +`6b480492โ€ฆ` and `"1.2.0"`. + +Regenerate with: + +``` +stellar contract invoke --id CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC \ + --source-account boundless-mainnet-msig --network mainnet --build-only \ + -- propose_upgrade --new_wasm_hash 6b4804920a4068dfdcaaa711fac6390850e0a92f4b5ed4e46259694b61cbae12 --new_version "1.2.0" \ + | stellar tx simulate --source-account boundless-mainnet-msig --network mainnet +``` + +2. **apply_upgrade**: build fresh (sequence has moved): + +``` +stellar contract invoke --id CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC \ + --source-account boundless-mainnet-msig --network mainnet --build-only -- apply_upgrade \ + | stellar tx simulate --source-account boundless-mainnet-msig --network mainnet +``` + +3. **migrate**: version stamp only; the dispatch is empty, so nothing is + rewritten. Build fresh, same pattern. + +4. **Verify (read-only):** `version()` reads `"1.2.0"`, `is_paused` still + `false`, `get_admin` unchanged, and `get_events_contract` still points at + `CCFVEGOQโ€ฆ`. + +### 5.3 Events: 1.6.0 โ†’ 1.7.0 + +1. **propose_upgrade**: build it after the profile steps have confirmed; the + sequence will have moved several times by then: + +``` +stellar contract invoke --id CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ \ + --source-account boundless-mainnet-msig --network mainnet --build-only \ + -- propose_upgrade --new_wasm_hash b87365c16102f7242a8fc3e770f615991841741c40673bb241cb254130be4c26 --new_version "1.7.0" \ + | stellar tx simulate --source-account boundless-mainnet-msig --network mainnet +``` + +Verify it decodes to source `GCVK72I6โ€ฆ`, contract `CCFVEGOQโ€ฆ`, +`propose_upgrade`, args `b87365c1โ€ฆ` and `"1.7.0"`. + +2. **apply_upgrade**: build fresh. + +3. **migrate_events(max_events)**: paged; **this is the point of no return** + (see ยง6). Two events, so one call with `--max_events 8` suffices, but drive + it off the counter rather than the assumption: + +``` +stellar contract invoke --id CCFVEGOQโ€ฆ --source --network mainnet -- migration_remaining # read-only +``` + +Repeat `migrate_events` until `migration_remaining` reads `0`. + +4. **migrate**: one-shot version stamp. It refuses while any event is still + unconverted, so step 3 must be complete. + +5. **Verify (read-only):** `version()` reads `"1.7.0"`, and both events now + expose `prize_floors` instead of `winner_distribution`: + +``` +stellar contract invoke --id CCFVEGOQโ€ฆ --source --network mainnet -- get_event --event_id 271539957145796609 +``` + +Expect `prize_floors: {"1": "100000000"}` on `โ€ฆ609` and +`{"1": "600000000", "2": "400000000"}` on `โ€ฆ610`, the absolute amounts the old +percentages would have paid against each budget. + +### 5.4 Backend cutover, immediately after ยง5.3 step 4 + +`create_event`, `select_winners`, `submit`, `withdraw_submission` and +`get_submission` all changed shape, and `Submitted` / `SubmissionWithdrawn` now +carry a slot. Deploy `boundless-nestjs` from the matching commit as soon as +`migrate()` confirms. + +A lagging backend fails publishes loudly with no funds moved, which is the safe +direction, but **do not publish a bounty in the gap**. + +### 5.5 Record the result + +Update `deployments/mainnet.json` (version, both wasm hashes, `last_upgraded_at`) +and append to `deployments/mainnet-upgrades.jsonl`. + +--- + +## 6. Rollback + +The window closes in stages: + +| Point | Recoverable? | +|---|---| +| After `propose_upgrade` | Yes: `cancel_pending_upgrade`. With a zero timelock this window is only as long as you leave it. | +| After `apply_upgrade`, before `migrate_events` | Yes: propose and apply the previous wasm. Records are still in 1.6.0 shape and untouched. | +| After `migrate_events` | **No.** Records are rewritten to `prize_floors`; 1.6.0 code cannot decode them, so reverting the wasm bricks reads. | +| After `migrate` | No, and `migrate()` cannot be re-run: it returns `#69 MigrationAlreadyApplied`. A defect found later cannot be fixed by re-migrating. | + +Previous events wasm for a pre-migration rollback: +`43b83ae4e5ae689f004278f936a8616a2add5e09bb1024e8830c7f266f464963`. +Previous profile wasm: +`b9e3500cfb559781e68359655f37775c78afffc5a8436daca9d1d1f8e3569b02`. + +If something looks wrong mid-sequence, `pause` is a 2-of-3 call and stops user +operations while you decide. See the pause section of `docs/upgrade-runbook.md`. + +--- + +## 7. What a signer should weigh + +- **The third-party audit is an open P0** in `BACKLOG.md` under "blocking + mainnet", and this change touches the money path. +- **The timelock is zero** on both contracts (ยง3). +- **PR #120 is unmerged**, with 6 review comments still open beyond the owed- + reservation fix that is already in this build. +- **`deploy_and_upgrade.sh` has an argument-order bug**: `$5` is the source + account and silently defaults to `alice`. Use explicit `stellar contract + invoke` calls for mainnet, as written above. + +Testing behind this build: 312 contract tests, 2208 backend tests, and the +22-script smoke suite green on testnet. Both binaries are deployed on testnet, +so what mainnet would run has run on a chain. diff --git a/docs/mainnet-deploy-runbook.md b/docs/mainnet-deploy-runbook.md deleted file mode 100644 index 15c1011..0000000 --- a/docs/mainnet-deploy-runbook.md +++ /dev/null @@ -1,693 +0,0 @@ -# Mainnet deployment runbook - -**For:** the contracts engineer + the admin multi-sig signers. -**Last updated:** 2026-07-24 (SDK 23 to SDK 27 storage compatibility result). - -This is the cold-deploy procedure for Boundless contracts on Stellar mainnet. Follow it in order. Do not skip the verification steps. Every transaction below is irreversible. - -The contract surface changed in the 2026-06 audit fix sweep. Anything wired to the prior surface (`cancel_event`, `upgrade(wasm_hash)`, the 7-field `Profile` struct) will break. Off-chain coordination is covered in `boundless-nestjs` `BACKLOG.md` and `boundless-platform` codegen. - ---- - -## 0. Pre-flight checklist - -Before touching mainnet, all of the following must be true. - -- [ ] **Third-party security audit:** report received, all critical + high findings resolved, public report link available. -- [ ] **In-house Stellar-skill audit:** every H / M / L finding in `docs/audit-2026-06-stellar-skill.md` is either โœ“ closed or has an inline rationale. Verify via `BACKLOG.md` `Done` log. -- [ ] **Testnet smokes all green:** Bounty Curated Showdown, Hackathon flagship, Grant 3-position cohort, Crowdfunding campaign, XLM end-to-end smoke, replay-lock + sweep smokes. -- [ ] **Admin multi-sig provisioned:** signer addresses generated, threshold configured, recovery plan documented (see `admin-custody-policy.md`). -- [ ] **Fee account address generated:** Stellar G-address with USDC trustline pre-funded with the minimum reserve balance. -- [ ] **Treasury composition decision locked:** per `business-model.md` 8.4 (100% USDC at launch). -- [ ] **Per-pillar fee % locked:** per `business-model.md` 8.1 (Bounty 2.5%, Hackathon 1.5%, Grant 1.5%, Crowdfunding 2.5%). -- [ ] **Legal sign-off:** per `boundless-nestjs/docs/runbooks/legal-review.md` for the pillars going live first. -- [ ] **Production env config staged:** Postgres, Redis, secret vault, observability all production-grade. -- [ ] **Status page live** at `status.boundless.com`. -- [ ] **On-call rotation active.** -- [ ] **Founder + lead engineer both confirmed available** for the deploy window. - -If any item is unchecked, stop. Mainnet is not negotiable. - ---- - -## 1. Deployment timeline - -| Phase | Duration | Owner | -|---|---|---| -| Pre-flight verification (Section 0) | 1 hour | Lead engineer + founder | -| Deploy profile contract | 15 min | Lead engineer | -| Deploy events contract | 30 min | Lead engineer | -| Wire profile โ†’ events | 15 min | Lead engineer | -| Register USDC SAC | 5 min | Lead engineer | -| Smoke test on mainnet (tiny amount) | 30 min | Lead engineer | -| Multi-sig rotation (initial admin โ†’ multi-sig) | 30 min | Founder + signers | -| Public announcement | 15 min | Founder + marketing | - -Total: ~3 hours of focused work, plus pre-flight. - ---- - -## 2. Deploy procedure - -### 2.1 Set environment - -```bash -# Use our managed production provider. The URL below is Stellar's listed public -# fallback, not the preferred production endpoint. -export STELLAR_RPC_URL=https://stellar.api.onfinality.io/public -export STELLAR_NETWORK_PASSPHRASE="Public Global Stellar Network ; September 2015" -stellar network add boundless-mainnet \ - --rpc-url "$STELLAR_RPC_URL" \ - --network-passphrase "$STELLAR_NETWORK_PASSPHRASE" - -# From here onward use only the named network. Never mix --network with the -# explicit RPC/passphrase pair in one command; see contract-ops-runbook Rule 5. -export STELLAR_NETWORK=boundless-mainnet -unset STELLAR_RPC_URL STELLAR_NETWORK_PASSPHRASE - -# Treasury G-address (fee_account). Pre-funded with min reserve + USDC trustline. -export FEE_ACCOUNT=GADMINMS... # placeholder; replace with real fee account - -# Initial admin: a single key used ONLY to deploy and immediately rotate to multi-sig. -# This key is destroyed after Section 2.6. -export INITIAL_ADMIN_KEY=SDADM... - -# Multi-sig signer addresses; collected before deploy (see admin-custody-policy.md). -export MULTISIG_SIGNER_1=GSIGN1... -export MULTISIG_SIGNER_2=GSIGN2... -export MULTISIG_SIGNER_3=GSIGN3... -export MULTISIG_THRESHOLD=2 # 2-of-3 to start; review at scale - -# Boundless platform constants -export INITIAL_GLOBAL_FEE_BPS=250 # 2.5% Bounty default; overridden per event -# (Contract 1.0.0 also required BOOTSTRAP_PROFILE_CREDITS here; the 1.1.0 -# credit-removal upgrade moved credits to an off-chain ledger in -# boundless-nestjs, and the profile constructor now takes only --admin.) - -# USDC SAC address on Stellar mainnet (verify against Circle's documentation -# at the time of deploy; this is the canonical Stellar Asset Contract for USDC). -export USDC_SAC=CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC -``` - -### 2.2 Deploy profile contract - -```bash -cd boundless-contract -stellar contract build --locked - -# Deploy boundless-profile first; events depends on its address. -PROFILE_WASM=target/wasm32v1-none/release/boundless_profile.wasm - -PROFILE_ID=$(stellar contract deploy \ - --network "$STELLAR_NETWORK" \ - --source $INITIAL_ADMIN_KEY \ - --wasm $PROFILE_WASM \ - -- \ - --admin $(stellar keys address $INITIAL_ADMIN_KEY)) - -echo "PROFILE_ID=$PROFILE_ID" | tee -a deployments/mainnet.env -``` - -Verify: -```bash -stellar contract invoke \ - --network "$STELLAR_NETWORK" \ - --source $INITIAL_ADMIN_KEY \ - --id $PROFILE_ID \ - -- get_admin -``` -Should return the address of `$INITIAL_ADMIN_KEY`. - -### 2.3 Deploy events contract - -```bash -EVENTS_WASM=target/wasm32v1-none/release/boundless_events.wasm - -EVENTS_ID=$(stellar contract deploy \ - --network "$STELLAR_NETWORK" \ - --source $INITIAL_ADMIN_KEY \ - --wasm $EVENTS_WASM \ - -- \ - --admin $(stellar keys address $INITIAL_ADMIN_KEY) \ - --fee_account $FEE_ACCOUNT \ - --fee_bps $INITIAL_GLOBAL_FEE_BPS \ - --profile_contract $PROFILE_ID) - -echo "EVENTS_ID=$EVENTS_ID" | tee -a deployments/mainnet.env -``` - -Verify reads: -```bash -stellar contract invoke --network "$STELLAR_NETWORK" --source $INITIAL_ADMIN_KEY --id $EVENTS_ID -- get_admin -stellar contract invoke --network "$STELLAR_NETWORK" --source $INITIAL_ADMIN_KEY --id $EVENTS_ID -- get_fee_bps -stellar contract invoke --network "$STELLAR_NETWORK" --source $INITIAL_ADMIN_KEY --id $EVENTS_ID -- get_fee_account -stellar contract invoke --network "$STELLAR_NETWORK" --source $INITIAL_ADMIN_KEY --id $EVENTS_ID -- get_profile_contract -stellar contract invoke --network "$STELLAR_NETWORK" --source $INITIAL_ADMIN_KEY --id $EVENTS_ID -- is_paused -``` - -All must return the values you set. - -### 2.4 Wire profile โ†’ events - -```bash -# Profile contract needs to know which events contract is allowed to write to it. -stellar contract invoke \ - --network "$STELLAR_NETWORK" \ - --source $INITIAL_ADMIN_KEY \ - --id $PROFILE_ID \ - -- set_events_contract \ - --new_addr $EVENTS_ID -``` - -`set_events_contract` is **first-set-only**: after this call succeeds, the contract refuses a second `set_events_contract` and rotation must go through the timelocked two-step (`propose_events_contract` + ~1-day wait + `accept_events_contract`). See Section 7.4 for the rotation procedure if the events contract address ever needs to change. - -Verify the version label was written by the constructor: - -```bash -stellar contract invoke --network "$STELLAR_NETWORK" --source $INITIAL_ADMIN_KEY --id $PROFILE_ID -- version -stellar contract invoke --network "$STELLAR_NETWORK" --source $INITIAL_ADMIN_KEY --id $EVENTS_ID -- version -# For this tree: profile returns "1.2.0" and events returns "1.5.0". -# For a tagged release, compare each result with that package's INITIAL_VERSION. -``` - -### 2.5 Register USDC SAC - -```bash -stellar contract invoke \ - --network "$STELLAR_NETWORK" \ - --source $INITIAL_ADMIN_KEY \ - --id $EVENTS_ID \ - -- register_supported_token \ - --token $USDC_SAC - -# Confirm -stellar contract invoke --network "$STELLAR_NETWORK" --source $INITIAL_ADMIN_KEY --id $EVENTS_ID \ - -- is_supported_token --token $USDC_SAC -# Should return true. -``` - -If you are launching with XLM support too (per B14): -```bash -export XLM_SAC= # native XLM SAC -stellar contract invoke --network "$STELLAR_NETWORK" --source $INITIAL_ADMIN_KEY --id $EVENTS_ID \ - -- register_supported_token --token $XLM_SAC -``` - -### 2.6 Tiny mainnet smoke (single founder funds it) - -Before rotating admin, run one tiny end-to-end flow with the founder's own USDC. This confirms the deploy is wired correctly without touching customer money. - -```bash -cd ../boundless-nestjs -STELLAR_NETWORK_PASSPHRASE="Public Global Stellar Network ; September 2015" \ -EVENTS_CONTRACT_ID=$EVENTS_ID \ -PROFILE_CONTRACT_ID=$PROFILE_ID \ -npx ts-node -r tsconfig-paths/register scripts/smoke/mainnet-tiny-bounty.ts -``` - -The script publishes a $1 Bounty, has one applicant submit, and pays out. Verify: -- The settlement transaction landed within 90 seconds. -- The fee account received the expected fee (1 USDC ร— 2.5% = 2,500 stroops = 0.025 USDC). -- The applicant's wallet shows 1 USDC. - -If any step fails, **pause the contract** before continuing (see Section 4) and investigate. - -### 2.7 Rotate admin from single-key to multi-sig - -**Gate:** complete `docs/multisig-preflight.md` (every checkbox) and run `./scripts/admin/verify-multisig.sh mainnet` until every check passes BEFORE invoking `set_admin`. If verify-multisig fails, do not proceed. - - -Now that the deploy works, rotate the admin key. This is the operation that locks production down. - -```bash -# Step A: build the multi-sig account. -# Multi-sig accounts on Stellar are regular G-addresses with custom signers + thresholds. -# Set up the multi-sig account separately (out of band; see admin-custody-policy.md). - -export MULTISIG_ADMIN_ADDRESS=GMULTISIG... - -# Step B: set the pending admin (two-step rotation). -stellar contract invoke \ - --network "$STELLAR_NETWORK" \ - --source $INITIAL_ADMIN_KEY \ - --id $EVENTS_ID \ - -- set_admin \ - --new_admin $MULTISIG_ADMIN_ADDRESS - -# Step C: build + simulate the multi-sig accept transaction. -stellar contract invoke \ - --network "$STELLAR_NETWORK" \ - --source-account $MULTISIG_ADMIN_ADDRESS \ - --id $EVENTS_ID \ - --build-only \ - -- accept_admin \ - | stellar tx simulate \ - --network "$STELLAR_NETWORK" \ - --source-account $MULTISIG_ADMIN_ADDRESS \ - > /tmp/events-accept-admin.xdr -``` - -Sign `/tmp/events-accept-admin.xdr` sequentially with the required quorum, then submit the final signed XDR with `stellar tx send "" --network "$STELLAR_NETWORK"`. Follow `docs/contract-ops-runbook.md` Section 5 exactly. - -Verify: -```bash -stellar contract invoke --network "$STELLAR_NETWORK" --source $INITIAL_ADMIN_KEY --id $EVENTS_ID -- get_admin -# Should now return $MULTISIG_ADMIN_ADDRESS. -``` - -Do the same rotation on `$PROFILE_ID`. - -### 2.8 Destroy the initial admin key - -The initial admin key was a single-key, used only to deploy. Once Section 2.7 succeeds: - -1. Securely delete the local copy on the deploy machine (`shred -u` or equivalent). -2. Confirm via `stellar keys ls` that the key is no longer registered. -3. The on-chain account that held the key continues to exist but has no admin authority on the contract anymore. Its funds can be swept to the treasury later. - -### 2.9 Record the deployment - -```bash -cat > boundless-contract/deployments/mainnet.json < /tmp/events-emergency-pause.xdr -``` - -Sign `/tmp/events-emergency-pause.xdr` sequentially with two signers, submit with `stellar tx send`, then read `is_paused` back as `true`. - -Pause stops event-lifecycle mutations guarded by `require_not_paused`, including `create_event`, `add_funds`, `propose_manager`, `accept_manager`, `cancel_pending_manager`, `start_cancel`, `process_cancel_batch`, `finalize_cancel`, `select_winners`, `claim_milestone`, `apply_to_bounty`, `withdraw_application`, `submit`, and `withdraw_submission`. Reads continue. - -Pause intentionally does **not** block admin recovery and governance entrypoints such as `propose_upgrade`, `apply_upgrade`, `cancel_pending_upgrade`, `migrate`, configuration changes, token-list changes, admin rotation, or `unpause`. This is why the coordinated SDK 27 upgrade can remain paused through its timelock. - -Unpausing requires full quorum (see `admin-custody-policy.md` Section 4). - ---- - -## 5. After mainnet: ongoing operational cadence - -| Cadence | Action | Owner | -|---|---|---| -| Daily | Check monitoring dashboards | On-call | -| Weekly | Settlement-time report | Founder | -| Monthly | Backup verification drill | On-call | -| Quarterly | Multi-sig rotation drill | Founder + signers | -| Quarterly | Audit refresh (whichever contract version is live) | Lead engineer | -| Semi-annually | Treasury composition review | Founder | -| Annually | Sumsub vendor review | Founder | - ---- - -## 6. Open follow-ups - -- Automate the smoke battery in Section 2.6 + 3 as a single `npm run smoke:mainnet` target. -- Move the deploy machine to a hardware-isolated workstation; the deploy session uses the only sensitive key. -- Publish the verified `mainnet.json` to the docs site as a tamper-evident reference. -- Extend `deployments/mainnet-upgrades.jsonl` logging with transaction hashes. `deploy_mainnet.sh` already records timestamp, action, version, and wasm hash. - ---- - -## 7. Upgrades (timelocked; H6) - -The 2026-06 audit replaced the immediate-effect `upgrade(wasm_hash)` admin call with a three-step timelock flow. Use `deploy_mainnet.sh` for mainnet; it verifies the queued version and exact WASM hash for both contracts and preserves the zero-event guard through the SDK 27 timelock. Direct contract calls below are only for diagnosis. - -### 7.1 Constants - -| Window | Value (ledgers @ ~5s) | Wall clock | -|---|---|---| -| `UPGRADE_TIMELOCK_LEDGERS` | 17_280 | ~1 day | -| `PENDING_UPGRADE_TTL_LEDGERS` | 518_400 | ~30 days | - -These are in `contracts/events/src/admin.rs` and `contracts/profile/src/admin.rs`. Verify against the live wasm before timing a window. - -### SDK 27 compatibility gate - -The suite upgrades the exact mainnet `1.1.0` WASMs and ledger `63617727` -snapshot, plus synthetic SDK 23 rows for every persisted layout, through H6 -to the pinned events `1.5.0` and profile `1.2.0` WASMs. It then exercises -configuration, governance, event reads, winners, submissions, contributions, -cancellation, prize claims, earnings, indexes, cursors, and legacy replay -markers. Fixture hashes, provenance, and regeneration are recorded in -`docs/sdk27-compatibility-fixtures.md`. - -Before any SDK 27 mainnet proposal: - -```bash -./scripts/test-sdk27-compat.sh -``` - -CI must have rebuilt the contracts and matched the pinned fixtures. Abort if a -fixture hash differs, a compatibility test fails, or the zero-event check no -longer returns `EventNotFound`. The SDK 27 contracts retain a read fallback for -legacy temporary `OpSeen(BytesN<32>)` rows; new markers use the domain-scoped -key. - -Sections 7.2 through 7.5 are the executable SDK 27 procedure for events `1.1.0` โ†’ `1.5.0` and profile `1.1.0` โ†’ `1.2.0`. -The mainnet script intentionally rejects other upgrade target versions. A -future release must update its reviewed version/hash pins and compatibility -fixtures before preparing a proposal. - -### 7.2 Freeze and propose SDK 27 - -This is a coordinated two-contract upgrade. Keep both contracts paused from before either proposal until both migrations and post-upgrade reads have succeeded. Set the live contract IDs explicitly if `deployments/mainnet.json` is unavailable. `ADMIN_SOURCE` is the admin multi-sig G-address, not a secret or single-signer alias. `UPLOAD_SOURCE` is a separate funded, signable CLI identity; uploading WASM does not require contract-admin authority. - -Freeze governance changes for the whole window: do not call `set_admin`, -`accept_admin`, `propose_events_contract`, `accept_events_contract`, or -`cancel_pending_events_contract` on either contract while upgrade XDRs are -being prepared, signed, or submitted. Before every signed submission, rerun -the corresponding preparation or verification command against current ledger -state. The script requires both current admins to equal `ADMIN_SOURCE`, the -profile's active events binding to equal `EVENTS_ID`, and -`get_pending_events_contract` to be `null`. - -```bash -export EVENTS_ID=CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ -export PROFILE_ID=CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC -export ADMIN_SOURCE=$MULTISIG_ADMIN_ADDRESS -export UPLOAD_SOURCE=boundless-upgrade-uploader - -./scripts/test-sdk27-compat.sh - -EVENTS_WASM=contracts/compatibility/fixtures/events-1.5.0-sdk27.wasm -PROFILE_WASM=contracts/compatibility/fixtures/profile-1.2.0-sdk27.wasm - -# Upload the exact compatibility-tested artifacts before downtime. -./deploy_mainnet.sh upload-profile-wasm "$PROFILE_WASM" -./deploy_mainnet.sh upload-events-wasm "$EVENTS_WASM" - -# Freeze events first. This command only prepares XDR. -./deploy_mainnet.sh prepare-pause-events /tmp/events-1.5.0-pause.xdr -``` - -Sign and submit the events pause XDR. Only after it lands, prepare, sign, and submit the profile pause: - -```bash -./deploy_mainnet.sh prepare-pause-profile /tmp/profile-1.2.0-pause.xdr -``` - -Never prepare the next admin XDR before the prior one lands; each uses the multi-sig source account's current sequence. Then: - -```bash -./deploy_mainnet.sh upgrade-status -# Both is_paused values must be true, both versions must be 1.1.0, -# both pending-upgrade values must be null, profile.get_events_contract must -# equal EVENTS_ID, and profile.get_pending_events_contract must be null. -``` - -Prepare the profile proposal: - -```bash -./deploy_mainnet.sh prepare-propose-upgrade-profile \ - "$PROFILE_WASM" "1.2.0" /tmp/profile-1.2.0-propose.xdr -``` - -Sign and submit it, then verify what landed: - -```bash -./deploy_mainnet.sh verify-proposed-upgrade-profile "$PROFILE_WASM" "1.2.0" -``` - -Only then prepare, sign, and submit the events proposal: - -```bash -./deploy_mainnet.sh prepare-propose-upgrade-events \ - "$EVENTS_WASM" "1.5.0" /tmp/events-1.5.0-propose.xdr -``` - -Verify the events proposal and inspect both contracts: - -```bash -./deploy_mainnet.sh verify-proposed-upgrade-events "$EVENTS_WASM" "1.5.0" -./deploy_mainnet.sh upgrade-status -``` - -The guarded preparation and verification: - -- requires both live versions to be `1.1.0`, both contracts to be paused, and no conflicting upgrade to be pending; -- rechecks both active admins, the profile-to-events binding, and the absence of a pending profile events-contract rotation at every prepared or verified upgrade step; -- derives the first possible event ID from `id_base` and requires `get_event` to fail specifically with `EventNotFound` before the events pause, proposal, and apply; -- requires Stellar CLI `27.0.0` and pins the local events and profile files to the exact compatibility-tested SDK 27 hashes; -- uploads without re-optimizing and requires each returned hash to equal the local file's SHA-256; -- builds and simulates every admin transaction without bypassing the 2-of-3 signing flow; -- reads back each queued version and exact WASM hash after the signed proposals land; -- queries each live contract's executable hash after apply and rechecks it before migration, unpause, and final verification. - -Do not unpause either contract during the timelock. If `get_event` finds an -event or returns anything other than `EventNotFound`, abort without applying -either upgrade and investigate. Publish both `proposed_at_ledger` and -`available_at_ledger` values. Apply only after the later -`available_at_ledger` value has been reached. - -### 7.3 Apply, migrate, verify, and unpause - -Keep the exact proposed artifacts. Apply profile first while both contracts remain paused: - -```bash -./deploy_mainnet.sh upgrade-status -./deploy_mainnet.sh prepare-apply-upgrade-profile \ - "$PROFILE_WASM" "1.2.0" /tmp/profile-1.2.0-apply.xdr -``` - -Sign and submit the profile apply XDR. Confirm profile is `1.2.0`, has no pending proposal, and remains paused. Then prepare, sign, and submit events apply: - -```bash -./deploy_mainnet.sh upgrade-status -./deploy_mainnet.sh prepare-apply-upgrade-events \ - "$EVENTS_WASM" "1.5.0" /tmp/events-1.5.0-apply.xdr -``` - -Before preparing either apply transaction, the script rechecks the pinned -local artifact, queued hash, current versions, pause state, both admins, the -profile-to-events binding, and the absence of a pending events-contract -rotation. Before events apply it also rechecks the zero-event invariant and -the profile's live executable hash. After each signed apply lands, the next -guarded command queries the contract's live executable hash and requires the -exact pinned SDK 27 value. Status must show events `1.5.0`, profile `1.2.0`, -no pending proposals, the original profile-to-events binding, no pending -rotation, and both contracts still paused. - -Migrate profile first, then events. Prepare, sign, submit, and verify each transaction before moving to the next: - -```bash -./deploy_mainnet.sh prepare-migrate-upgrade-profile \ - "1.2.0" /tmp/profile-1.2.0-migrate.xdr -``` - -Sign and submit the profile migration. After it lands: - -```bash -./deploy_mainnet.sh upgrade-status - -./deploy_mainnet.sh prepare-migrate-upgrade-events \ - "1.5.0" /tmp/events-1.5.0-migrate.xdr -``` - -Sign and submit the events migration. After it lands: - -```bash -./deploy_mainnet.sh upgrade-status -# Migrated-to values must be profile 1.2.0 and events 1.5.0. -``` - -Unpause profile first so events cannot accept work while its profile dependency is frozen. After the profile unpause lands, unpause events: - -```bash -./deploy_mainnet.sh prepare-unpause-profile \ - "1.2.0" /tmp/profile-1.2.0-unpause.xdr -``` - -Sign and submit the profile unpause. After it lands: - -```bash -./deploy_mainnet.sh prepare-unpause-events \ - "1.5.0" /tmp/events-1.5.0-unpause.xdr -``` - -Sign and submit the events unpause. - -Only after both signed unpause transactions land: - -```bash -./deploy_mainnet.sh verify-upgrade-profile "$PROFILE_WASM" "1.2.0" -./deploy_mainnet.sh verify-upgrade-events "$EVENTS_WASM" "1.5.0" -./deploy_mainnet.sh upgrade-status -``` - -Final verification requires the exact local and live executable hashes, expected versions and migration markers, no pending proposals or events-contract rotation, the original profile-to-events binding, both expected admins, and both pause flags to be `false` before updating the deployment records. - -Common contract errors: - -- `UpgradeTimelockNotElapsed` โ€” wait longer; leave the contract paused. -- `UpgradeProposalExpired` โ€” cancel the pending proposal, then propose again. -- `UpgradeNotProposed` โ€” no proposal is in storage; inspect `upgrade-status`. - -### 7.4 Rotating the events-contract address on `boundless-profile` - -`set_events_contract` is first-set-only (Section 2.4). If the events contract needs to be redeployed at a new address (e.g., recovery from a hard fork), the profile contract uses a separate timelocked rotation: - -```bash -# Propose the new events contract address. -stellar contract invoke \ - --network "$STELLAR_NETWORK" \ - --source-account $MULTISIG_ADMIN_ADDRESS \ - --id $PROFILE_ID \ - --build-only \ - -- propose_events_contract \ - --new_addr $NEW_EVENTS_ID \ - | stellar tx simulate --network "$STELLAR_NETWORK" --source-account $MULTISIG_ADMIN_ADDRESS \ - > /tmp/profile-propose-events-contract.xdr - -# Wait ~1 day (EVENTS_CONTRACT_TIMELOCK_LEDGERS = 17_280). -stellar contract invoke \ - --network "$STELLAR_NETWORK" \ - --source-account $MULTISIG_ADMIN_ADDRESS \ - --id $PROFILE_ID \ - --build-only \ - -- accept_events_contract \ - | stellar tx simulate --network "$STELLAR_NETWORK" --source-account $MULTISIG_ADMIN_ADDRESS \ - > /tmp/profile-accept-events-contract.xdr -``` - -Sign and submit each prepared XDR separately, verifying the proposal landed before preparing the accept transaction. - -Expiry is 7 days (`PENDING_EVENTS_CONTRACT_TTL_LEDGERS = 120_960`). - -### 7.5 Recovery - -Before either apply lands, cancel each affected proposal in profile-then-events -order, signing and submitting each XDR before preparing the next: - -```bash -./deploy_mainnet.sh prepare-cancel-upgrade-profile \ - /tmp/profile-1.2.0-cancel.xdr -./deploy_mainnet.sh prepare-cancel-upgrade-events \ - /tmp/events-1.5.0-cancel.xdr -``` - -Only prepare a cancel for a contract with a pending proposal. Cancellation -leaves both contracts paused. Either restart the proposal sequence or, when -abandoning the upgrade, unpause profile and then events, again submitting each -XDR before preparing the next: - -```bash -./deploy_mainnet.sh prepare-unpause-profile \ - "1.1.0" /tmp/profile-abandon-upgrade-unpause.xdr -./deploy_mainnet.sh prepare-unpause-events \ - "1.1.0" /tmp/events-abandon-upgrade-unpause.xdr -``` - -`apply_upgrade` is atomic per contract: a failed apply leaves that contract's -old WASM and proposal in place. Once either apply lands, do not downgrade or -unpause. Run `upgrade-status`, complete the other apply, and resume Section 7.3 -from the first missing migration or verification step. The unpause commands -require the exact live WASM and migration markers. - ---- - -## 8. 2026-06 Stellar-skill audit โ€” delta from the previous runbook - -This section summarizes everything that changed in the contract surface between this revision and the prior runbook. Use it when reviewing customer / partner integrations. - -### 8.1 Removed - -- `upgrade(new_wasm_hash)` โ€” replaced by `propose_upgrade` + `apply_upgrade`. See Section 7. -- `cancel_event(event_id, op_id)` โ€” replaced by `start_cancel` + `process_cancel_batch` + `finalize_cancel`. See Section 8.4. -- `Profile.wins_count`, `submissions_count`, `applications_count`, `milestones_completed` โ€” off-chain indexer derives counters from the emitted events instead. -- `__link_keep` โ€” linker keep-alive trick, no longer needed. - -### 8.2 Added - -- `version() -> String` โ€” on-chain semver. Returns that package's `INITIAL_VERSION`; bumped by `apply_upgrade`. -- `propose_upgrade(wasm_hash, new_version)`, `apply_upgrade()`, `cancel_pending_upgrade()`, `migrate()` โ€” timelocked upgrade flow. -- `start_cancel(event_id, op_id)`, `process_cancel_batch(event_id, max_refunds, op_id) -> u32`, `finalize_cancel(event_id, op_id)` โ€” paged cancellation. -- `propose_events_contract(addr)`, `accept_events_contract()`, `cancel_pending_events_contract()` โ€” two-step rotation for the profile contract's events binding. First-set still uses `set_events_contract`. -- Paged read accessors on the events contract: `get_applicant_count`, `get_applicant_at`, `get_winner_count`, `get_winner_at`, `get_contributor_count`, `get_contributor_at`. The aggregated reads (`get_applicants`, `get_winners`, `get_contributors`) cap at the per-event maximum and stay available for backwards compat. -- New `EventStatus::Cancelling` variant. Any switch on EventStatus needs to handle it. -- New events: `PendingUpgradeProposed`, `UpgradeApplied`, `Migrated`, `PendingUpgradeCancelled`, `PendingEventsContractSet`, `EventsRotationCancelled`. `EventCreated` adds a `title` field. - -### 8.3 Behavioral changes - -- **`select_winners` math (M1)** now pays against `remaining_escrow` at the moment of the call, snapshotted before any release. Partner top-ups via `add_funds` flow to winners instead of staying trapped until cancel. -- **Crowdfunding `claim_milestone` requires admin co-sign (M5).** The builder's auth is necessary but no longer sufficient. Off-chain admin tooling must co-sign the tx. -- **`MAX_FEE_BPS` is 1_000 (10%) (L4)**, down from 5_000 (50%). Per-event overrides still respect the cap. -- **Storage type changes (H1)**: admin/config now lives in `instance()` storage. Persistent reads of event-scoped data bump TTL on every read (H2). No off-chain wiring change; deploy fresh contracts and the new layout takes effect. -- **Per-event lists are paged (H3, H4)**: `Vec
` lists and the `Map` collapse into per-element keys with an index counter. Soft caps at `MAX_APPLICANTS_PER_EVENT = 5_000` and `MAX_CONTRIBUTORS_PER_EVENT = 5_000`. Submissions key per-`(event, applicant)`. The aggregated reads cap at these limits. - -### 8.4 Paged cancel โ€” sequence diagram - -``` -start_cancel(event_id, op_id) - โ”œโ”€ 0 contributors โ†’ status flips to Cancelled inline, owner refunded. - โ””โ”€ N contributors โ†’ status flips to Cancelling, - CancellationState stored from one NonOwnerContributionTotal read. - -process_cancel_batch(event_id, max_refunds, op_id) -> remaining - โ”œโ”€ permissionless once status is Cancelling. - โ”œโ”€ refunds up to min(max_refunds, MAX_REFUNDS_PER_BATCH = 25) contributors. - โ”œโ”€ advances cursor inside CancellationState. - โ””โ”€ returns the count of contributors still queued. Loop until 0. - -finalize_cancel(event_id, op_id) - โ”œโ”€ permissionless once status is Cancelling. - โ”œโ”€ requires cursor == count_at_start (errors with CancellationNotFinished otherwise). - โ”œโ”€ pays owner residual on the FullPartnerThenResidual branch. - โ””โ”€ status flips to Cancelled, CancellationState cleared. -``` - -Cap math: at `MAX_REFUNDS_PER_BATCH = 25`, refunding 5_000 contributors takes 200 batch transactions (~17 minutes wall clock at testnet ledger cadence). Most cancels are well under that limit. - -The paged-cancel automation worker lives in `boundless-nestjs` (see its own BACKLOG for the worker's status). The orchestrator's `beginStartCancel` kicks off step 1. Any account can sponsor steps 2 and 3, so an unavailable event manager cannot strand a cancellation already in progress. - -For the events `1.1.0` โ†’ `1.5.0` and profile `1.1.0` โ†’ `1.2.0` mainnet upgrade, `deploy_mainnet.sh` freezes the zero-event assumption: it pauses before proposal, verifies `is_paused == true` and `EventNotFound`, keeps the contract paused through the timelock, and repeats both checks immediately before apply. Any existing event or ambiguous RPC result aborts the upgrade. New events initialize `NonOwnerContributionTotal` at zero and `add_funds` maintains it in O(1). An older event with no contributors initializes the missing total lazily. If an older event already has contributors, `add_funds` and `start_cancel` fail with `CancellationTotalMissing` instead of using an incomplete total. diff --git a/docs/multisig-guide.md b/docs/multisig-guide.md index 08cbf5d..c251c53 100644 --- a/docs/multisig-guide.md +++ b/docs/multisig-guide.md @@ -8,7 +8,7 @@ Where this fits in: - **If you are one of the three signers:** read Parts A, B, C, D, F.1 to F.4, H, I, J, K, L. You can skim Parts E and F.0 to understand what the founder is doing on the other side. - **If you are a Boundless employee who is not a signer:** read Parts A, B, F (skim F.0), G, I, J, K, L. Knowing what the admin can and cannot do (Part I) is what keeps you from being phished. -- **If you are the founder running setup:** read everything in this guide, then also read `docs/admin-custody-policy.md` (the formal policy) and `docs/multisig-preflight.md` (the engineer-facing checklist). +- **If you are the founder running setup:** read everything here, then `docs/admin-custody-policy.md` (the formal policy), `docs/DEPLOYMENT.md` (the deploy and the admin rotation) and `docs/contract-ops-runbook.md` (how an admin transaction is built, simulated, signed and submitted). --- @@ -28,7 +28,7 @@ The "keys" here are crypto wallet keys stored in Freighter (a browser extension) |---|---| | **The multi-sig account** | A Stellar account (a G-address) that the contract treats as admin. It has no individual owner. It only acts when two of three signers agree. | | **Signer 1 / 2 / 3** | Three people. Each has their own Freighter wallet on their own computer. Each holds one key. | -| **Threshold** | The number of signatures needed to do something. Boundless uses 2-of-3 for normal stuff and 3-of-3 for the most dangerous stuff (changing the fee account, swapping admin). | +| **Threshold** | The number of signatures needed to do something. Boundless uses 2-of-3 for normal stuff and 3-of-3 for the most dangerous stuff (changing the fee account, swapping admin, appointing a release validator). | | **Freighter** | A free browser extension that holds your Stellar wallet keys. Available at [freighter.app](https://freighter.app). | | **Stellar Lab** | A free website at [lab.stellar.org](https://lab.stellar.org) that lets you build, sign, and submit transactions. We use it to sign multi-sig transactions because Freighter can connect to it. | | **Recovery phrase** | 12 random words Freighter shows you once when you first set it up. Whoever has these words can become you. Treat them like a winning lottery ticket. | @@ -156,329 +156,29 @@ Estimated time: 45 minutes on testnet, plus a 1-day cooldown before repeating on A common point of confusion: **the multi-sig is NOT the same account that deploys the contract.** They are two different Stellar accounts with different lifetimes and different security models. -There are two distinct accounts in play: - | Account | Lifetime | Role | Signature model | |---|---|---|---| -| **Deployer (initial-admin key)** | Short. Created right before deploy, destroyed right after rotation. | Pays the deploy fee. Runs `stellar contract deploy`. Becomes admin via the contract's constructor. Then hands admin off to the multi-sig and dies. | Single-sig (just one normal Stellar key). | -| **Multi-sig (the bootstrap account in ยงE.2 below)** | Long. Lives as long as Boundless does. | Never deploys anything. Becomes admin AFTER the deploy, via `set_admin` + `accept_admin`. Holds admin authority from then on. | 2-of-3 (after ยงE.5). | +| **Deployer (initial-admin key)** | Short. Created right before deploy, destroyed right after rotation. | Pays the deploy fee. Deploys both contracts. Becomes admin via the contracts' constructors. Then hands admin off to the multi-sig and dies. | Single-sig (just one normal Stellar key). | +| **Multi-sig (the bootstrap account in ยงE.3 below)** | Long. Lives as long as Boundless does. | Never deploys anything. Becomes admin AFTER the deploy, via `set_admin` + `accept_admin`. Holds admin authority from then on. | 2-of-3 (after ยงE.6). | -The handoff sequence, from `docs/mainnet-deploy-runbook.md` ยง2.7: +The handoff, in order (the commands are in `docs/DEPLOYMENT.md`, Section 4): -```bash -# 1. Founder deploys with the throwaway single-sig deployer key. -stellar contract deploy --source-account boundless-deployer ... - -# 2. Founder rotates admin from deployer to multi-sig. -stellar contract invoke \ - --source-account boundless-deployer \ - --id \ - -- set_admin --new_admin - -# 3. Multi-sig (2-of-3) accepts admin authority. -stellar contract invoke \ - --source-account \ - --id \ - -- accept_admin - -# 4. Founder destroys the deployer key. It is no longer needed. -stellar keys rm boundless-deployer -``` +1. The founder deploys both contracts with the throwaway deployer key. +2. The deployer nominates the multi-sig with `set_admin` on each contract. +3. The multi-sig (two of three signers) accepts with `accept_admin` on each contract. +4. The founder destroys the deployer key. -After step 4, the only thing that can change contract admin settings is the multi-sig. The deployer key does not exist. There is no path back through the old key, and that is the point. +After step 4, the only thing that can change contract admin settings is the multi-sig. There is no path back through the old key, and that is the point. Why this separation matters: - **Deploying with a single-sig key is fast.** Push the wasm, run the constructor, done. Coordinating three signers just to push contract code would be painful and would give an attacker more windows to interpose. -- **The deployer is disposable.** If the deployer key leaks before ยงE.0 step 2, the damage is bounded to a throwaway account that holds no funds. The multi-sig stays clean. -- **The multi-sig is permanent.** It outlives the deployer. It also outlives any individual signer (Part J covers rotation). The deployer dies young; the multi-sig is built to last. - -So when ยงE.2 below tells you to create a bootstrap account, that account is destined to become the multi-sig in ยงE.5. It is not the account you will use to run `stellar contract deploy`. Keep them separate. - -### E.0.B. The complete end-to-end sequence (founder cheat sheet) - -This is the full timeline from a clean slate to a fully-rotated mainnet deploy. Twelve steps. Read it once before you start so you have the whole map, then come back and walk through it in order. - -Steps that are detailed elsewhere in this guide are cross-linked. Steps that come from other docs (`mainnet-deploy-runbook.md`, `multisig-preflight.md`) are flagged. - -#### Step 1. Configure .env.deploy - -The deploy scripts read parameters from `.env.deploy` at the repo root. Copy the template and fill in the values. - -```bash -cd boundless-contract -cp .env.deploy.example .env.deploy -``` - -Open `.env.deploy` in your editor and set: - -| Variable | What it is | -|---|---| -| `ADMIN_IDENTITY` | The name of the Stellar CLI identity that will deploy and hold initial admin authority. Default is `boundless-admin`. This is the throwaway deployer per ยงE.0, NOT the final admin. Rename to `boundless-deployer` if the default name reads as misleading; the scripts only care about the value. | -| `FEE_ACCOUNT` | The G-address that receives platform fees. **Separate account.** Not the deployer, not the multi-sig. Must hold a trustline for every token you register; the contract does not enforce this at registration. | -| `FEE_BPS` | Platform fee in basis points (`100 = 1%`, `250 = 2.5%`). The `.env.deploy.example` template and `deploy.sh` validate the range as `[0, 1000]`, matching the contract's `MAX_FEE_BPS = 1000` (10%) cap per the 2026-06 audit (L4 finding). Values above 1000 are rejected at the script level before any deploy work happens. | - -> Contract versions up to 1.0.0 also required a `BOOTSTRAP_CREDITS` value for the profile constructor. The 1.1.0 credit-removal upgrade (2026-06) moved credits to an off-chain ledger in boundless-nestjs; the profile constructor now takes only `--admin`. - -`.env.deploy` is gitignored. Never commit a populated file. - -#### Step 2. Create the deployer Stellar identity - -The deployer is the throwaway single-sig key per ยงE.0. Generate it under the name you set as `ADMIN_IDENTITY` in `.env.deploy`. - -```bash -stellar keys generate boundless-deployer --network mainnet -stellar keys address boundless-deployer # write this down -``` - -(Use `--network testnet` and the testnet name `boundless-admin` if rehearsing on testnet.) - -The secret stays in the OS keychain. You will not see it. - -#### Step 3. Fund the deployer - -Send about 10 XLM to the deployer address from your treasury. That budget covers: - -- Account reserve (currently 1 XLM). -- Both contract uploads + deploys (Soroban resource fees: typically <1 XLM each). -- One `set_events_contract` wiring call. -- One `register_supported_token` per token. -- Two `set_admin` rotation calls in Steps 9 + 10. -- A small headroom. - -Verify funding: - -```bash -curl -s "https://horizon.stellar.org/accounts/$(stellar keys address boundless-deployer)" | jq '.balances' -``` - -On testnet, friendbot funds it for free: - -```bash -curl "https://friendbot.stellar.org/?addr=$(stellar keys address boundless-admin)" -``` - -#### Step 4. Run the deploy script - -The script `scripts/deploy/deploy.sh` does the whole deploy in one shot: builds both contract wasms via `stellar contract build`, deploys `boundless-profile`, deploys `boundless-events` wired to profile, calls `profile.set_events_contract` to complete the back-wiring, and writes a deployment record at `deployments/.json`. - -```bash -./scripts/deploy/deploy.sh mainnet -``` - -The script: - -- Aborts if `stellar` CLI is older than 26.0.0 (Rust 1.90.0 emits reference-types wasm that earlier CLIs reject at simulation time). -- Aborts if any of `ADMIN_IDENTITY`, `FEE_ACCOUNT`, `FEE_BPS` is unset. -- Aborts if `FEE_BPS` is outside `[0, 1000]` (matches the contract's `MAX_FEE_BPS = 1000` cap per audit L4; see Step 1). -- Prints the profile contract id and events contract id on success. - -Copy both ids into your team notes and into the boundless-nestjs deployment env: - -``` -BOUNDLESS_EVENTS_CONTRACT_ADDRESS= -BOUNDLESS_PROFILE_CONTRACT_ADDRESS= -``` - -Under the hood, the constructor invocations are: - -- `boundless-profile`: `--admin `. -- `boundless-events`: `--admin --fee_account --fee_bps --profile_contract `. -- Wiring call: `profile.set_events_contract --new_addr `. - -You generally do not need to invoke these by hand. The script is the source of truth; if it breaks, fix the script, do not work around it. - -#### Step 5. Register each supported token - -```bash -./scripts/deploy/register_token.sh mainnet -``` - -The script: - -- Reads the events contract id and fee account from `deployments/mainnet.json` (so Step 4 must have succeeded). -- Prompts: `fee account holds an active trustline for this token? [y/N]`. **Do not skip this prompt.** The contract does NOT enforce the trustline at registration; missing it means every deposit will fail at runtime. -- On confirmation, calls `register_supported_token --token ` from the deployer. -- Appends the token to `supported_tokens` in the deployment record. - -To verify the trustline before answering `y`: - -```bash -stellar account get --account "$FEE_ACCOUNT" --network mainnet | jq '.balances' -``` - -The asset code + issuer must appear in `balances[]`. If they do not, build a Change Trust operation on the fee account in Stellar Lab first, then re-run the script. - -Repeat for each token you support (USDC mandatory, native XLM SAC if you accept XLM). - -#### Step 6. Verify on-chain state - -```bash -./scripts/deploy/verify.sh mainnet -``` - -The script reads `deployments/mainnet.json` and queries each contract for its full admin-visible state: - -- **Events:** `get_admin`, `get_fee_account`, `get_fee_bps`, `get_profile_contract`, `is_paused`. -- **Profile:** `get_admin`, `get_events_contract`, `is_paused`. - -Expected output at this point: - -- Both `admin` fields return the **deployer address** (rotation has not happened yet). -- `events.fee_account` matches `.env.deploy`. -- `events.fee_bps` matches `.env.deploy`. -- `events.profile_contract` matches the profile id. -- `profile.events_contract` matches the events id. -- Both `is_paused` return `false`. - -If anything is wrong, fix it now. The deployer still has single-sig admin authority through Step 8; from Step 9 onward every fix needs two signatures. - -#### Step 7. (Optional) Smoke from boundless-nestjs - -For extra confidence before the rotation, run the contract smoke battery from boundless-nestjs against the live mainnet deploy: - -```bash -cd ../boundless-nestjs -BOUNDLESS_EVENTS_CONTRACT_ADDRESS= \ -BOUNDLESS_PROFILE_CONTRACT_ADDRESS= \ -STELLAR_NETWORK_PASSPHRASE="Public Global Stellar Network ; September 2015" \ -SMOKE_OWNER_ADDRESS=$(stellar keys address boundless-deployer) \ -SMOKE_TOKEN= \ -npx ts-node -r tsconfig-paths/register scripts/smoke/escrow-contract.ts -``` - -The read-path + build-path + drift checks should all pass. Any failure here means the off-chain orchestrator does not agree with the freshly-deployed contract; do NOT rotate admin until that is resolved. - -#### Step 8. Build the multi-sig (Parts E.1 through E.8) - -This is the middle of the timeline. Walk through: - -- ยงE.1: Decide the three signers (founder + internal employee + external trusted person). -- Have each signer run Part D to set up Freighter and send you their G-address. -- ยงE.2: Generate the bootstrap account (`boundless-multisig-bootstrap`). -- ยงE.3: Fund it with ~5 XLM. -- ยงE.4: Add the three signer addresses (one `set-options` tx each). -- ยงE.5: Set thresholds 0/2/2 AND `--master-weight 0` in a single tx. -- ยงE.6: Run `verify-multisig.sh`. Must print `PASS: all 6 checks passed`. -- ยงE.7: Tell the signers it is ready. -- ยงE.8: 1-day cooldown on mainnet so any mistake surfaces before the rotation. - -At the end of Step 8 you have a working multi-sig that is NOT yet recognized by the contract. - -#### Step 9. Rotate admin on the events contract - -This is the moment the multi-sig becomes real. Two transactions: - -```bash -# 9.a. From the deployer (single-sig): hand admin to the multi-sig. -EVENTS_ID=$(jq -r '.events_contract' deployments/mainnet.json) -stellar contract invoke \ - --source-account boundless-deployer \ - --id "$EVENTS_ID" \ - --network mainnet \ - -- \ - set_admin \ - --new_admin - -# 9.b. From the multi-sig (needs 2-of-3 signatures): accept admin. -# Build per ยงF.0.B, get the Lab signing link, collect two signatures, -# then submit per ยงF.0.C. -stellar contract invoke \ - --source-account \ - --id "$EVENTS_ID" \ - --network mainnet \ - --build-only \ - -- \ - accept_admin -``` - -Step 9.b is the first time the multi-sig signs anything on mainnet. Treat it like a drill: clear comms in `#ops-admin-requests`, both signers verify the Lab tx matches `accept_admin` against the events contract id, two signatures collected, then submit. - -**Verification:** `./scripts/deploy/verify.sh mainnet` now shows `events.admin` = multi-sig address (profile.admin still = deployer until Step 10). - -#### Step 10. Rotate admin on the profile contract - -Repeat Step 9 against the profile contract. - -```bash -PROFILE_ID=$(jq -r '.profile_contract' deployments/mainnet.json) -stellar contract invoke \ - --source-account boundless-deployer \ - --id "$PROFILE_ID" \ - --network mainnet \ - -- \ - set_admin \ - --new_admin - -# Then multi-sig accept_admin per ยงF.0.B. -stellar contract invoke \ - --source-account \ - --id "$PROFILE_ID" \ - --network mainnet \ - --build-only \ - -- \ - accept_admin -``` - -**Verification:** `./scripts/deploy/verify.sh mainnet` now shows BOTH contracts' `admin` = multi-sig address. - -#### Step 11. Final verification + proof-of-life - -Re-run both verification scripts. Both must pass cleanly. - -```bash -./scripts/admin/verify-multisig.sh mainnet -./scripts/deploy/verify.sh mainnet -``` - -- `verify-multisig.sh` must still print `PASS: all 6 checks passed`. Rotation should not have touched the multi-sig itself. -- `verify.sh` must show both `events.admin` and `profile.admin` as the multi-sig address. - -Then do one real admin op end to end to prove the multi-sig signing path works in production. The lowest-risk option is a no-op `set_fee_bps --new_bps ` (e.g., re-set to whatever `events.fee_bps` already reads). It changes nothing but exercises the full multi-sig build + sign + submit flow against the live contract. - -Record in team notes: - -- The events `set_admin` tx hash and `accept_admin` tx hash. -- The profile `set_admin` tx hash and `accept_admin` tx hash. -- The proof-of-life multi-sig tx hash. -- The output of `verify-multisig.sh`. -- The output of `verify.sh`. - -This is your evidence the rotation happened cleanly. - -#### Step 12. Destroy the deployer + close out BACKLOG - -Once Step 11 is fully green: - -```bash -stellar keys rm boundless-deployer -``` - -The deployer secret is gone from your OS keychain. The remaining XLM balance on the deployer account is stranded (you can sweep it to the treasury before this step if you want; the gas headroom is small enough that abandoning it is also fine). - -Update `BACKLOG.md`: +- **The deployer is disposable.** If the deployer key leaks before step 2, the damage is bounded to a throwaway account that holds no funds. The multi-sig stays clean. +- **The multi-sig is permanent.** It outlives the deployer and any individual signer (Part J covers losing one). -- Move `Mainnet admin multi-sig provisioned per docs/admin-custody-policy.md (3 signers, 2-of-3).` from open to Done. Link the four rotation tx hashes + the `verify-multisig` + `verify.sh` outputs. -- If a `Destroy deployer key after mainnet rotation` entry exists, mark it Done with the date. +So when ยงE.3 below tells you to create a bootstrap account, that account is destined to become the multi-sig in ยงE.6. It is not the account you use to deploy. Keep them separate. -After Step 12, the contracts are live, the multi-sig is admin on both, and there is no single-sig back door anywhere. From this point on every admin op runs through Parts F and G of this guide. - -#### Recap of the whole sequence - -1. Configure `.env.deploy` (ADMIN_IDENTITY, FEE_ACCOUNT, FEE_BPS). -2. Generate the deployer identity (`stellar keys generate boundless-deployer`). -3. Fund the deployer (~10 XLM). -4. Run `./scripts/deploy/deploy.sh mainnet` (builds + deploys both contracts + wires `set_events_contract` + writes `deployments/mainnet.json`). -5. Run `./scripts/deploy/register_token.sh mainnet ` per supported token (confirm fee-account trustline at the prompt). -6. Run `./scripts/deploy/verify.sh mainnet` to confirm on-chain state matches the deployment record. -7. (Optional) Smoke from boundless-nestjs against the deployed contracts. -8. Build the multi-sig (ยงE.1 through ยงE.8). -9. Rotate events admin to multi-sig (`set_admin` from deployer + `accept_admin` from multi-sig). -10. Rotate profile admin to multi-sig (same two transactions on profile). -11. Re-run both verifiers + do one proof-of-life multi-sig op. Record all hashes. -12. `stellar keys rm boundless-deployer` + close out `BACKLOG.md`. - -Estimated wall time for a confident operator: half a day on testnet, a full day on mainnet (mostly the ยงE.8 cooldown + waiting for signers to arrive in the channel). +The whole sequence, start to finish: build the multi-sig (ยงE.1 to ยงE.10 below), deploy and verify with the deployer (`docs/DEPLOYMENT.md` 4.2 to 4.5), rotate admin to the multi-sig and prove it with one no-op admin operation (`docs/DEPLOYMENT.md` 4.5), destroy the deployer key (4.6), then close out (ยงE.11). ### E.1. Decide who the three signers are @@ -508,13 +208,34 @@ What NOT to do: Once you pick the three, each of them walks through Part D of this guide to set up Freighter and send you their G-address. From here on we assume all three G-addresses are in hand. -### E.2. Create the bootstrap Stellar account +### E.2. Pre-conditions and key generation + +Before anyone generates a key: + +- [ ] The founder and every signer have re-read `admin-custody-policy.md` in the past 30 days. +- [ ] The three signers are identified by name and role (founder, internal, external) and recorded in the founder's notes. +- [ ] The founder has personally confirmed each signer is reachable on a backup channel that is not the one used to enroll them. +- [ ] A path is chosen: software (the launch baseline) or hardware (the target state). The trade-offs are in `admin-custody-policy.md` ยง3-bis. + +**Software path (launch baseline).** Each signer completes Part D on their own machine. Part D covers every hygiene requirement in policy ยง3-bis: dedicated browser profile, Freighter only, full disk encryption, a unique passphrase, a paper-only recovery phrase, reading the address back in two places, and one signed test transaction. Different people, different machines, and if you can manage it different operating systems: the 2-of-3 is only as strong as the independence of the three machines. + +**Hardware path (target state).** For each signer, on their own machine with the device present: + +- [ ] Generate a new ed25519 keypair on the Yubikey or equivalent; the secret never leaves the device. +- [ ] Read the public address back from the device twice, in two different tools, and confirm they match. +- [ ] Sign a testnet transaction using only the device. +- [ ] Back up per policy ยง3 (a 2-of-3 Shamir split in three physically separate places). +- [ ] Send the public address to the founder over an authenticated channel. + +Either way, the founder ends up with three G-addresses, each tied to a secret only its signer can reach. -The "bootstrap" account is a regular Stellar account that will turn into the multi-sig. We create it with one normal key, fund it, configure it, and then disable that original key. After ยงE.5 it can only act when two of the three signers agree. +### E.3. Create the bootstrap Stellar account + +The "bootstrap" account is a regular Stellar account that will turn into the multi-sig. We create it with one normal key, fund it, configure it, and then disable that original key. After ยงE.6 it can only act when two of the three signers agree. You will need: -- Stellar CLI version 23.x or newer installed (run `stellar --version` to check). +- Stellar CLI 28.1.0 installed (run `stellar --version` to check). - A clean machine you trust (your own laptop with disk encryption on, not a shared workstation). - Internet access. @@ -532,13 +253,13 @@ Print the public address so you can see what was generated: stellar keys address boundless-multisig-bootstrap ``` -You will get back a G-address such as `GAVSIZQZFWUOFMCTDEBY43DBE5GV4RJRW423QQE5QIITLUTVNF34GY4J`. Write this down. After ยงE.5 this is the address the Boundless contract will recognize as admin. +You will get back a G-address such as `GAVSIZQZFWUOFMCTDEBY43DBE5GV4RJRW423QQE5QIITLUTVNF34GY4J`. Write this down. After ยงE.6 this is the address the Boundless contract will recognize as admin. -### E.3. Fund the bootstrap account +### E.4. Fund the bootstrap account A Stellar account does not exist on the network until it has the minimum balance (currently 1 XLM plus 0.5 XLM per data entry such as a signer or trustline). Fund it before you try to configure it, or the configuration transactions will fail with `account_not_found`. -**Testnet:** use friendbot. Replace `
` with the address you printed in ยงE.2. +**Testnet:** use friendbot. Replace `
` with the address you printed in ยงE.3. ```bash curl "https://friendbot.stellar.org/?addr=
" @@ -548,11 +269,11 @@ You should get back a JSON payload. The bootstrap will now have 10,000 testnet X **Mainnet:** send at least 5 XLM to the bootstrap address from the founder's existing mainnet Stellar account (your treasury or your personal wallet). 5 XLM covers the minimum reserve plus headroom for four signer entries (master + three) and a small fee budget for the setup transactions. -### E.4. Add the three signer addresses +### E.5. Add the three signer addresses -Each signer is added in a separate `set-options` transaction. Each transaction is signed automatically by the bootstrap's master key (which still has weight 1 at this point; the CLI handles the signing using the secret it stored in ยงE.2). You will not see a sign prompt. +Each signer is added in a separate `set-options` transaction. Each transaction is signed automatically by the bootstrap's master key (which still has weight 1 at this point; the CLI handles the signing using the secret it stored in ยงE.3). You will not see a sign prompt. -Adapt `--network` and `--network-passphrase` if you are on mainnet (use `mainnet` and `"Public Global Stellar Network ; September 2015"`). +Use `--network testnet` while practicing and your named mainnet network for real (`docs/DEPLOYMENT.md` 4.2). Pass only `--network`; adding `--network-passphrase` as well breaks RPC resolution. ```bash # Signer 1: the founder's Freighter address @@ -560,38 +281,35 @@ stellar tx new set-options \ --source-account boundless-multisig-bootstrap \ --signer GDSBURJQPMB7HW7TYN3AL2RSISUHIJIWBWSEM2UQFZJFAP7FX2SU2A4K \ --signer-weight 1 \ - --network testnet \ - --network-passphrase "Test SDF Network ; September 2015" + --network testnet # Signer 2: the internal employee's Freighter address stellar tx new set-options \ --source-account boundless-multisig-bootstrap \ --signer GB6ZG4GIPF2YVYPVC4YKLADM2DT73UMV7TR5IERI3YJJOV4NEHLWTWE5 \ --signer-weight 1 \ - --network testnet \ - --network-passphrase "Test SDF Network ; September 2015" + --network testnet # Signer 3: the external trusted person's Freighter address stellar tx new set-options \ --source-account boundless-multisig-bootstrap \ --signer GCHITNTBTYD6P76GLPGVUXVDFPPF6EAXZ23QEUXVSFFLV3IQDPIRQRQN \ --signer-weight 1 \ - --network testnet \ - --network-passphrase "Test SDF Network ; September 2015" + --network testnet ``` What each flag does: -- `--source-account boundless-multisig-bootstrap`: tells the CLI to use the keystore alias from ยงE.2 as both the transaction source AND the signer. The CLI loads the secret from your OS keychain, signs the tx, and submits it. You never see the secret. +- `--source-account boundless-multisig-bootstrap`: tells the CLI to use the keystore alias from ยงE.3 as both the transaction source AND the signer. The CLI loads the secret from your OS keychain, signs the tx, and submits it. You never see the secret. - `--signer `: the public address of the person we are adding. Copy this from the message that signer sent you. **Triple-check this string.** A single wrong character means the multi-sig adds the wrong person and that signer's real address is silently excluded. - `--signer-weight 1`: their signing weight. Weight 1 means each signer counts as one vote. Weight 0 would remove the signer; weights above 1 would give that signer disproportionate power. -- `--network` and `--network-passphrase`: which Stellar network to use. Keep these consistent across all three calls or you will end up with signers on one network and configuration on another. +- `--network`: which Stellar network to use. Keep it the same across all three calls or you will end up with signers on one network and configuration on another. After all three calls succeed, the bootstrap account has four signers total: the original master key (weight 1) plus the three new G-addresses (weight 1 each). The thresholds are still 0/0/0 at this point, so any one of those four keys can authorize anything. The multi-sig is not yet locked. We fix that in the next step. -### E.5. Set the thresholds AND disable the master key +### E.6. Set the thresholds AND disable the master key -This is the step that turns the account into a real multi-sig. It is the most important transaction in the whole setup; if you skip the `--master-weight 0` part, the multi-sig is defeated because the original bootstrap key can still sign solo. (This is the trap call-out in `docs/multisig-preflight.md` ยง2.) +This is the step that turns the account into a real multi-sig. It is the most important transaction in the whole setup; if you skip the `--master-weight 0` part, the multi-sig is defeated because the original bootstrap key can still sign solo. An attacker who steals that one seed could then sign alone. Do it all in a single transaction: @@ -602,70 +320,96 @@ stellar tx new set-options \ --med-threshold 2 \ --high-threshold 2 \ --master-weight 0 \ - --network testnet \ - --network-passphrase "Test SDF Network ; September 2015" + --network testnet ``` What each flag means in plain English: - `--low-threshold 0`: read-only operations (such as `bump_sequence`) need no signatures. There is nothing sensitive at this tier. - `--med-threshold 2`: normal operations (`set_fee_bps`, `pause`, `unpause`, contract upgrades) need two signatures from the three signers. -- `--high-threshold 2`: dangerous operations (`set_fee_account`, `set_admin`, adding or removing signers) need two signatures by Stellar's account model. The Boundless policy in `admin-custody-policy.md` ยง4 requires three-of-three for these operations in practice. The three-of-three rule is enforced by the founder requesting all three signatures in Slack, not by the threshold itself. -- `--master-weight 0`: the original bootstrap key (the one you generated in ยงE.2) can no longer sign. From this moment on, the only way to do anything with this account is to collect two signatures from the three signers added in ยงE.4. +- `--high-threshold 2`: dangerous operations (`set_fee_account`, `set_admin`, `propose_release_validator`, adding or removing signers) need two signatures by Stellar's account model. The Boundless policy in `admin-custody-policy.md` ยง4 requires three-of-three for the first three in practice. That rule is enforced by the founder requesting all three signatures, not by the threshold itself. +- `--master-weight 0`: the original bootstrap key (the one you generated in ยงE.3) can no longer sign. From this moment on, the only way to do anything with this account is to collect two signatures from the three signers added in ยงE.5. After this transaction lands, the bootstrap secret in the CLI keystore is useless. Keep it as evidence but understand it is now a dead key. If you lose it, that is fine. If someone steals it, that is also fine. There is nothing it can do alone. -### E.6. Verify with the script +### E.7. Verify with the script -Run the verification script. It is the safety net that catches any mistake you made above. +Run the verification script. It is the safety net that catches any mistake you made above. Pin the roster you collected so it also fails on any signer you did not expect: ```bash -./scripts/admin/verify-multisig.sh testnet -``` - -It must print exactly: - -``` -PASS: all 6 checks passed +EXPECTED_SIGNERS=,, ./scripts/admin/verify-multisig.sh testnet ``` -The 6 checks are: +It must end with `PASS: all 9 checks passed` (8 without `EXPECTED_SIGNERS`). The checks are: 1. Master key weight = 0. 2. Low threshold = 0. 3. Medium threshold = 2. 4. High threshold = 2. -5. Exactly 3 non-master signers. +5. Exactly 3 signers with non-zero weight. 6. Each signer has weight 1. +7. No pre-auth transaction, hash-x or signed-payload signers (they would count toward the quorum without a person behind them). +8. Every signer is a distinct G-address, not the multi-sig itself. +9. With `EXPECTED_SIGNERS` set, the signer set is exactly that roster. -Below that, the script prints the three signer addresses it found. **Read them.** Confirm by eye that each one matches one of the three G-addresses the signers sent you. A typo in ยงE.4 means the multi-sig is configured but with the wrong people in it, and you only discover that when you try to use it for real. +Below that, the script prints the three signer addresses it found. **Read them.** Confirm by eye that each one matches one of the three G-addresses the signers sent you. If verification fails: - Re-read which check failed. - If you have NOT yet flipped `--master-weight 0`, you can fix things with another `set-options` transaction from the bootstrap. For example, if you typoed Signer 2's address, run `set-options --signer --signer-weight 0` to remove the wrong entry, then `set-options --signer --signer-weight 1` to add the right one. -- If you HAVE already flipped `--master-weight 0` and the multi-sig is broken, you cannot fix it with the bootstrap. You start over from ยงE.2 with a fresh bootstrap account. The old one is abandoned; the small XLM balance is the cost of the mistake. +- If you HAVE already flipped `--master-weight 0` and the multi-sig is broken, you cannot fix it with the bootstrap. You start over from ยงE.3 with a fresh bootstrap account. The old one is abandoned; the small XLM balance is the cost of the mistake. + +Do NOT move on with a failing `verify-multisig`. Run it again with `mainnet` against the production multi-sig before the rotation; `./deploy_mainnet.sh rotate-admin` runs it for you and stops if it fails. + +### E.8. Fee account trustlines + +The fee account receives the platform fee inside every `create_event` and `add_funds` call and every crowdfunding release. If it lacks an authorized trustline for a supported token, every one of those calls in that token reverts. Check before registering a token and before rotating the fee account: + +```bash +# register_token.sh and deploy_mainnet.sh register-token run this themselves +# and refuse to sign if it fails. +./scripts/admin/verify-fee-trustline.sh mainnet + +# Before set_fee_account: run it against the NEW account once per registered +# token, and do not sign until each passes. +./scripts/admin/verify-fee-trustline.sh mainnet USDC: +``` -Do NOT move on with a failing `verify-multisig`. +`FeeAccountUpdated` and `TokenRegistered` alert the team when they land (backend monitoring). -### E.7. Tell the signers it is ready +### E.9. Tell the signers it is ready -Share the multi-sig public address (the bootstrap address from ยงE.2) with all three signers via the agreed trusted channel (Signal, secure video, or in person, NOT email and NOT public Slack). Each signer should: +Share the multi-sig public address (the bootstrap address from ยงE.3) with all three signers via the agreed trusted channel (Signal, secure video, or in person, NOT email and NOT public Slack). Each signer should: - Record the address in their local notes. - Add it as a "Watch-only" account in their Freighter so they can see whenever a transaction touches it. - Acknowledge receipt back to you so you have written confirmation each signer got it. -### E.8. The 1-day cooldown (mainnet only) +### E.10. Testnet drill and the 1-day cooldown (mainnet only) + +Before mainnet, run the same multi-sig against a throwaway testnet contract (`docs/contract-ops-runbook.md`, Section 4): + +- [ ] A 2-of-3 signature on a routine operation, such as `set_fee_bps`. +- [ ] A 3-of-3 signature on a high-bar operation, such as `set_fee_account`. +- [ ] A 1-of-3 attempt on either, which must fail. +- [ ] The drill and its transaction hashes written up in the team's notes. -Wait 24 hours before doing anything important with the new multi-sig on mainnet. During this window: +Then wait 24 hours before doing anything important with the new multi-sig on mainnet. During this window: -- Re-run the testnet drill (Part H) with all three signers. -- Have each signer practice signing one throwaway transaction on testnet, end to end. +- Have each signer practice signing one throwaway transaction on testnet, end to end (Part H). - Verify each signer can reach you on the backup channel within 1 hour. This cooldown catches "Signer 3 forgot their Freighter passphrase" and "Signer 2's recovery phrase is at the wrong house this week." Better to find out before the multi-sig is live as Boundless admin. +### E.11. After the rotation + +Once `docs/DEPLOYMENT.md` 4.5 and 4.6 are done: + +- Re-run `verify-multisig.sh` with `mainnet`; the rotation must not have changed the multi-sig itself. +- Record the two `set_admin` and two `accept_admin` transaction hashes, the proof-of-life transaction, and the output of both verifiers in the team's notes. +- Add a Done line to `BACKLOG.md` with those hashes. + --- ## Part F. Part 3: How to sign a real transaction (day-to-day signer task) @@ -684,7 +428,7 @@ There are two shapes of admin transaction. You need to know which shape applies **Shape 1: Stellar native operations.** Anything that changes the multi-sig account itself: adding or removing a signer, changing thresholds, paying out XLM, setting up a trustline. These are built directly in Stellar Lab. -**Shape 2: Soroban contract operations.** Anything that calls into the Boundless contract: `set_fee_bps`, `pause`, `unpause`, `propose_upgrade`, `apply_upgrade`, `set_admin`, `accept_admin`, `register_supported_token`, `cancel_pending_upgrade`, `migrate`. These are built via the Stellar CLI (or an admin script), then loaded into Stellar Lab for the signers. +**Shape 2: Soroban contract operations.** Anything that calls into a Boundless contract: `set_fee_bps`, `pause`, `unpause`, `propose_upgrade`, `apply_upgrade`, `migrate_events`, `migrate`, `set_admin`, `accept_admin`, `register_supported_token`, `propose_release_validator`, `cancel_pending_upgrade`. These are built and simulated with the Stellar CLI (or `deploy_mainnet.sh`), then loaded into Stellar Lab for the signers. #### F.0.A. Building a native op (Shape 1) in Stellar Lab @@ -692,7 +436,7 @@ Example use case: rotating Signer 2 because their laptop was stolen. 1. Open [lab.stellar.org](https://lab.stellar.org). Switch the network in the top-right corner to "Test Net" or "Public Net" depending on where you are. 2. Click "Build Transaction" in the left nav. -3. Set **Source Account** to the multi-sig G-address (the bootstrap address from ยงE.2). +3. Set **Source Account** to the multi-sig G-address (the bootstrap address from ยงE.3). 4. Click **Fetch Next Sequence Number** next to the Sequence field. Lab pulls the current sequence from Horizon and fills it in. 5. Set **Base Fee** to `1000` (which is 0.0001 XLM). Bump it higher if the network is congested. 6. Click **Add Operation** and pick **Set Options** from the drop-down. Fill in only the fields you want to change: @@ -706,40 +450,13 @@ Example use case: rotating Signer 2 because their laptop was stolen. That is the entire founder side for a Shape 1 op. The signers then walk through ยงF.2 to sign and you submit at the end. -#### F.0.B. Building a contract op (Shape 2) via Stellar CLI +#### F.0.B. Building a contract op (Shape 2) Example use case: changing the platform fee from 1.5% to 1.7%. -Soroban contract operations are more complex than native ops because the contract requires `admin.require_auth()`. That auth has to be packaged inside the transaction's Soroban authorization entries, not just the outer Stellar signature. The Stellar CLI handles most of this for you. - -```bash -stellar contract invoke \ - --network testnet \ - --source-account boundless-ops-builder \ - --id \ - --build-only \ - -- \ - set_fee_bps \ - --new_bps 170 -``` - -What the flags mean: - -- `--source-account boundless-ops-builder`: any funded Stellar account on the network. Used to simulate and pay the network fee. It does NOT need to be the admin. Use a low-balance throwaway "builder" account, not the multi-sig. -- `--id `: the boundless-events contract address on the network. Get this from `BACKLOG.md` (testnet) or the deploy notes (mainnet). -- `--build-only`: tells the CLI to print the unsigned XDR instead of trying to sign and submit. Without this, the CLI would try to send the tx with just the builder's signature, which the contract would reject because the builder is not admin. -- After the `--` separator: the contract function name (`set_fee_bps`) and its arguments. `170` is the new fee in basis points; 170 bps = 1.7%. - -The CLI prints an XDR string. That is your unsigned transaction with Soroban auth placeholders. +Contract operations are never assembled by hand in Lab. The founder builds them with the Stellar CLI with the multi-sig as the source and runs them through `stellar tx simulate`, which attaches the contract's authorization and resource data; an unsimulated transaction is rejected. `docs/contract-ops-runbook.md` Section 5 has the exact commands, and for upgrades and pausing `./deploy_mainnet.sh prepare-*` does it and checks the contract's state first (`docs/upgrade-runbook.md`). -You now need two things: - -1. **Replace the source account** from `boundless-ops-builder` to the multi-sig, because the contract checks the admin via auth, but Lab and Horizon also expect a coherent source. The cleanest way: paste the XDR into Stellar Lab's **View XDR** tab, change the Source Account field to the multi-sig address, click **Save** โ†’ Lab re-encodes it. -2. **Re-simulate** so the Soroban resource fee and footprint match the new source. Lab does this for you when you click **Sign Transaction**. - -Then copy the Lab signing URL and post it to the signers. - -For ops that are tricky to hand-assemble (any `propose_upgrade`, `apply_upgrade`, or `migrate`), there are helper scripts in `boundless-nestjs/scripts/admin/` that produce the correct XDR directly. Use those if they exist for your op; they handle the source-account swap and Soroban auth packaging for you. If a helper does not exist yet for the op you need, write one before you do this manually on mainnet. +The founder then opens Lab's **Sign Transaction** view, pastes the prepared XDR, and shares that link with the signers. #### F.0.C. Posting the request to signers @@ -756,9 +473,8 @@ Then tag the signers you need. For a 2-sig op, tag two of the three (rotate whic Wait for the signed XDRs to come back in the thread. Once you have a quorum: -1. Paste the final fully-signed XDR into Stellar Lab's **Submit Transaction** tab. -2. Click **Submit**. Lab posts it to Horizon. -3. The tx hash comes back. Paste the hash in the Slack thread to confirm: `Landed: `. +1. Submit the final fully-signed XDR from the CLI: `stellar tx send "" --network `. The CLI prints the exact error if it fails; Lab's Submit can look successful when nothing landed. +2. Paste the hash in the Slack thread to confirm: `Landed: `. That closes the loop for everyone watching. @@ -792,7 +508,7 @@ When you click the link, Lab opens with the transaction already loaded. It shows A second signer does the same thing: clicks the Lab link the founder posts (or the updated XDR from step F.2), reviews the transaction, signs with their Freighter, posts the result back. -Once two signatures are on the transaction, the founder (or anyone with the final XDR) clicks "Submit" in Lab. Lab sends it to Stellar. A few seconds later it lands on chain. Done. +Once two signatures are on the transaction, the founder submits it with `stellar tx send`. A few seconds later it lands on chain. Done. ### F.4. What to refuse to sign @@ -854,25 +570,27 @@ After the drill, the founder logs it in the team's notes with the testnet transa ## Part I. What this multi-sig is allowed to do -The Boundless contract limits even the admin. Knowing what the admin can and cannot do helps you sanity-check requests. +The Boundless contracts limit even the admin. Knowing what the admin can and cannot do helps you sanity-check requests. -The admin **can:** +On the events contract the admin **can:** - Change the default fee rate (`set_fee_bps`). - Change the fee account address (`set_fee_account`). This one needs all three signatures. -- Pause the contract in an emergency (`pause`). -- Resume after a fix (`unpause`). -- Propose a contract upgrade (`propose_upgrade`). The upgrade does not apply for at least one day after the proposal, so customers can react. -- Apply a proposed upgrade after the timelock (`apply_upgrade`). -- Cancel a queued upgrade (`cancel_pending_upgrade`). -- Run the post-upgrade migration (`migrate`). -- Add or remove tokens from the whitelist. -- Rotate the admin itself (`set_admin` and `accept_admin`). Needs all three signatures. +- Pause the contract in an emergency (`pause`) and resume after a fix (`unpause`). +- Propose a contract upgrade (`propose_upgrade`). On current mainnet builds the upgrade cannot apply until about a day (17,280 ledgers) after the proposal, so users can see it coming. The deployed events 1.7.0 and profile 1.2.0 builds have no such wait; the 2.0.0 upgrade restores it. +- Apply a proposed upgrade after that wait (`apply_upgrade`), or cancel it (`cancel_pending_upgrade`). +- Run the post-upgrade migration (`migrate_events`, then `migrate`). +- Add or remove tokens from the whitelist (`register_supported_token`, `deregister_supported_token`). +- Rotate the admin itself (`set_admin`, then `accept_admin` from the new admin). Needs all three signatures. +- Appoint a crowdfunding release validator (`propose_release_validator`, all three signatures), withdraw the proposal, or remove the validator at once (`clear_release_validator`). The validator key accepts the appointment with its own signature, never the multi-sig's. While no validator is appointed, the multi-sig co-signs crowdfunding milestone releases itself. +- Point events at a different profile contract (`set_profile_contract`). + +On the profile contract the admin **can** pause, unpause and upgrade it the same way, rotate its admin, move its binding to a new events contract through a timelocked two-step (`propose_events_contract`, then `accept_events_contract` about a day later), and lower a user's reputation with a recorded reason (`admin_slash_reputation`). The admin **cannot:** -- Take funds out of escrow. Escrow is paid only by the contract's own rules (winners, milestones, refunds). The admin has no withdrawal authority. -- Override an event's winner. Winners are set by `select_winners` and are subject to the contract's checks. +- Take funds out of escrow. Escrow is paid only by the contract's own rules (winners, milestones, refunds). The admin has no withdrawal authority, and a release validator only decides when a crowdfunding release happens, never where the money goes. +- Override an event's winner. Winners are set by the event's owner or manager through `select_winners`, subject to the contract's checks. - Reverse a settled transaction. Once a payment lands, it lands. If anyone tells you to "let me sign one thing to drain the escrow," that request is impossible. The contract will reject it. Refuse anyway and call the founder. @@ -954,11 +672,12 @@ Things that defeat the multi-sig: | **Admin** | The role the contract recognizes as allowed to change settings. The Boundless admin is the multi-sig account. | | **Boundless** | The platform you work for. Runs bounties, hackathons, grants, and crowdfunding on Stellar. | | **Contract** | The on-chain code that runs Boundless. There are two: `events` and `profile`. | +| **Release validator** | A key outside the multi-sig that the admin can appoint to co-sign crowdfunding milestone releases. It cannot move money anywhere else. | | **Drill** | A practice run of the multi-sig procedure on testnet. We do it once before mainnet and every quarter after. | | **Escrow** | Money held by the contract on behalf of an event, waiting to be paid to winners or refunded to contributors. | | **Founder** | Collins. The current operator of the multi-sig and the main contact for any signing question. | | **Friendbot** | A free Stellar service that hands out testnet XLM. We use it to fund testnet wallets. | -| **High threshold** | The signature count needed for the most dangerous ops (`set_fee_account`, `set_admin`). Set to 2 by default for Boundless but the policy requires 3 of 3 in practice for those operations. | +| **High threshold** | The signature count needed for the most dangerous ops (`set_fee_account`, `set_admin`, `propose_release_validator`). Set to 2 by default for Boundless but the policy requires 3 of 3 in practice for those operations. | | **Lab (Stellar Lab)** | A free website that lets us build and sign transactions. The tool we use for multi-sig signing. | | **Low threshold** | The signature count for read-only ops. Set to 0 because no important op uses the low threshold. | | **Medium threshold** | The signature count for normal ops (`set_fee_bps`, `pause`, `unpause`, upgrades). Set to 2. This is the workhorse setting. | @@ -981,8 +700,9 @@ Things that defeat the multi-sig: ## Where to look next - `docs/admin-custody-policy.md`: the formal policy. Read it once. -- `docs/multisig-preflight.md`: the technical checklist for setting up a new multi-sig. Founder uses this for setup. -- `docs/mainnet-deploy-runbook.md`: the procedure for deploying Boundless contracts and pointing them at the multi-sig. +- `docs/DEPLOYMENT.md`: deploying the contracts and handing admin to the multi-sig. +- `docs/contract-ops-runbook.md`: how every admin transaction is built, simulated, signed and submitted. +- `docs/upgrade-runbook.md`: contract upgrades, pause and unpause. - `scripts/admin/verify-multisig.sh`: the script that confirms a multi-sig is correctly configured. If anything in this guide is unclear, ask the founder to update it. The whole point of writing it down is so the next person does not have to figure it out from scratch. diff --git a/docs/multisig-preflight.md b/docs/multisig-preflight.md deleted file mode 100644 index 3372b7b..0000000 --- a/docs/multisig-preflight.md +++ /dev/null @@ -1,131 +0,0 @@ -# Multi-sig provisioning pre-flight - -**For:** the founder + the multi-sig signers. -**Gate for:** the mainnet admin rotation in `mainnet-deploy-runbook.md` ยง2.7. - -Work this checklist top-to-bottom **before** running `set_admin` on a mainnet contract. Every item is either done by a human signer out of band or verified by `./scripts/admin/verify-multisig.sh`. - -The policy this enforces lives in `admin-custody-policy.md`. If the two ever disagree, the policy wins; update this checklist to match. - ---- - -## 0. Pre-conditions (both paths) - -- [ ] `admin-custody-policy.md` re-read by the founder + every signer in the past 30 days. -- [ ] Three signers identified by name + role (founder primary, lead engineer, trusted third) and recorded in the founder's notes. -- [ ] **Choose a path:** - - **Hardware path (target state):** Three Yubikeys (or equivalent hardware-isolated devices) procured, one per signer. Use Section 1.A below. - - **Software path (launch baseline):** Three different machines, three different signers, three Freighter installs. Use Section 1.B below. Requires acknowledging the trade-offs in `admin-custody-policy.md` ยง3-bis. -- [ ] Each signer has Stellar CLI 23.x or newer installed and (for the hardware path) a hardware-signing tool that speaks Stellar (e.g. `stellar` CLI's Ledger integration, the Stellar Lab hardware-wallet tab, or LOBSTR Vault). -- [ ] Founder has personally verified each signer is reachable on a backup channel that is NOT the same one the original signer enrollment used. - -## 1.A Key generation โ€” hardware path (target state) - -For each of the three signers, the signer performs the following on their own machine, with the Yubikey/hardware device present: - -- [ ] **Generate** a new ed25519 keypair on the Yubikey (the secret never leaves the device). -- [ ] **Read** the resulting public address back from the device twice in two distinct ways (CLI + GUI tool) and confirm they match. -- [ ] **Sign** a Stellar tx on testnet using only the Yubikey to prove the workflow works. -- [ ] **Backup**: 2-of-3 Shamir's Secret Sharing split, shares placed in three physically distinct locations (per policy ยง3). -- [ ] **Write** the public address to the founder's collection channel, signed via the founder's PGP key or equivalent out-of-band auth. - -Outcome: the founder has three new G-addresses, each tied to a hardware-isolated secret that only the matching signer can reach. - -## 1.B Key generation โ€” software path (launch baseline) - -For each of the three signers, in isolation. Read `admin-custody-policy.md` ยง3-bis first; the hygiene requirements there are NOT optional. - -- [ ] **Dedicated browser profile** created (Chrome / Firefox / Brave โ€” pick one, dedicate it). No other browser extensions installed in that profile. -- [ ] **Freighter installed** in that profile; no other Stellar wallet active. -- [ ] **OS-level full disk encryption verified active** (FileVault / BitLocker / LUKS). -- [ ] **Generate a new keypair** in Freighter with a strong, unique passphrase (6-word Diceware or stronger; not reused for any other purpose). -- [ ] **Export the 12-word recovery phrase**, write it on paper, store in a physically secure location. No digital copy. **No photos. No notes app. No cloud drive.** A second paper copy in a second location is fine. -- [ ] **Read the public address** in two independent contexts: Freighter UI directly, and from `stellar.expert` after sending a small test transaction on testnet. -- [ ] **Sign** a test transaction on testnet from Freighter to prove the workflow works end to end. -- [ ] **Write** the public address to the founder's collection channel; ideally signed via the founder's PGP key or equivalent out-of-band auth. - -Outcome: the founder has three new G-addresses, each tied to a software-stored secret protected by a unique passphrase + paper-only recovery, and the signer machines are minimally-attackable surfaces. - -A note on the math: software signers' threat model is "compromised machine," so the value of the 2-of-3 quorum scales with how independent the three machines are. If two signers use the same dev workstation, the multi-sig is effectively single-sig for any attacker who owns that machine. Different people, different machines, different OS families if you can swing it. - -## 2. Multi-sig account creation (both paths) - -The founder (or an operations engineer trusted with this single workflow) does the following on a clean machine: - -- [ ] Create a new Stellar account on mainnet (fund the minimum reserve from the founder's treasury). -- [ ] Add the three signer G-addresses with weight 1 each (`stellar tx set-options --signer ... --signer-weight 1`). -- [ ] Set the low / medium / high thresholds to 0 / 2 / 2 respectively. -- [ ] Set master key weight to 0 (this is the critical "disable the seed alone" step). **If the founder skips this on the software path, an attacker who steals the master seed can sign solo โ€” the whole multi-sig is defeated.** -- [ ] Note the multi-sig G-address; this is what the contract will recognize as admin. - -## 3. Verify - -```bash -./scripts/admin/verify-multisig.sh mainnet -``` - -The script must return all checks passed. It enforces: - -- master key weight = 0 -- low threshold = 0 -- medium threshold = 2 -- high threshold = 2 -- exactly 3 non-zero-weight signers -- each signer weight = 1 - -**If any check fails, do not rotate admin authority.** Re-provision per the failing check. - -After the script passes, manually compare the printed signer addresses against the roster the founder collected in ยง1. - -## 4. Testnet drill - -Before touching mainnet: - -- [ ] Deploy a throwaway boundless-events contract on testnet with the SAME multi-sig as admin (use practice Yubikeys or practice Freighter installs, whichever path you're on). -- [ ] Exercise a 2-of-3 sign on a routine op (e.g., `set_fee_bps`). -- [ ] Exercise a 3-of-3 sign on a high-bar op (`set_fee_account` โ€” see policy ยง4). -- [ ] Confirm that 1-of-3 signing on either op fails. -- [ ] Document the drill in the team's shared notes with the tx hashes. - -The same procedure is required quarterly per policy ยง5.3; this just exercises it under realistic conditions before mainnet. - -## 5. Rotate admin authority - -Only after every box above is checked: - -```bash -# From the deploy runbook ยง2.7 -soroban contract invoke \ - --network mainnet \ - --source $INITIAL_ADMIN_KEY \ - --id $EVENTS_ID \ - -- set_admin --new_admin $MULTISIG_G_ADDRESS - -# 2-of-3 quorum accepts. The multi-sig signs as event.owner. -soroban contract invoke \ - --network mainnet \ - --source $MULTISIG_G_ADDRESS \ - --id $EVENTS_ID \ - -- accept_admin -``` - -- [ ] `verify-multisig.sh` re-run **after** the rotation lands as a sanity check. -- [ ] `get_admin` on both contracts returns the multi-sig G-address. -- [ ] Initial admin key destroyed per runbook ยง2.8. - -## 6. Update the BACKLOG - -Once mainnet shows the multi-sig as admin and the drill succeeded: - -- Replace the P0 line `Mainnet admin multi-sig provisioned per docs/admin-custody-policy.md (3 signers, Yubikey-backed, 2-of-3).` with the equivalent `[x] โ€ฆ` entry under `Done` in `BACKLOG.md`, citing the rotation tx hash + the verify-multisig output. - ---- - -## Anti-patterns (do not do) - -- Sharing a single Yubikey or a single Freighter install between two signers. The whole point is independent custody. -- Backing up a Freighter recovery phrase to 1Password, iCloud, Google Drive, or any cloud notes app. The recovery phrase IS the key. -- Generating a software signing keypair on a shared dev workstation. Use a dedicated browser profile on a personal machine. -- Skipping the testnet drill because "we already practiced." The drill is the unit test for the entire human procedure. -- Running `set_admin` from a machine that does general-purpose browsing in parallel. Close everything else; sign in a clean session. -- Treating "we'll upgrade to hardware later" as optional. The hardware-upgrade trigger in `admin-custody-policy.md` ยง10 is a commitment, not a hope. diff --git a/docs/push-payouts-feasibility.md b/docs/push-payouts-feasibility.md new file mode 100644 index 0000000..ce54977 --- /dev/null +++ b/docs/push-payouts-feasibility.md @@ -0,0 +1,332 @@ +# Push payouts: feasibility and risk analysis + +**Status:** proposal, not a decision +**Date:** 2026-08-08 +**Question:** can we go back to pushing prize money at winner selection, instead of having winners claim it? + +--- + +## 1. The question, and why it is being asked + +Product wants the claim step gone. A winner should not have to press a button to +collect money they have already won. The money should simply arrive. + +The obvious route is to change the contract: put the transfers back inside +`select_winners` so funds move at selection. Before touching the contract, this +document works out whether that is necessary, whether it is safe, and what it +would cost. + +**The short answer:** the product outcome is achievable today with no contract +change at all. The contract change is a worthwhile optimisation afterwards, and +it is more feasible than the 1.3.0 decision suggests, but it is not the +prerequisite it appears to be. + +--- + +## 2. What we actually decided in 1.3.0, and why + +It is worth being precise here, because the reason we switched is not the reason +people remember. + +The switch landed in `56ecff9`, 1.3.0, PR #61, on 2026-07-20. The commit states +the motivation directly: + +> `select_winners` now records prizes; each winner claims in their own +> transaction via the new `claim_prize` entrypoint, **so the winner count per +> event is bounded by the winner_distribution instead of one transaction's +> resource budget.** + +So the driver was **transaction resource limits**, not security and not +authorisation. Under the old push model, every transfer for every winner had to +fit inside a single `select_winners` transaction. An event with a long prize +ladder would hit the ceiling and become unpayable. + +This matters because the reason widely repeated in the frontend and in product +conversation is different. The claim card in the platform explains that the +contract requires the winner's own authorisation so an organiser cannot collect +on their behalf. That is a true description of `claim_prize` as built, but it is +a **consequence** of the pull design, not the reason it was chosen. Nobody +decided that winners must authorise their own payouts as a safety property. We +should not defend a constraint we never intended. + +### The part that is easy to miss + +The same PR did two things at once: + +1. Made `select_winners` **batchable, now at up to 20 winners per call**, with each position + awardable exactly once and amounts anchored to the escrow baseline captured at + the first batch. +2. Moved the transfer out into `claim_prize`. + +**Batching alone solves the unbounded-winner problem.** Once selection is +batched, an event with 500 winners is 25 calls instead of 1, and no single +transaction has to carry them all. That is true whether or not the transfer +happens inside the batch. Adding the transfer back makes each winner cost more +resources, so the safe batch size falls, but it does not reintroduce the +unbounded case that motivated the change. + +If that reasoning holds, then the constraint that pushed us to pull was +substantially retired by the other half of the same PR. This should be confirmed +by measurement (section 8) rather than taken on argument, but it reframes the +question from "can we undo a necessary safety decision" to "what is the right +batch size." + +The commit also references "the constraints that sank PR #83" and answers them +with a no-persisted-struct-changes rule. I have not read #83 and it should be +reviewed before any design is finalised, since it is the record of an earlier +attempt that failed. + +--- + +## 3. What changed in the protocol since + +**CAP-73, Protocol 26 (Yardstick)** added a `trust` function to the Stellar Asset +Contract. It lets a contract create an asset's trustline for a G-address during a +contract invocation. The docs name our exact use case: + +> The `trust` function is useful any time a contract distributes an asset to +> accounts that may not hold it yet: for example, an airdrop or payout contract +> calling `trust` before `mint` or `transfer`. + +It is a no-op when the trustline already exists or when the address is a +contract, so it is safe to call unconditionally. + +**But read the next paragraph of the same page carefully:** + +> When a trustline is actually created, the SAC requires authorization from +> `addr`, preserving the opt-in nature of trustlines. + +So CAP-73 does **not** let us push to a stranger who has never opted in. If the +recipient has no trustline, creating one still needs their signature, which is +exactly what we were trying to avoid needing. For a payout transaction submitted +by an organiser, a winner without a trustline remains unpayable. + +This would be a serious problem, except for section 4. + +--- + +## 4. The decisive fact: every payout address is ours + +Boundless does not have a population of winners with arbitrary external wallets. + +- The `Wallet` model stores `encryptedPrivateKey` and `encryptedDataKey`. Every + wallet on the platform is custodial and platform-held under envelope + encryption. +- Wallet activation is **sponsored by the platform** and creates the configured + auto-trustline assets in the same transaction. The platform pays the 1 XLM + account reserve and 0.5 XLM per trustline, and records each sponsorship so the + reserve can be recycled later. +- The escrow submission path validates that the applicant's payout address + matches the caller's managed wallet, and rejects the call when it does not. + +Three consequences, and they carry the whole analysis: + +1. **The trustline risk is already mitigated at the source.** Winners have USDC + trustlines because we created them, sponsored, at activation. CAP-73 is a + useful belt-and-braces call but not a dependency for us. +2. **The base reserve requirement is already satisfied**, by us, for the same + reason. +3. **We hold every winner's key.** Which means the platform can already sign + `claim_prize` on a winner's behalf. The MANAGED signing path that does exactly + this for other operations is built and in production. + +Point 3 is the finding that changes the recommendation. + +--- + +## 5. Three options + +### Option A: auto-claim on the winner's behalf. No contract change. + +When results publish, the backend claims each prize for each winner using the +custodial key it already holds, through the existing MANAGED signing path. + +The winner does nothing and sees money in their wallet. The product outcome is +delivered in full. + +**Cost:** one transaction per winner, fee paid by the platform. Orchestration and +retries on the backend, where we already have the escrow op infrastructure, +idempotency keys and failure handling. + +**Risk:** low. No contract change means no upgrade, no timelock, no migration, no +audit delta, nothing that can strand escrow. A failure is a backend retry, not a +stuck event. + +**The one thing to settle:** it is the platform moving value using a user's key +without a per-instance prompt. The direction of travel is benign, since funds can +only move toward the user and only to their own wallet, but it is a custody +posture that should be written down and reflected in the terms rather than +assumed. `admin-custody-policy.md` is the right home for it. + +**Limitation:** it does not simplify the contract. The claim window, the +unclaimed-prize counter and the cancel sweep all stay. And if Boundless ever +supports genuinely external wallets, this option stops covering those users. + +### Option B: push inside `select_winners`, batched + +Transfers move back into selection, at a measured batch size. + +**What it buys:** the contract becomes simpler in principle. No claim window, no +unclaimed counter, no expiry sweep, no second entrypoint. Money moves when the +organiser locks winners, which is what the original design and the Design spec +always said should happen. + +**What it costs:** every risk in section 6. + +### Option C: push with a pull fallback + +Attempt the transfer inside selection. If it cannot complete for a given +recipient, record the award instead and let that winner claim later. + +Soroban supports this: the codebase already uses `try_` invocations for the +profile calls in `claim_prize`, precisely so a broken profile contract cannot +block a payout. The same pattern applies to a transfer that cannot land. + +This is the design that survives contact with reality. It gets the default path +right, keeps a bad recipient from blocking everyone else in the batch, and keeps +a working path for external wallets if we ever support them. It costs more WASM +than Option B because both paths must exist, which runs into the size ceiling. + +--- + +## 6. Risk register + +Risks are for Options B and C unless stated. Option A carries only the custody +posture item. + +| # | Risk | Severity | Notes and mitigation | +| --- | --- | --- | --- | +| R1 | **One bad recipient reverts the whole batch.** A transfer to an address that cannot receive panics, and a panic aborts the entire invocation. Under pull, a broken recipient hurts only themselves. Under push, they block every other winner in the batch and stop the organiser closing the event. | **High** | This is the single biggest argument against naive push. Mitigations, in order of strength: Option C's `try_` fallback; an off-chain preflight that checks every winner before building the batch; a payout-capability gate at submission time so the failure surfaces weeks earlier. | +| R2 | **In-flight events must not break.** Events already have recorded-but-unclaimed awards. `claim_prize` cannot simply be deleted. | **High** | Dual path until the last pre-upgrade claim window expires, which is up to 90 days from the last pre-upgrade selection. Plan the cutover as a window, not an event. | +| R3 | **Audit timing.** A third-party audit is an open P0 mainnet blocker, budgeted at $30-80k and unscheduled. The money path is the highest-value target in the contract. | **High** (schedule) | Either land this before the audit so it is covered, or accept paying for a re-review of the delta. Changing the payout path *after* an audit is the worst of the three orderings. | +| R4 | **WASM size ceiling.** 64 KB hard limit. The build measured 51,276 bytes at 1.3.0, leaving roughly 12.7 KB. We are now at 1.6.0, which removed per-event caps and added pagination, so the current headroom is unknown. Option C needs both paths resident. | **Medium-high** | Measure the 1.6.0 baseline before designing. If headroom is thin, Option C may not fit and the choice collapses to B or A. | +| R5 | **Error enum is at the 50-case XDR cap.** Any new error variant requires consolidating an existing one first. | **Medium** | Already tracked in the backlog. Budget the consolidation as part of the work, not as a surprise. | +| R6 | **Payment event timing moves.** `WinnerPaid` currently fires when money actually moves, at claim time. Under push it fires at selection. Four escrow subscribers and the indexer key off these events. | **Medium** | Audit every subscriber for timing assumptions. The upside is that the event becomes simpler to reason about, since selection and payment stop being separable. | +| R7 | **Fee incidence shifts.** Winners currently pay their own claim fee. Under push the organiser or platform pays for everyone, in one fat transaction that competes for contract resources under surge pricing. | **Medium** | Absolute cost is small, but it should be modelled rather than assumed, and it is a real cost transfer onto organisers. Note Option A shifts the same cost onto the platform. | +| R8 | **Reentrancy and call ordering.** Transfers inside a state-transition op mean external calls mid-transition. | **Medium** | Effects before interactions, the discipline `claim_prize` already follows and comments. The SAC is trusted so real exposure is low, but auditors will look here first. | +| R9 | **Partial batch failure and retry.** A batch that fails midway must not double-pay on retry. | **Medium** | The per-position award key is already the replay lock, and a revert unwinds the write and the transfer together, so on-chain retry is safe. The orchestrator still needs clean semantics for "batch 3 of 5 failed". | +| R10 | **Liveness machinery becomes vestigial.** The 90-day window, unclaimed counter, cancel gate and expiry sweep exist to guarantee escrow can never strand. With push there is nothing to strand. | **Low-medium** | Do not delete while R2 is live. Deleting later reclaims WASM space, which R4 may need. | +| R11 | **The claim window is a module constant.** Making it per-event requires a storage migration. | **Low** | Only relevant if we keep a fallback path. Already in the backlog for the next real migration window. | + +--- + +## 7. Hard constraints to design within + +- **WASM:** 64 KB ceiling. Last measured 51,276 bytes at 1.3.0. +- **Errors:** enum at the 50-case XDR cap. +- **Upgrade path:** `propose_upgrade`, roughly one day of timelock, `apply_upgrade`, + then `migrate()`, all under a 2-of-3 admin multisig. This is not a same-day + change, and it needs signer coordination. +- **Ledger limits:** roughly 200 disk-read entries and 200 write entries per + transaction on Protocol 27, with the caveat from the docs that these are + validator-settable network settings and must be verified against mainnet rather + than quoted from documentation. +- **No persisted-struct changes**, the rule adopted in 1.3.0 after PR #83. New + state goes under appended data keys, and there is a regression test that turns + CI red if `Winner` gains a field. + +--- + +## 8. What to measure before committing + +Nothing below is a design decision. All of it is arithmetic we have not done, and +the answers determine which option is even available. + +1. **Batch headroom with transfers included.** Simulate `select_winners` on + testnet with the transfer in the loop and find the real per-winner cost in + instructions, entry reads and writes, and IO bytes. The selection-only case + was measured on 2026-10-02 at 19 + 4 ledger entries per award, which set the + cap at 20; measure the transfer on top of that. The number we care about: + does push drop the safe batch from 20 to roughly 10, or to 2? The first is a + non-issue. The second changes the answer. +2. **Current WASM headroom at 1.6.0.** Determines whether Option C fits. +3. **Payout-address population.** Confirm from production data that every winner + address is a platform-held wallet with a live USDC trustline, and that there is + no legacy or edge-case path that produced anything else. The entire trustline + argument rests on this. +4. **Real mainnet ledger limits**, read from network settings rather than docs. +5. **Fee modelling.** Cost per winner under Option A (one transaction each) + against Option B or C (batched), including a surge-pricing allowance. + +--- + +## 9. Recommendation + +**Do Option A now. Decide on B or C after the measurements.** + +The reasoning is that Option A delivers the entire product outcome, this month, +with no contract risk. Winners stop claiming. The button disappears. Money +arrives on its own. Every user is covered, because we hold every key and we +created every trustline. + +Against that, Option B and C deliver no additional user-visible benefit. Their +value is engineering: a simpler contract, fewer moving parts, no vestigial +liveness machinery, and payment semantics that match what the Design spec always +described. Those are real and worth having, but they are worth having at a time +of our choosing, not on the critical path of a product change. + +Sequenced: + +**Phase 0, now.** Run the five measurements in section 8. Read PR #83. Cheap, and +it settles most of the argument. + +**Phase 1, next.** Ship auto-claim on behalf. Update the custody policy to +describe the platform signing payout claims for users, and reflect it in the +terms. Keep manual claim reachable as a fallback so a backend failure never +leaves a winner with no route to their money. + +**Phase 2, decide.** With numbers in hand, choose: + +- If batch headroom is comfortable and WASM allows, do **Option C**, hybrid push + with a pull fallback, and land it before the audit. This is the design that + matches the original intent and survives external wallets later. +- If WASM is tight, do **Option B** with a hard off-chain preflight, accepting + R1 as an operational control rather than a contract-level one. +- If both are tight, stay on Option A indefinitely. It works, and the cost is + carrying machinery we no longer strictly need. + +The one thing not to do is treat the contract change as a blocker for the product +change. It is not one. + +--- + +## 10. Open questions + +1. **Custody posture.** Is the platform signing a value-moving transaction on a + user's behalf, without a per-instance prompt, something we are comfortable + stating publicly in the terms? Option A depends on yes. +2. **External wallets.** Is supporting genuinely external payout addresses on the + roadmap? If yes, Option C becomes materially more attractive and Option A + becomes a stopgap. If no, Option A is close to a permanent answer. +3. **Audit sequencing.** Do we hold the audit until the payout path is final, or + audit now and pay for a delta review later? +4. **Organiser fee incidence.** Under push, organisers pay to distribute. Is that + acceptable, or does the platform absorb it? Note that under Option A the + platform absorbs it by default. +5. **Failure visibility.** When an automatic payout fails for one winner, who is + told, how fast, and what does the winner see in the meantime? This needs an + answer in all three options, and it is a design question as much as an + engineering one. + +--- + +## Sources + +Internal: + +- `56ecff9` and PR #61, the 1.3.0 pull-model commit and its stated rationale. +- `contracts/events/src/event_ops.rs`, `select_winners` and `claim_prize`, + including the pre-1.3.0 push-model compatibility branch. +- `BACKLOG.md`: unmeasured batch headroom, the 50-case error cap, the claim window + constant, and M2 on contract-layer trustline checks not being reliably possible. +- `docs/ARCHITECTURE.md` for the 64 KB WASM ceiling. +- `boundless-nestjs`: the `Wallet` model, `wallet-sponsor.service.ts` sponsored + activation with auto-trustlines, and the MANAGED signing path. + +External: + +- [Stellar Asset Contract: creating trustlines from a contract](https://developers.stellar.org/docs/tokens/stellar-asset-contract#creating-trustlines-from-a-contract) (CAP-73, Protocol 26) +- [Stellar Asset Contract: contract errors](https://developers.stellar.org/docs/tokens/stellar-asset-contract#contract-errors) (`TrustlineMissingError = 13`) +- [Storage strategies in production contracts](https://developers.stellar.org/docs/build/guides/storage/storage-strategies) (per-transaction entry caps, Protocol 27) +- [Fees, resource limits and metering](https://developers.stellar.org/docs/learn/fundamentals/fees-resource-limits-metering) (multidimensional resource model, surge pricing on contract transactions) +- [Analyzing smart contract cost and efficiency](https://developers.stellar.org/docs/build/guides/fees/analyzing-smart-contract-cost) (batch transfer patterns) diff --git a/docs/scout-audit-report.md b/docs/scout-audit-report.md index 5b2f330..931899e 100644 --- a/docs/scout-audit-report.md +++ b/docs/scout-audit-report.md @@ -1,4 +1,4 @@ -# Boundless Contracts โ€” Scout Security Scan Report +# Boundless Contracts: Scout Security Scan Report **Tool:** [Scout by CoinFabrik](https://github.com/CoinFabrik/scout) (`cargo-scout-audit`) **Version:** 0.3.x (nightly-2025-08-07 toolchain) @@ -9,10 +9,14 @@ > **Historical note (post-scan):** this report describes the contracts as > scanned, at version 1.0.0, when per-user credit balances were still > on-chain (`profile/src/credits.rs`). The 1.0.0 โ†’ 1.1.0 upgrade (2026-06) -> removed on-chain credits โ€” they are now an off-chain ledger in -> boundless-nestjs โ€” so `credits.rs` and its findings (e.g. C-1 / C-6) no -> longer have an on-chain counterpart. References below are preserved -> unedited as the record of the scan. +> removed on-chain credits (they are now an off-chain ledger in +> boundless-nestjs), so `credits.rs` and its findings (e.g. C-1 / C-6) no +> longer have an on-chain counterpart. The 1.7.0 โ†’ 2.0.0 upgrade removed +> the on-chain participation records in the same way, so the findings that +> touch `apply()`, `remove_applicant()`, `applicant_at()`, +> `applicant_count()` and `applicants_snapshot()` no longer have one +> either. References below are preserved unedited as the record of the +> scan. --- @@ -24,7 +28,7 @@ |---|---|---|---| | CRITICAL | 11 | 5 | 6 | | MEDIUM | 21 | 0 | 21 | -| ENHANCEMENT | 50 | 0 (advisory) | โ€” | +| ENHANCEMENT | 50 | 0 (advisory) | n/a | **Post-remediation scan:** @@ -32,7 +36,7 @@ |---|---|---|---| | CRITICAL | 5 | 0 | 5 | | MEDIUM | 21 | 0 | 21 | -| ENHANCEMENT | 50 | 0 (advisory) | โ€” | +| ENHANCEMENT | 50 | 0 (advisory) | n/a | All real CRITICAL findings have been remediated. The 5 remaining CRITICAL and all 21 MEDIUM are documented false positives. See sections below. @@ -40,7 +44,7 @@ All real CRITICAL findings have been remediated. The 5 remaining CRITICAL and al ## CRITICAL Findings -### C-1 โ€” Subtraction underflow: `profile/src/credits.rs:81` +### C-1: Subtraction underflow: `profile/src/credits.rs:81` ```rust profile.credits -= amount; @@ -56,13 +60,13 @@ Scout does not trace the guard above the operation. Underflow is impossible at t --- -### C-2 โ€” `update_current_contract_wasm` without access control: `profile/src/admin.rs:262` +### C-2: `update_current_contract_wasm` without access control: `profile/src/admin.rs:262` **Assessment: False positive.** This call is inside `apply_upgrade()`, which begins with `admin.require_auth()`. Scout does not trace access control through the calling function. The upgrade is fully admin-gated and also requires the timelocked proposal to have elapsed. --- -### C-3 โ€” Addition overflow: `idempotency.rs:35,36` +### C-3: Addition overflow: `idempotency.rs:35,36` ```rust let id = storage::get_next_event_id(env, base + 1); @@ -73,7 +77,7 @@ storage::set_next_event_id(env, id + 1); --- -### C-4 โ€” Bitwise XOR `^` flagged as potential exponentiation error: `idempotency.rs:60,74,75` +### C-4: Bitwise XOR `^` flagged as potential exponentiation error: `idempotency.rs:60,74,75` ```rust payload[0] ^= op_tag; @@ -87,7 +91,7 @@ Rust has no `**` exponentiation operator; `^` is always XOR in Rust. No change t --- -### C-5 โ€” Subtraction underflow: `events/src/storage.rs:303,305,327` +### C-5: Subtraction underflow: `events/src/storage.rs:303,305,327` ```rust let idx = slot - 1; // line 303 @@ -105,7 +109,7 @@ So `slot >= 1` at line 303. `count >= 1` follows because a non-zero slot implies ## MEDIUM Findings -### M-1 โ€” Unsafe `.unwrap()` on Map: `event_ops.rs:693,707` +### M-1: Unsafe `.unwrap()` on Map: `event_ops.rs:693,707` ```rust let percent = event.winner_distribution.get(spec.position).unwrap() as i128; @@ -115,7 +119,7 @@ let percent = event.winner_distribution.get(spec.position).unwrap() as i128; --- -### M-2 โ€” Unsafe `.expect()`: `storage.rs:309` +### M-2: Unsafe `.expect()`: `storage.rs:309` ```rust let last_addr = applicant_at(env, id, last_idx).expect("count > 0 implies last present"); @@ -125,19 +129,19 @@ let last_addr = applicant_at(env, id, last_idx).expect("count > 0 implies last p --- -### M-3 โ€” Unsafe Map access: `crowdfunding.rs:51`, `event_ops.rs:670`, `grant.rs:155` +### M-3: Unsafe Map access: `crowdfunding.rs:51`, `event_ops.rs:670`, `grant.rs:155` -**Assessment: False positives.** All three use `ok_or(Error::...)` or `.is_none()` โ€” the safe optional access pattern. Scout's multi-line expression parser tagged the method chain start rather than the terminal accessor. Example from `crowdfunding.rs`: +**Assessment: False positives.** All three use `ok_or(Error::...)` or `.is_none()`, the safe optional access pattern. Scout's multi-line expression parser tagged the method chain start rather than the terminal accessor. Example from `crowdfunding.rs`: ```rust let percent = record .winner_distribution .get(1) - .ok_or(Error::InvalidDistribution)?; // safe โ€” ? propagates error + .ok_or(Error::InvalidDistribution)?; // safe: ? propagates error ``` --- -### M-4 โ€” Unbounded operations: `event_ops.rs:346,642`, `grant.rs:115`, `storage.rs:341,416` +### M-4: Unbounded operations: `event_ops.rs:346,642`, `grant.rs:115`, `storage.rs:341,416` **Assessment: Confirmed for the original `start_cancel`; remediated in events 1.2.0.** The contributor cap of 5,000 did not make the old snapshot loop safe because every iteration read both the contributor address and amount. The transaction could exceed Soroban resource limits well before reaching the cap. @@ -145,31 +149,31 @@ The 1.2.0 fix maintains `NonOwnerContributionTotal` in `add_funds`, so `start_ca --- -### M-5 โ€” Transfer amount not checked against minimum: `escrow.rs:34,84` +### M-5: Transfer amount not checked against minimum: `escrow.rs:34,84` -**Assessment: False positive for this context.** Scout suggests a minimum transfer amount check to prevent front-running. The amounts here are computed by the contract itself (fee math on `deposit_with_fee`, exact escrow amounts on `release`) โ€” not user-supplied values. An organizer-set `total_budget` is validated at `create_event` time (must be > 0). No additional check is needed. +**Assessment: False positive for this context.** Scout suggests a minimum transfer amount check to prevent front-running. The amounts here are computed by the contract itself (fee math on `deposit_with_fee`, exact escrow amounts on `release`), not user-supplied values. An organizer-set `total_budget` is validated at `create_event` time (must be > 0). No additional check is needed. --- -### M-6 โ€” Dynamic types in storage: `profile/storage.rs:140,162`, `events/storage.rs:145,167` +### M-6: Dynamic types in storage: `profile/storage.rs:140,162`, `events/storage.rs:145,167` -**Assessment: Low risk, advisory.** The flagged calls store Soroban `String` values for the contract version (e.g., `"0.2.0"`). These are bounded semver strings written only by the admin-gated `apply_upgrade` / `migrate` paths โ€” not unbounded user input. The theoretical growth risk is negligible. No change required for testnet; may convert to a fixed-size encoding before mainnet if auditors require it. +**Assessment: Low risk, advisory.** The flagged calls store Soroban `String` values for the contract version (e.g., `"0.2.0"`). These are bounded semver strings written only by the admin-gated `apply_upgrade` / `migrate` paths, not unbounded user input. The theoretical growth risk is negligible. No change required for testnet; may convert to a fixed-size encoding before mainnet if auditors require it. --- -### M-7 โ€” Storage operation without access control: `storage.rs:343` +### M-7: Storage operation without access control: `storage.rs:343` **Assessment: False positive.** The flagged storage operation is a helper function called exclusively by `apply()` (bounty application flow), which has `applicant.require_auth()` in its caller. Scout does not trace call hierarchy for access control. No change required. --- -### M-8 โ€” Vec/Map parameters without content validation: (events contract) +### M-8: Vec/Map parameters without content validation: (events contract) **Assessment: Advisory.** The `winners: Vec` parameter in `select_winners` is validated in the function body (position bounds check, total amount check, non-empty check). No unvalidated Vec is stored raw from user input. No change required. --- -### M-9 โ€” Storage push_back without access control: `storage.rs:343,418,498` +### M-9: Storage push_back without access control: `storage.rs:343,418,498` **Assessment: False positive.** `out.push_back(addr)` and `out.push_back(w)` inside `applicants_snapshot`, `winners_snapshot`, and `contributors_snapshot` are building an in-memory `Vec` (a local variable, not a storage write). Scout flags `push_back` as a storage mutation but these are plain Soroban SDK Vec accumulations. The snapshot functions are read-only helpers -- they do not write to contract storage. No change required. @@ -252,10 +256,10 @@ For audit panel reference -- these Scout warnings require no code change: | M-5 | `escrow.rs` | 34,84 | Amounts are contract-computed, not user-supplied | | M-6 | `profile/storage.rs`, `events/storage.rs` | various | Bounded semver strings written by admin-only paths | | M-7 | `storage.rs` | 343 | Called only from auth-gated `apply()` | -| M-8 | `event_ops.rs` | โ€” | Vec validated in function body | +| M-8 | `event_ops.rs` | n/a | Vec validated in function body | | M-9 | `storage.rs` | 343,418,498 | In-memory Vec accumulation in read-only helpers; not a storage write | -| ENHANCEMENT (soroban_version) | `Cargo.toml` | โ€” | Resolved: bumped to soroban-sdk 27.0.0 / Rust 1.91.0 / wasm32v1-none target. | -| ENHANCEMENT (storage_change_events, ~44 flags) | `lib.rs` dispatcher functions | โ€” | No action: dispatcher wrappers delegate to impl modules that already emit events. Scout cannot trace through function calls. `ManagerChanged` is the only genuine gap; tracked in issue #3. | +| ENHANCEMENT (soroban_version) | `Cargo.toml` | n/a | Resolved: bumped to soroban-sdk 27.0.0 / Rust 1.91.0 / wasm32v1-none target. | +| ENHANCEMENT (storage_change_events, ~44 flags) | `lib.rs` dispatcher functions | n/a | No action: dispatcher wrappers delegate to impl modules that already emit events. Scout cannot trace through function calls. `ManagerChanged` is the only genuine gap; tracked in issue #3. | **Fixed findings (no longer in scan output):** @@ -266,3 +270,102 @@ For audit panel reference -- these Scout warnings require no code change: | C-7 | `events/storage.rs:303,305,327` | `checked_sub(1).ok_or()` in `remove_applicant()` | | M-1 | `events/event_ops.rs:693,707` | `.ok_or(Error::InvalidDistribution)?` replacing `.unwrap()` | | M-2 | `events/storage.rs:309` | `.ok_or(Error::EventNotFound)?` replacing `.expect()` | + +--- + +## Re-scan, September 2026 (events 1.7.0, profile 1.2.0) + +**Date:** 2026-09-11 +**Source:** `feat/escrow-open-pool` @ `0943d26` +**Tool:** `cargo-scout-audit` 0.3.16, detectors toolchain `nightly-2025-08-07` +**Command:** `cargo scout-audit --output-format md -- --target=wasm32v1-none --no-default-features`, run per crate + +**Tooling caveat.** Scout 0.3.16 cannot compile a soroban-sdk 27 project: its +pinned nightly predates the stabilisation of `str::floor_char_boundary`, which +`soroban-sdk-macros 27.0.0` uses (`E0658` in `doc.rs:25`), and its default +`--target=wasm32-unknown-unknown` is rejected outright by the SDK 27 build +script. The scan was therefore run on a scratch copy of the same source with +the workspace pinned to `soroban-sdk = "23.5.2"` (the version the June scans +used) and the `compatibility` crate excluded. The contract source compiles +unchanged against 23.5.2, so detector coverage of `contracts/events/src` and +`contracts/profile/src` is unaffected; only the `soroban_version` enhancement +flags are an artifact of the pin. + +| Crate | Critical | Medium | Minor | Enhancement | +|---|---|---|---|---| +| `boundless_events` | 2 | 19 | 0 | 30 | +| `boundless_profile` | 1 | 2 | 0 | 19 | + +### Real findings + +| ID | File | Finding | Assessment | +|---|---|---|---| +| S-1 | `events/src/event_ops.rs:745` | `let anchor_idx = existing_count + (idx as u32);`: bare `+` on `u32` in the Single-release branch of `select_winners`. | **Real, low.** Needs 2ยณยฒ winner rows to overflow and `overflow-checks = true` would trap rather than wrap, but it breaks the checked-arithmetic rule the repo adopted for C-3. **Fixed in 2.0.0:** `checked_add` returning `InvalidWinnerPosition`. | + +### False positives (same classes as June) + +| Detector | Locations | Reason | +|---|---|---| +| `unprotected_update_current_contract_wasm` (CRITICAL ร—2) | `events/admin.rs:236`, `profile/admin.rs:216` | Inside `apply_upgrade()`, which opens with `require_admin()`; Scout does not trace access control through the enclosing function (June C-2). | +| `unsafe_map_get` (MEDIUM ร—3) | `event_ops.rs:725,793`, `admin.rs:474` | `Map::get` returns `Option`; every site is `if let Some(floor) = โ€ฆ`. | +| `dos_unexpected_revert_with_storage` (MEDIUM ร—4) | `admin.rs:383`, `storage.rs:421,700,793` | `floors.set` runs inside admin-gated `migrate_events`; the three `storage.rs` sites are `push_back` on an in-memory `Vec` inside paged read helpers (June M-9). | +| `dos_unbounded_operation` (MEDIUM ร—7) | `admin.rs:425-440,464-488`, `event_ops.rs:675-681`, `grant.rs:63-81`, `storage.rs:419-423,698-702,791-795` | Read helpers are bounded by `limit.min(VIEW_PAGE_LIMIT)`. Migration loops walk one event's winner rows per call, admin-only, one-time. **Correction (October 2026): the `grant.rs:63-81` site was a real finding, not a false positive.** `claim_milestone` scanned every winner row, and every release adds one, so the bound "prior selections ร— milestones" was real but unenforced: eight recipients with ten milestones pass the 100-entry transaction footprint partway through. Recorded as DoS.16 in the threat model and fixed in 2.0.0 with a per-grant roster; the scan remains only for grants selected before the roster existed. The `select_winners` (Multi) scan stops at the first row. | +| `front_running` (MEDIUM ร—2) | `escrow.rs:34,72` | Amounts are validated at every call site (`InvalidBudget`, `BelowMinimumContribution`, floor checks); Soroban has no public mempool ordering game equivalent to the detector's model (June M-5). | +| `dynamic_storage` (MEDIUM ร—4) | `events/storage.rs:132,162`, `profile/storage.rs:113,135` | Bounded semver strings on admin-only paths (June M-6). | +| `avoid_vec_map_input` (MEDIUM ร—1) | `events/lib.rs:225` (`select_winners`) | Every element validated: dedupe, `amount > 0`, floor, reputation bump at most 100, at most 20 per call (40 for a grant, one award per recipient) (June M-8). | +| `storage_change_events` (ENHANCEMENT ร—47) | `lib.rs` dispatchers, both crates | Dispatcher wrappers delegate to modules that emit events; `ManagerChanged` shipped with two-step delegation (#88), closing the one genuine gap noted in July. | +| `soroban_version` (ENHANCEMENT ร—2) | `Cargo.toml` | Artifact of the 23.5.2 pin used to run the tool; the workspace is on 27.0.0. | + +Net, as first triaged: one real low-severity finding (S-1); zero real CRITICAL or MEDIUM. Revised October 2026: one MEDIUM (`grant.rs:63-81`, DoS.16) was real. Both are fixed in 2.0.0, and the scan is re-run on the 2.0.0 source before fieldwork. + +--- + +## Re-scan, October 2026 (events 2.0.0, profile 1.2.1) + +**Date:** 2026-10-03 +**Source:** `feat/grant-hardening` working tree over `7abbf5c` (grant hardening, release validator, soroban-sdk 28.0.0) +**Tool:** `cargo-scout-audit` 0.3.17, detectors toolchain `nightly-2025-09-18` +**Command:** `cargo scout-audit --output-format md -- --target=wasm32v1-none --no-default-features`, run per crate + +Scout 0.3.17 compiles the soroban-sdk 28 source as it stands, so the 23.5.2 pin the September scan needed is gone and the scan covers exactly the code under review. + +| Crate | Critical | Medium | Minor | Enhancement | +|---|---|---|---|---| +| `boundless_events` | 0 | 20 | 0 | 32 | +| `boundless_profile` | 0 | 3 | 0 | 18 | + +S-1 no longer appears: the anchor index in `select_winners` uses `checked_add`. The `unprotected_update_current_contract_wasm` critical is also gone, but only because SDK 28 replaced `update_current_contract_wasm` with `update_current_contract(ContractExecutable::Wasm(..))` and the detector matches the old name. The access control it was asking about is unchanged: both `apply_upgrade` functions open with `require_admin()` and read only the timelocked stored hash. + +### Real findings + +| ID | File | Finding | Assessment | +|---|---|---|---| +| S-2 | `events/src/admin.rs:512-544` (`migrate_owed_total`) | Flagged as `dos_unbounded_operation`. The loop itself is bounded by one event's winner records, but following it showed that `migrate_one_event` rebuilt the owed total and award amounts for every event it walked, not only the records it converted. A forfeit lowers the owed total without writing a winner record, so the rebuild reserved the forfeited share again and the grant could never be cancelled once its milestones were settled. Every upgrade has to page `migrate_events` over the events created since the last stamp, so live grants are always in its path. | **Real, medium. Fixed:** both rebuilds now run only for a record converted from the pre-1.7.0 layout. Recorded as Tamp.19 in the threat model. Regression test: `a_migration_pass_after_a_forfeit_keeps_it_released`. | + +A read-only check of mainnet on the same day found eight events, two of them still in the pre-1.7.0 layout (both completed, zero escrow, one and two winner records). The mainnet conversion is therefore a single `migrate_events` call, and after the fix it walks winner records for those two events only. + +### False positives + +| Detector | Locations | Reason | +|---|---|---| +| `unsafe_map_get` (MEDIUM ร—4) | `admin.rs:565`, `event_ops.rs:738,823`, `grant.rs:30` | `Map::get` returns `Option`. The first three are `if let Some(floor) = โ€ฆ`; `grant.rs:30` is `roster.get(..).ok_or(Error::NoSubmissions)?`. | +| `dos_unbounded_operation` (MEDIUM ร—6) | `admin.rs:516,555`, `event_ops.rs:679`, `grant.rs:48`, `storage.rs:504,597` | `admin.rs`: see S-2; after the fix these loops run only for converted pre-1.7.0 records. `event_ops.rs:679`: the guard against a second grant selection returns at the first award record, and a grant's first record is always its award. `grant.rs:48`: the winner-record walk kept for grants selected before the roster existed (DoS.16); none exist on mainnet. `storage.rs`: paged read helpers capped at `VIEW_PAGE_LIMIT` (90). | +| `dos_unexpected_revert_with_storage` (MEDIUM ร—3) | `admin.rs:474`, `storage.rs:506,599` | `floors.set` builds an in-memory `Map` inside admin-gated `migrate_events`; the `storage.rs` sites are `push_back` on an in-memory `Vec` in the paged read helpers (June M-9). | +| `front_running` (MEDIUM ร—2) | `escrow.rs:34,83` | Amounts are contract-computed or validated at every call site (June M-5). | +| `avoid_vec_map_input` (MEDIUM ร—1) | `lib.rs:218` (`select_winners`) | Every element is validated: duplicate positions and recipients, `amount > 0`, floor, award at least the milestone count, reputation bump at most 100, at most 20 per call or 40 per grant (June M-8). | +| `constructor` (MEDIUM ร—2) | `events/admin.rs:56`, `profile/admin.rs:26` | `initialize` is a private helper called only from `__constructor`, which runs atomically with deployment; nobody can call it afterwards. | +| `dynamic_storage` (MEDIUM ร—5) | `events/storage.rs:185,215,634`, `profile/storage.rs:113,135` | Bounded semver strings on admin-only paths (June M-6). `storage.rs:634` is the grant roster: written once at selection and capped at 40 entries by `MAX_GRANT_AWARDS`. | +| `storage_change_events` (ENHANCEMENT ร—50) | `lib.rs` dispatchers, both crates | Each flagged dispatcher was checked against its module: all emit an event except `migrate_events`, which pages the layout conversion; its completion is recorded by `Migrated` from `migrate`, and the threat model's monitoring row now says so. | + +The `soroban_version` enhancement is gone: the workspace is on the latest SDK. + +Net: one real medium (S-2, Tamp.19), fixed with a regression test; no critical findings; every other warning is a documented false positive. Tests after the fix: 401 passing (329 events, 69 profile, 3 storage-compatibility fixtures). + +The cleanup that followed this scan removed the code behind several of the warnings above: the owed-total and award-amount rebuilds in `migrate_events` (S-2's source; the migration now converts the record layout only), the winner-record walk for grants selected before the roster existed (`grant.rs:48`), the second-selection scan (`event_ops.rs:679`, now a count check), and the dead fee and storage helpers. A re-scan of the cleaned source the same day (same tool and command) confirms it: + +| Crate | Critical | Medium | Minor | Enhancement | +|---|---|---|---|---| +| `boundless_events` | 0 | 15 | 0 | 32 | +| `boundless_profile` | 0 | 3 | 0 | 17 | + +The five events mediums that no longer appear are `admin.rs:516,555,565`, `event_ops.rs:679` and `grant.rs:48`; the profile enhancement that went is the removed `slash_reputation` dispatcher. Every remaining warning is one of the false-positive classes above, at shifted line numbers. diff --git a/docs/sdk27-compatibility-fixtures.md b/docs/sdk27-compatibility-fixtures.md deleted file mode 100644 index f9b9c71..0000000 --- a/docs/sdk27-compatibility-fixtures.md +++ /dev/null @@ -1,43 +0,0 @@ -# SDK 27 compatibility fixture provenance - -Fixture hashes and source details are pinned in -`contracts/compatibility/fixtures/manifest.json`. - -## Mainnet ledger snapshot - -The snapshot is mainnet ledger `63617727`, timestamp `1784850182`, protocol -`27`. It contains all contract-data entries for the events and profile IDs in -the manifest: two contract instances, five profile rows, and three legacy -operation markers. Contract code is loaded separately. TTLs are normalized to -`u32::MAX` so rows do not expire while the host test advances the ledger. - -Recreate it with Stellar CLI 27.0.0: - -```bash -./scripts/capture-mainnet-compat-snapshot.sh /tmp/mainnet-state-63617727.json -cmp /tmp/mainnet-state-63617727.json \ - contracts/compatibility/fixtures/mainnet-state-63617727.json -``` - -The script uses SDF's mainnet history archive by default and rejects any -header, selection, count, or hash mismatch. Set `STELLAR_ARCHIVE_URL` to use -another complete mainnet archive. - -## WASM provenance and version checks - -The two `mainnet-*-1.1.0-sdk23.wasm` files were fetched from the live mainnet -contract IDs recorded in the manifest. Their SHA-256 values match the recorded -deployed hashes. - -The SDK 23 prize/cancellation fixture comes from commit `57aa591`. Its runtime -version is `1.3.0`, but its stale embedded contractmeta says `1.2.0`. Both are -recorded and asserted without changing the fixture. - -The SDK 27 events `1.5.0` and profile `1.2.0` files are the canonical release -artifacts built by GitHub Actions on Linux x86_64 with Rust and Stellar CLI -`27.0.0` pinned. CI rebuilds the source and requires exact hash matches. -Mainnet upgrades use these committed files, not a host-local rebuild. - -Synthetic compatibility cases use deterministic operation IDs so their -Soroban ledger snapshots are reproducible. CI reruns the suite and rejects any -snapshot diff. diff --git a/docs/storage-compatibility.md b/docs/storage-compatibility.md new file mode 100644 index 0000000..161348a --- /dev/null +++ b/docs/storage-compatibility.md @@ -0,0 +1,70 @@ +# Storage compatibility + +`contracts/compatibility` replays the next mainnet upgrade against real mainnet +storage. It loads contract data captured from a mainnet ledger, runs the builds +deployed on mainnet today, then proposes, applies and migrates the release build +of this tree the way `docs/upgrade-runbook.md` does it on chain: + +1. Read every event, every winner record and the reputation of every winner + through the deployed events 1.7.0 and profile 1.2.0 builds. The two records + still in the pre-1.7.0 layout cannot be read by 1.7.0, and the test requires + exactly those two to fail. +2. Upgrade the profile (propose, apply, migrate; it stays running), then pause + events, propose and apply its release build (the deployed builds have no + upgrade timelock), page `migrate_events`, check that `migrate` refuses with + `MigrationIncomplete` before the conversion and stamps after it, and + unpause. +3. Read everything again through events 2.0.0 and profile 1.2.1 and require the + same values. The two converted records must carry prize floors equal to what + each position was paid. +4. Run a grant through the upgraded pair on a fresh token (selection, releases, + a forfeit, the close that returns the forfeited share) and check that event + ids continue from the deployed counter. + +The test is marked `#[ignore]` because it needs the release wasm, which a plain +`cargo test` does not build. Run it with: + +```bash +./scripts/test-storage-compat.sh +``` + +The script checks the fixture hashes, the contractmeta versions and the snapshot +provenance against `contracts/compatibility/fixtures/manifest.json`, builds the +release wasm with `scripts/build-release.sh`, and runs the replay. CI runs +the same script after its reproducible build. `BOUNDLESS_WASM_DIR` points the +test at a different build directory. + +## Fixtures + +`mainnet-events-1.7.0.wasm` and `mainnet-profile-1.2.0.wasm` were fetched by hash +from the live mainnet contracts recorded in the manifest +(`stellar contract fetch --wasm-hash --network mainnet`). Uploading them is +what makes the captured contract instances runnable, so a wrong file fails the +test before any assertion. + +`mainnet-state.json` holds every contract-data entry of the two contracts at +mainnet ledger 64,747,647 (protocol 29). Contract code is +excluded because the wasm fixtures supply it, and TTLs are normalised to +`u32::MAX` so nothing expires while the test advances the ledger. The SDK 28 test +host runs protocol 28, so the replay loads the snapshot at protocol 28; nothing +the contracts store depends on the protocol version. + +To check that the fixture still reproduces from the history archive (Stellar CLI +28.1.0, read-only, downloads several gigabytes of archive buckets): + +```bash +./scripts/capture-mainnet-compat-snapshot.sh /tmp/mainnet-state.json +``` + +## Refreshing for the next upgrade + +Once mainnet runs 2.0.0, the replay should start from 2.0.0 instead: + +1. Fetch the deployed wasm for both contracts by hash into the fixtures + directory and replace the two `mainnet-*.wasm` files. +2. Capture a new ledger with + `./scripts/capture-mainnet-compat-snapshot.sh /tmp/mainnet-state.json ` + (an archive checkpoint), copy it to `fixtures/mainnet-state.json`, and record + the printed ledger, timestamp, protocol and hash in the manifest. +3. Update the versions the test expects and drop the assertions about the + pre-1.7.0 records, which will no longer exist. diff --git a/docs/threat-model.md b/docs/threat-model.md index addd583..56c008b 100644 --- a/docs/threat-model.md +++ b/docs/threat-model.md @@ -1,332 +1,544 @@ -# Boundless Platform โ€” STRIDE Threat Model +# Boundless STRIDE Threat Model -**Version:** 1.3 -**Date:** July 2026 (rev. after the events 1.2.0 cancellation-liveness upgrade; prior rev. after the 1.1.0 credit-removal upgrade) -**Scope:** `boundless-events` + `boundless-profile` Soroban contracts and the off-chain orchestrator (`boundless-nestjs`) -**Prepared by:** Boundless Engineering -**Status:** Submitted for SDF Soroban Security Audit Program +**Version:** 1.2 +**Date:** 3 October 2026 +**Prepared for:** Stellar Development Foundation, Soroban Security Audit Bank +**Prepared by:** Boundless Engineering +**Contracts under review:** `boundless-events` 2.0.0 and `boundless-profile` 1.2.1. Mainnet runs 1.7.0 and 1.2.0 until the upgrade in Section 4.4. +**Repository:** github.com/boundlessfi/boundless-contract +**Changes in 1.2:** reworded for clarity, retired threats moved to their own table, flow steps renumbered after the participation removal, statuses limited to four defined values, and Section 4 reorganized. --- -## Section 1 โ€” What Are We Working On? +## Summary -### 1.1 System Description +This is the threat model for the two Soroban contracts behind Boundless: `boundless-events`, which holds prize money in escrow and runs hackathons, bounties, grants and crowdfunding campaigns, and `boundless-profile`, which records builder reputation and earnings. It follows the Stellar Development Foundation's four questions: what are we working on, what can go wrong, what are we going to do about it, and did we do a good job. -Boundless is an on-chain coordination platform for hackathons, bounties, grants, and crowdfunding campaigns on the Stellar network. Its core value proposition is trust-minimised prize settlement: escrow locks at event creation, and releases atomically when winners are selected โ€” sponsor default is structurally impossible. +The model lists 76 threats across the six STRIDE categories, each tied to a step in the on-chain flow and to a trust boundary, and each rated for likelihood and impact. -The system consists of two Soroban smart contracts and an off-chain orchestrator: +| Status | Meaning | Count | +|---|---|---| +| Mitigated | A control in the contracts or in operating procedure addresses the threat. Every contract-level control has a test that proves it fails safely. | 62 | +| Accepted | The remaining risk is carried on purpose, with the reason written down. | 10 | +| Retired | The feature the threat described was removed, so the threat no longer applies. | 4 | +| Open | No treatment yet. | 0 | + +All ten Priority 1 threats, whose failure would be catastrophic, are mitigated and tested. + +**Pending deployment** describes code, not threats: every 2.0.0 fix is in the code under review but not yet on mainnet. Section 4.4 lists what the upgrade involves and what the backend must ship first. + +## 1. What are we working on? + +### 1.1 Overview + +Boundless coordinates hackathons, bounties, grants and crowdfunding campaigns on Stellar. Its central promise is that prize money is safe before anyone starts work: the budget is locked in a Soroban contract when the program is created and can leave only to winners, to milestone recipients, or back to its funders. Neither the owner nor the admin can redirect it. + +Each event is an open pool with published minimum prizes. The owner deposits a budget and publishes a minimum for each prize position (`prize_floors`). An award can be higher than its minimum, never lower, and every award is reserved against the pool so that a later selection cannot promise money an earlier winner is still owed. + +Joining an event and submitting work happen on the platform, not in the contracts. The contracts hold only what money depends on: budgets, contributions, awards, payouts and refunds. + +| Term | Meaning | +|---|---| +| Owner | The account that creates and funds an event. The pool always belongs to the owner and the contributors. | +| Manager | An optional delegate who, once they accept, makes selection and cancellation decisions for one event. Without one, the owner is the manager. The owner can take management back until the first award. | +| Contributor | Any account that adds money to an event's pool. | +| Builder | An account that takes part in an event. A winner is a builder named in a selection. | +| Admin | The platform's 2-of-3 multi-signature account, the only privileged role in either contract. It may appoint a release validator to co-sign crowdfunding payouts in its place. | +| Single-release event | A hackathon or bounty. Each winner collects their prize with `claim_prize` within 90 days. | +| Multi-release event | A grant or crowdfunding campaign, paid per milestone with `claim_milestone`. A grant milestone the owner decides not to pay is closed with `forfeit_milestone`. | +| Managed and external wallets | A managed wallet's key is created, stored encrypted and used by the platform for the user. An external wallet, such as Freighter, keeps its key on the user's device. | + +### 1.2 Scope and assets + +**In scope:** both contracts at the versions above, the calls between them, their admin operations, and admin account custody. The backend, web application and admin portal are covered only where they touch the contracts or hold something that could affect them. + +**Out of scope:** backend and web-application internals, the Didit identity service, the Stellar network and Soroban host (assumed correct, see 1.7), and the issuers of supported tokens. + +| Asset | Where it lives | Why it matters | +|---|---|---| +| Escrow funds | One token balance held by `boundless-events` for all events (80 USDC across two active bounties on mainnet on 3 October 2026) | Critical. Anything that can move or lock it is the highest-value target. | +| Per-event accounting | `remaining_escrow`, `EventOwedTotal`, winner records, prize awards, contributor amounts | Critical. Every payout and refund is computed from it. | +| Admin signer keys | Three signers on separate machines, two required | Critical. The quorum can pause, change fees, re-point bindings and replace contract code. | +| Fee account key | Same custody as the admin | High. Receives all platform revenue. | +| Prize floors and event terms | `EventRecord` | High. The published guarantee builders rely on. | +| Managed wallet keys | PostgreSQL, encrypted per wallet under a master key that exists only in the backend environment | Critical. With the master key they control every managed wallet. | +| External wallet keys | User devices | High for the affected event. | +| Reputation and earnings | `boundless-profile` | Medium. Informational, with no on-chain privilege. | +| Backend secrets | Server environment | Critical for the master key, High for the rest. No server-held secret can act as the admin. | +| Identity data | Didit only | High. Never enters Boundless systems. | +| Off-chain service availability | Backend, RPC provider, Didit | Medium. An outage delays operations but cannot move funds; the contracts can always be called directly. | + +### 1.3 Components | Component | Role | |---|---| -| `boundless-events` | On-chain anchor for all event types. Manages escrow custody (deposit, lock, release, refund), event lifecycle, participant registration, submission anchoring, and winner selection for all four pillars (hackathon, bounty, grant, crowdfunding). | -| `boundless-profile` | Per-user reputation scores and per-token earnings. Called cross-contract by `boundless-events` to bootstrap profiles on application, award reputation on win, and register earnings on payout. (Credit balances were on-chain here through contract 1.0.0; the 1.1.0 upgrade moved them to an off-chain ledger in `boundless-nestjs`.) | -| `boundless-nestjs` | Off-chain orchestrator (NestJS). Holds rich content, user accounts, KYC state, and draft lifecycle. Builds and submits Stellar transactions via RPC. Houses the admin KYC workflow and the server-side admin co-signer. | -| Frontend (`boundless`) | Next.js web app. Runs in the user's browser. Calls the backend API. No direct RPC calls; all chain interaction is mediated by the backend. | -| Admin Portal | Staff-only Next.js app. Calls the backend admin API surface. Enforces step-up TOTP for sensitive mutations. | -| Didit KYC | External identity verification service. Receives user documents; sends HMAC-signed webhooks back to the backend. No PII stored on Boundless infrastructure. | -| Stellar RPC (Nodies) | Managed Soroban RPC endpoint. Backend submits signed transactions; event indexer polls for on-chain events. | -| Admin Multi-sig Account | 2-of-3 Stellar multi-sig G-address (`GCVK72I6TVJVDTTY4UKU6MQT4QJ2T2AAG3NULNEUDM46L3UOQYDSO4O2`). Controls all privileged contract operations (pause, fee changes, upgrade). No single team member can act unilaterally. | -| Organization Treasury Wallets | Stellar classic G-addresses with USDC trustlines. Held by organizer accounts; used to fund event escrow at publish time. | +| `boundless-events` | Escrow and lifecycle for all four event types: deposits, reservations, payouts, refunds, contributor records, winner awards, the grant roster, milestone payouts and forfeits, paged cancellation, manager delegation, and timelocked upgrades with paged migration. Mainnet: `CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ`. | +| `boundless-profile` | Each user's reputation score and lifetime earnings per token. Changed only by the events contract, except that users may create their own empty record. Mainnet: `CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC`. | +| Backend orchestrator | NestJS service holding event content, user accounts, event entries and judging, KYC state and drafts. Builds and sends transactions, indexes contract events, and prepares crowdfunding payouts for co-signing. Runs the managed-wallet service (creates, sponsors, stores and signs). It does not hold the admin quorum. | +| Web application | Next.js front end. External wallets sign in the browser. | +| Admin portal | Staff-only application with a fresh TOTP code required for sensitive changes. | +| Didit KYC | External identity verification. Users send documents to Didit directly; Didit returns signed webhooks. | +| Stellar RPC | Managed Soroban RPC endpoint for sending transactions and reading events. | +| Admin | 2-of-3 multi-signature account `GCVK72I6TVJVDTTY4UKU6MQT4QJ2T2AAG3NULNEUDM46L3UOQYDSO4O2` (three signers of weight 1, medium and high thresholds of 2, master key weight 0). Holds every privileged operation: pause, fees, the token list, upgrades, migration, admin rotation, and appointing the release validator. It co-signs crowdfunding payouts itself while no validator is appointed. | +| Fee account | `GADSIP2HPINWTMEUNMVYA5NJRL372OV52HDEJTRTLDZXMHADIPQNYH55`. Receives platform fees; same custody as the admin. | +| User wallets | Stellar accounts with a trustline to a supported token (USDC on mainnet), either managed or external. | ---- +### 1.4 On-chain flow + +The threat tables in Section 2 refer to these steps by number. + +1. **Deploy and configure.** The admin deploys `boundless-profile`, then `boundless-events` with the admin, fee account, fee rate and profile address. The two are bound with `set_events_contract`; the first binding is one step, and any later change is a timelocked two-step rotation. The admin then registers supported tokens. +2. **Create.** The owner calls `create_event`. For hackathons, bounties and grants, the budget plus the platform fee is taken from the owner in the same transaction; the fee goes to the fee account. Crowdfunding campaigns start empty. Prize floors must be positive and total no more than the budget. A manager may be proposed. +3. **Delegate (optional).** The proposed manager accepts with `accept_manager` within 17,280 ledgers (about one day) and then makes selection and cancellation decisions. Until the first award, the owner can take management back with `reclaim_management`. +4. **Top up.** Contributors call `add_funds` with at least 10 tokens. Outside crowdfunding the fee is paid on deposit; crowdfunding takes its fee at payout. The contract keeps a running total of money from contributors other than the owner, for refunds. +5. **Select.** The manager calls `select_winners` with awards (recipient, position, amount, reputation bump): up to 20 per call for hackathons and bounties, over any number of calls, or one call of up to 40 for a grant. Each position is awarded once, at or above its floor, with a bump of at most 100, and the awards plus everything awarded but unpaid (`EventOwedTotal`) must fit within `remaining_escrow`. A grant gives each recipient one award of at least one stroop per milestone and records it in a grant roster. Hackathon and bounty selections open or extend a 90-day claim window. +6. **Claim a prize.** Each winner calls `claim_prize`. The contract records the payment, transfers the tokens, then updates the winner's profile on a best-effort basis. +7. **Settle a milestone.** For a grant, the owner pays a milestone with `claim_milestone` or closes it unpaid with `forfeit_milestone`, which releases that share but leaves it in the pool. Each milestone is settled once and is worth an even share of the award; the last takes the rounding remainder. The contract records, transfers, then updates the profile best-effort. Crowdfunding also needs the release validator's signature (the admin's while none is appointed), pays the owner `remaining_escrow / milestones_left`, and takes the fee at payout. +8. **Cancel.** The manager calls `start_cancel`, which is refused while a hackathon or bounty prize is in its claim window or a grant award is owed. Without outside contributors the event settles at once; otherwise it enters `Cancelling`, anyone may run `process_cancel_batch` (up to 15 refunds per call) and `finalize_cancel` returns the owner's remainder. A refund an account cannot receive is set aside for `claim_refund`. +9. **Govern.** The admin may pause and unpause, change the fee (at most 10%) and fee account, manage the token list, appoint the release validator, rotate the admin in two steps, and upgrade: `propose_upgrade`, `apply_upgrade`, `migrate_events` (up to 8 events per call) and `migrate` (a one-time version stamp). -### 1.2 Dataflow Diagram - -``` - โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• TRUST BOUNDARY: Internet โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• - โ”‚ โ”‚ - โ”‚ [User Browser] [Sponsor Browser] [Admin Browser] โ”‚ - โ”‚ โ”‚ REST/JWT โ”‚ REST/JWT โ”‚ REST/JWT โ”‚ - โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• - โ”‚ โ”‚ โ”‚ - โ–ผ โ–ผ โ–ผ - โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” - โ”‚ BACKEND API (boundless-nestjs) โ”‚ - โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ - โ”‚ โ”‚ Auth / KYC โ”‚ โ”‚ Event/Escrow โ”‚ โ”‚ Admin v2 โ”‚ โ”‚ - โ”‚ โ”‚ Guard layer โ”‚ โ”‚ Orchestratorโ”‚ โ”‚ (PolicyGuard +โ”‚ โ”‚ - โ”‚ โ”‚ (JWT, TOTP, โ”‚ โ”‚ (build tx, โ”‚ โ”‚ StepUpGuard) โ”‚ โ”‚ - โ”‚ โ”‚ KycGuard) โ”‚ โ”‚ admin cosignโ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ - โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ - โ”‚ โ”‚ PostgreSQL DB (PII-free) โ”‚ โ”‚ - โ”‚ โ”‚ User accounts, event drafts, escrow op log, โ”‚ โ”‚ - โ”‚ โ”‚ KYC status (session_id + status only โ€” no docs) โ”‚ โ”‚ - โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ - โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - โ”‚ - โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• - โ”‚ TRUST BOUNDARY: Off-chain / On-chain โ”‚ - โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• - โ”‚ signed XDR - โ–ผ - โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” - โ”‚ Stellar RPC (Nodies) โ”‚ - โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - โ”‚ Soroban invocation - โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” - โ–ผ โ–ผ - โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” - โ”‚ boundless-events โ”‚โ”€โ”€cross-contractโ”‚ boundless-profile โ”‚ - โ”‚ (escrow, event โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚ (reputation + โ”‚ - โ”‚ lifecycle for โ”‚ โ”‚ earnings) โ”‚ - โ”‚ all 4 pillars) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - โ”‚ - โ”‚ USDC token transfer (SAC) - โ–ผ - โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” - โ”‚ Stellar Ledger โ”‚ - โ”‚ Winner wallets / fee account / โ”‚ - โ”‚ org treasury wallet โ”‚ - โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - - โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• EXTERNAL SERVICE BOUNDARY โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• - โ”‚ โ”‚ - โ”‚ [Didit KYC] โ”‚ - โ”‚ โ”‚ HMAC-signed webhook (POST /api/didit/webhook) โ”‚ - โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค - โ”‚ User browser โ”€โ”€HTTPSโ”€โ”€โ–ถ Didit hosted flow โ”‚ - โ”‚ (documents never touch Boundless servers) โ”‚ - โ”‚ โ”‚ - โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -``` - -**Trust Boundaries:** +### 1.5 Data-flow diagrams + +![Figure 1: System data-flow diagram with trust boundaries](figures/threat-model-figure-1-system-dfd.svg) + +*Figure 1: System data-flow diagram. Element types are identified in the legend; dashed amber regions are trust boundaries.* + +![Figure 2: Escrow lifecycle and authorization](figures/threat-model-figure-2-escrow-lifecycle.svg) + +*Figure 2: Escrow lifecycle inside `boundless-events`. Each step shows which key must sign it and how the pool balance moves; the lower band shows how the pool is accounted for and where money leaves to.* + +### 1.6 Trust boundaries | ID | Boundary | Description | |---|---|---| -| TB1 | Internet / Backend | All user-originated input is untrusted. Enforced by JWT auth, KYC guard, input validation (class-validator + Zod). | -| TB2 | Backend / Stellar network | The network is decentralised; the backend cannot control what other actors submit. Backend verifies all on-chain state before acting. | -| TB3 | Backend / Didit | External service. Webhook authenticity enforced via HMAC. No PII crosses TB3 into Boundless systems. | -| TB4 | Admin browser / Admin Portal / Backend | Staff-only surface. Higher trust but still fully authenticated (OIDC) with step-up TOTP for Tier 2 actions. | -| TB5 | Off-chain / On-chain | The contract enforces its own auth rules independently of the backend. Compromise of the backend does not grant control over on-chain escrow. | +| TB1 | Internet / Backend | All user input is untrusted, and is checked by authentication, KYC status and input validation. The contracts trust nothing the backend accepts (TB5). | +| TB2 | Backend / Stellar network | Anyone can call the contracts directly. The backend reads chain state before acting and never assumes it is the only writer. | +| TB3 | Backend / Didit | External service with HMAC-authenticated webhooks. No identity data crosses into Boundless systems. | +| TB4 | Admin browser / Admin portal / Backend | Staff only, with single sign-on and a fresh TOTP code for sensitive actions. | +| TB5 | Off-chain / On-chain | The contracts enforce every rule themselves, and each state change needs the signature of the owner, manager, winner, contributor or admin quorum. The backend can never do more than the wallets it can sign for: nothing for external wallets, and that wallet's own authority for managed ones. A backend compromise that also obtains the master key could act as any managed wallet (Spoof.10), but never as the admin quorum, whose three signers are external. | +| TB6 | events โ†” profile | The profile contract accepts changes only from the bound events contract, and the events contract treats a failed profile call as non-fatal on both payout paths. | +| TB7 | Owner โ†” Manager | The manager can select, cancel and rotate, but never holds custody: refunds go to the owner and contributors, and only the owner can pay or forfeit milestones. The owner can take management back until the first award. | -**Data Stores:** +### 1.7 Threat actors and assumptions + +| Actor | Capability | Motivation | +|---|---|---| +| Anonymous network participant | Can call any public entry point and replay captured transactions; cannot forge signatures. | Theft, disruption, griefing. | +| Builder or contributor | A participant acting in bad faith, for example removing a trustline so a refund cannot be delivered. | Advantage in a program; griefing an owner. | +| Owner or manager | Can create, fund, select and cancel for their own event; may try to reclaim or redirect a pool. | Financial gain at builders' expense. | +| Compromised backend | Can submit any transaction, corrupt off-chain data and leak secrets. With the master key it can sign as any managed wallet, never as the admin. | Theft from events run by managed wallets; limited by TB5. | +| Compromised single admin signer | One of three signers; cannot meet the threshold alone. | A stepping stone to the quorum. | +| Compromised or coerced admin quorum | Full administrative control, including upgrades (after a 17,280-ledger timelock from 2.0.0; immediately on the 1.7.0 build still deployed). | Theft by replacing contract logic. | +| Token issuer | Can freeze or claw back balances under the asset's policy. | Compliance, not malice; treated as an availability event. | +| Infrastructure providers (RPC, Didit) | Outages, stale or wrong data, forged messages. | Failure or compromise of a third party. | + +The model relies on these assumptions. A threat that needs one of them to fail is out of scope unless listed. + +- The Soroban host behaves as specified: `require_auth` checks for a matching signature, a contract cannot be re-entered during a call, execution is deterministic, and resource limits are enforced. +- Stellar consensus is final; there are no reorganizations. +- Ed25519 signatures cannot be forged, and users control their own keys. A lost key is the user's risk, except where the design makes it everyone's (DoS.9). +- Supported tokens are standard Stellar asset contracts, curated by the admin. +- The admin signers' machines are not compromised at the same time. +- Users who choose a managed wallet accept that the platform holds its key, under the controls in Spoof.10. +- Judging happens off chain. The contracts guarantee custody and the published floors, not the fairness of a selection. +- The contracts use soroban-sdk 28, which reads stored structures leniently: a missing optional field reads as empty and an unknown field is ignored. No control depends on a read failing. The migration recognises the older event layout by its `winner_distribution` field, and a test replays the real mainnet upgrade to confirm it (`docs/storage-compatibility.md`). + +### 1.8 Data stores | Store | Location | Contents | Sensitivity | |---|---|---|---| -| PostgreSQL | Boundless servers | User accounts, event drafts, escrow op log, KYC status (no PII), audit log | Medium โ€” no documents or keys | -| Soroban contract storage | Stellar ledger | Event records, escrow balances, winner assignments, reputation scores, per-token earnings | Public by design โ€” pseudonymous addresses only | -| Didit systems | Didit infrastructure | Identity documents, biometrics, verification decisions | High โ€” held exclusively by Didit | -| Admin multi-sig keys | Distributed (3 signers, separate machines) | Freighter wallet keys (software baseline) | Critical | -| Backend environment | Server environment vars | JWT secret, encryption key, Didit API key, orchestrator signing key | High | +| Events contract, instance storage | Stellar ledger | Admin and pending admin, fee account and rate, pause flag and clock, deployment sequence, profile address, version, pending upgrade, migration cursor, token list, release validator | Public; only the admin writes it. | +| Events contract, persistent storage | Stellar ledger | Event records, managers, contributors and winners (one entry each), prize awards, the grant roster and progress, owed totals, claim-window data, contributor amounts, settled-milestone flags, cancellation state, refunds held for collection | Public, pseudonymous. Event reads extend each record's lifetime. | +| Events contract, temporary storage | Stellar ledger | Idempotency markers keyed by signing address and operation id | Public; each lasts at least 17,280 ledgers (about one day) on mainnet. | +| Profile contract | Stellar ledger | `Profile{bootstrapped_at, reputation}`, earnings per token, admin and binding settings, idempotency markers | Public, pseudonymous. | +| Contract token balance | Stellar ledger | All escrow for all events in one balance; the split per event lives in `remaining_escrow` and `EventOwedTotal` | Critical. Released only by contract logic. | +| PostgreSQL | Boundless servers | Accounts, event entries and drafts, escrow operation log, KYC status (session id and status only), audit log, encrypted managed-wallet keys | Critical for the keys, medium otherwise. | +| Didit | Didit infrastructure | Identity documents, biometrics, decisions | High; held only by Didit. | +| Admin signer keys | Three separate machines | Wallet keys (moving to hardware keys under the custody policy) | Critical. | +| Backend environment | Server environment variables | Master key, session secret, Didit key, transaction settings | Critical (master key). | + +### 1.9 Key parameters + +| Parameter | Value | +|---|---| +| Maximum fee | 1,000 bps (10%) | +| Upgrade timelock | 17,280 ledgers (about one day) on mainnet builds from 2.0.0; 0 on testnet builds. The deployed 1.7.0 build has 0 (Section 4.4). | +| Upgrade proposal expiry | 518,400 ledgers (about 30 days) | +| Admin rotation and release validator acceptance windows | 120,960 ledgers (about 7 days) each | +| Manager proposal expiry | 17,280 ledgers (about one day) | +| Profile binding rotation | 17,280-ledger timelock, 120,960-ledger expiry | +| Prize claim window | 90 days of unpaused time from the most recent selection | +| Awards per `select_winners` call | 20 for hackathons and bounties (repeatable); 40 for a grant (one selection) | +| Refunds per `process_cancel_batch` call | 15 | +| Read page size | 90 entries | +| Reputation bump per award or payout | At most 100 | +| Grant award | At least one stroop per milestone | +| Minimum contribution | 10 tokens (100,000,000 stroops at 7 decimals) | +| Title length | 120 bytes | +| Events per `migrate_events` call | 8 | +| Contributors per event | No cap; each contribution is its own ledger entry, paid for by the contributor | +| Per-transaction limits | 100 footprint entries and 50 written entries on mainnet. A test runs every cap above at its maximum on a test host that enforces these limits. | --- -## Section 2 โ€” What Can Go Wrong? +## 2. What can go wrong? -### STRIDE Reminders +### 2.1 STRIDE categories -| Category | Definition | Key question | -|---|---|---| -| **Spoofing** | Impersonation of another user or system | Could someone perform an action as someone else? | -| **Tampering** | Unauthorized modification of data or code | Could data be altered unexpectedly? | -| **Repudiation** | Denying an action was taken | Can a party deny responsibility for an on-chain or off-chain action? | -| **Information Disclosure** | Unintended exposure of sensitive data | Is private data exposed where it should not be? | -| **Denial of Service** | Making the system unavailable | Can the system be overwhelmed or blocked? | -| **Elevation of Privilege** | Gaining access beyond what is authorized | Can a user obtain permissions they were not granted? | +| Category | Definition | Question it asks | +| --- | --- | --- | +| Spoofing | Pretending to be another user or component. | Is the caller who they say they are? | +| Tampering | Changing data or code without authorization. | Has the data or code been altered? | +| Repudiation | Denying an action that was taken. | Is there evidence of who did what? | +| Information Disclosure | Exposing data that should stay private. | Is anything shared that should not be? | +| Denial of Service | Making the system or funds unavailable. | Can someone block the service or lock funds? | +| Elevation of Privilege | Gaining powers beyond those granted. | Can someone act with authority they were not given? | ---- +### 2.2 Threat table + +Steps refer to Section 1.4, TB numbers to Section 1.6. Ratings are before treatment; Section 3 gives the result. + +Likelihood (L) is how easily the threat can be attempted, given who must act and what access they need: Low, Medium or High. Impact (I) is what is lost if it succeeds: Low (cosmetic or easily reversed), Medium (non-financial data, one flow's availability, or off-chain privacy), High (funds lost or locked for one event or party), or Critical (escrow lost or locked across events, or control of a contract). Priority combines them. P1 is critical impact with medium or high likelihood, or high impact with high likelihood. P2 is critical with low, high with medium, or medium with high. P3 is high with low, medium with medium, or low with high. P4 is everything lower. -### Threat Table +The four retired threats are in Section 4.3, not here. #### Spoofing -| ID | Threat | Affected Component | -|---|---|---| -| Spoof.1 | A caller passes another user's address in `create_event`, `apply`, or `add_funds` to act on their behalf. | `boundless-events` contract | -| Spoof.2 | The backend orchestrator co-signing key is leaked; an attacker uses it to forge admin co-authorization entries on crowdfunding `claim_milestone` calls. | Backend orchestrator, `boundless-events` | -| Spoof.3 | A malicious third party sends a forged Didit webhook to the backend to fraudulently approve a user's KYC status. | Backend `/api/didit/webhook` endpoint | -| Spoof.4 | An attacker reuses a stolen staff JWT to access the admin portal without valid step-up credentials. | Admin portal, backend admin API | -| Spoof.5 | A malicious actor attempts to claim they are the admin multi-sig by submitting a transaction signed by a single key, bypassing the 2-of-3 threshold. | Admin multi-sig account, contract admin functions | +| ID | Threat | Affected component | L | I | Priority | +|---|---|---|---|---|---| +| Spoof.1 | (Steps 2, 4) A caller names another user as `owner` or `from` in `create_event` or `add_funds`, to act or spend on their behalf. | `boundless-events` | H | C | P1 | +| Spoof.2 | (Step 7) An attacker obtains the key that co-signs crowdfunding payouts, for example through a backend compromise, and releases milestones early. | `claim_milestone`, admin custody | L | H | P3 | +| Spoof.3 | A forged Didit webhook approves a user's KYC. | Backend webhook endpoint | M | M | P3 | +| Spoof.4 | A stolen staff session is replayed against the admin portal without a fresh TOTP code. | Admin portal and API | M | M | P3 | +| Spoof.5 | (Step 9) A single signer submits an admin transaction claiming to be the multi-signature account. | Admin account | L | C | P2 | +| Spoof.6 | (Step 6) An attacker claims someone else's prize, or a manager claims a winner's prize into another wallet. | `claim_prize` | H | H | P1 | +| Spoof.7 | (Step 3) An event is given a manager who never agreed, suggesting that a known organization runs it. | Manager delegation | M | L | P4 | +| Spoof.8 | (Steps 6, 7) Something other than the events contract calls `bootstrap`, `bump_reputation` or `register_earnings` on the profile contract. | `boundless-profile` (TB6) | H | M | P2 | +| Spoof.9 | (Step 9) An admin signer's software key is stolen and combined with a second compromised or coerced signer to meet the threshold. | Admin custody | L | C | P2 | +| Spoof.10 | (Steps 2 to 8) An attacker who compromises the backend and obtains the master key acts as any managed owner, manager, builder or winner: selecting their own winners, cancelling an event and withdrawing a managed owner's refund, or claiming prizes. | Managed-wallet service (TB5) | L | C | P2 | #### Tampering -| ID | Threat | Affected Component | -|---|---|---| -| Tamp.1 | An organizer attempts to modify the prize amount or winner allocation after `create_event`, to redirect funds to themselves. | `boundless-events` contract | -| Tamp.2 | An attacker submits a `select_winners` call with a crafted `amounts` vector that sums to more than `remaining_escrow`, draining the contract. | `boundless-events` contract, `escrow.rs` | -| Tamp.3 | A builder attempts to overwrite another builder's submission `content_uri` to substitute their evidence. | `boundless-events` contract | -| Tamp.4 | A malicious or compromised Stellar RPC node returns forged event data to the backend indexer, causing the platform to display incorrect state. | Backend event indexer, Nodies RPC | -| Tamp.5 | The WASM hash in a `propose_upgrade` call is quietly replaced between proposal and application to install malicious contract logic. | Contract upgrade flow (`admin.rs`) | -| Tamp.6 | An attacker intercepts and modifies a partially-signed multi-sig transaction in transit to change the operation parameters (e.g., new admin address). | Admin multi-sig signing workflow | -| Tamp.7 | *(retired in 1.1.0)* An integer underflow in `spend_credits` allows a builder to spend more credits than their balance, wrapping the counter and corrupting credits accounting across the platform. | `boundless-profile` contract 1.0.0, `credits.rs` | -| Tamp.8 | An integer underflow in `remove_applicant` corrupts the applicant index (slot or count wraps to u32::MAX), causing subsequent lookups to find phantom applicants or block legitimate removals. | `boundless-events` contract, `storage.rs` | +| ID | Threat | Affected component | L | I | Priority | +|---|---|---|---|---|---| +| Tamp.1 | (Steps 2, 5) An owner lowers the advertised prizes after builders have committed work. | `boundless-events` | M | H | P2 | +| Tamp.2 | (Step 5) A selection awards more than the pool holds, drawing on other events' money in the shared token balance. | Escrow accounting | M | C | P1 | +| Tamp.4 | A compromised RPC node feeds false event data to the indexer. | Backend indexer | L | M | P4 | +| Tamp.5 | (Step 9) Contract code is swapped between proposing and applying an upgrade, or unreviewed code is applied. | Upgrade flow | L | C | P2 | +| Tamp.6 | (Step 9) A partly signed multi-signature transaction is altered in transit. | Signing workflow | L | C | P2 | +| Tamp.7 | Integer overflow or underflow in an index or counter corrupts a record. | Storage helpers, `select_winners` | L | H | P3 | +| Tamp.8 | (Step 5) An event promises the same money twice. The pool only shrinks when a winner claims, so without a reservation a second selection would see money an earlier winner is still owed. | `select_winners` | M | H | P2 | +| Tamp.9 | (Step 5) A manager awards a position less than its published minimum. | `select_winners` | M | M | P3 | +| Tamp.10 | (Step 9) Records in the older percentage-based layout cannot be read by current code. A migration that stops part-way, stamps the version early, or miscalculates what is owed could strand or double-count money. | `migrate_events`, `migrate` | M | C | P1 | +| Tamp.11 | (Steps 6, 7) The token calls back into the events contract during a payout and gets one claim paid twice. | Payout paths | L | C | P2 | +| Tamp.12 | (Step 5) A position is listed twice in one selection, or awarded again later, so one prize is paid twice. | `select_winners` | M | H | P2 | +| Tamp.13 | (Steps 2 to 8) A backend retry or a replayed request performs one operation twice, such as two deposits or two claims. | Idempotency layer | H | H | P1 | +| Tamp.14 | (Steps 6, 7) The events contract derives operation ids for its profile calls from the caller's operation id. If they were not tied to the caller, an attacker who learned a victim's id could use the derived id first, making the victim's payout fail or skip its profile update. | Idempotency layer (TB6) | L | M | P4 | +| Tamp.15 | (Step 8) A manager cancels a hackathon or bounty after builders have done the work but before any selection, and takes back the budget. | `start_cancel` | M | M | P3 | +| Tamp.16 | (Step 5) A grant selection names one recipient at two positions, leaving one award reserved and unpayable. | `select_winners`, `claim_milestone` | L | M | P4 | +| Tamp.18 | (Steps 5, 7) A grant award smaller than its number of milestones rounds every share but the last to zero, so the award can never be paid. | `select_winners`, `claim_milestone` | L | M | P4 | +| Tamp.19 | (Steps 7, 9) A migration that recalculates what an event owes from its winner records misses forfeits, which write no record, and reserves the forfeited share again; the grant can then never be cancelled. Every upgrade migrates the events created since the last one, so live grants are exposed. | `migrate_events` | M | H | P2 | #### Repudiation -| ID | Threat | Affected Component | -|---|---|---| -| Repud.1 | An organizer claims they never called `select_winners` or disputes the winner list they submitted. | `boundless-events` contract | -| Repud.2 | A winning builder claims they never received their payout. | Stellar ledger, USDC token transfers | -| Repud.3 | A staff member claims they never overrode a KYC decision, or disputes the reason/timestamp. | Backend admin KYC service, audit log | -| Repud.4 | A contributor to an event cancellation claims they never received their refund. | `boundless-events` contract, paged cancel flow | -| Repud.5 | The platform claims an admin co-sign was not performed on a crowdfunding milestone release, to deny a builder's payout claim. | Soroban transaction XDR, backend orchestrator | +| ID | Threat | Affected component | L | I | Priority | +|---|---|---|---|---|---| +| Repud.1 | (Step 5) A manager denies selecting the winners on record. | `select_winners` | M | M | P3 | +| Repud.2 | (Step 6) A winner claims they were never paid. | Stellar ledger | M | M | P3 | +| Repud.3 | A staff member denies making a KYC override. | Backend audit log | L | M | P4 | +| Repud.4 | (Step 8) A contributor claims they were never refunded, or a manager denies starting a cancellation. | Cancellation flow | M | M | P3 | +| Repud.5 | (Step 7) The platform denies co-signing a crowdfunding payout. | Transaction envelope | L | M | P4 | +| Repud.6 | (Step 3) After a disputed selection, a manager denies accepting the delegation, or an owner denies making it. | Manager delegation | L | M | P4 | #### Information Disclosure -| ID | Threat | Affected Component | -|---|---|---| -| Info.1 | All Soroban contract storage is publicly readable; event participants' wallet addresses, prize amounts, and winner assignments are visible on-chain. | `boundless-events` contract, Stellar ledger | -| Info.2 | A data breach of the Boundless PostgreSQL database exposes user PII including identity documents. | Backend database | -| Info.3 | The backend orchestrator co-signing key is exposed via misconfigured environment variables, logging, or a code path that serializes config. | Backend environment, orchestrator service | -| Info.4 | Staff admin JWT tokens or TOTP secrets are exposed via a compromised admin workstation or session fixation attack. | Admin portal, staff auth flow | -| Info.5 | A Didit webhook payload containing partial identity data (e.g., name, status) is logged in plaintext by the backend. | Backend webhook handler, logging | -| Info.6 | The fee account private key (used to receive platform fees) is exposed, allowing fee diversion. | Fee account management, backend config | +| ID | Threat | Affected component | L | I | Priority | +|---|---|---|---|---|---| +| Info.1 | All contract storage is public: addresses, prize floors, awards, earnings and reputation. | Stellar ledger | H | L | P3 | +| Info.2 | A database breach exposes identity documents. | Backend database | L | H | P3 | +| Info.3 | Signing keys or transaction secrets leak through logs, environment dumps or configuration output. | Backend environment | L | M | P4 | +| Info.4 | Staff sessions or TOTP secrets leak from a compromised admin workstation. | Admin portal | L | M | P4 | +| Info.5 | A Didit webhook payload is logged in plain text. | Backend logging | M | M | P3 | +| Info.6 | The fee account key is exposed and fees are diverted. | Fee account custody | L | H | P3 | +| Info.7 | (Step 5) A selection is visible on chain before the owner announces it. | `boundless-events` | H | L | P3 | #### Denial of Service -| ID | Threat | Affected Component | -|---|---|---| -| DoS.1 | An attacker floods the `apply` endpoint for a popular hackathon to exhaust the applicant cap (5,000) with bot accounts, locking out legitimate builders. | `boundless-events` contract, backend API | -| DoS.2 | A large hackathon with thousands of contributors triggers a single-transaction cancel that exhausts Stellar ledger resource limits. | `boundless-events` contract, paged cancel flow | -| DoS.3 | An attacker floods the backend API with unauthenticated requests, causing rate limit exhaustion for legitimate users. | Backend API, `GlobalThrottlerGuard` | -| DoS.4 | The Soroban RPC endpoint (Nodies) becomes unavailable, preventing the backend from submitting or reading any transactions. | Nodies RPC dependency | -| DoS.5 | An attacker submits many failing transactions with high compute units to delay legitimate transaction processing. | Stellar network, Soroban fee market | -| DoS.6 | A malicious webhook sender floods the `/api/didit/webhook` endpoint, exhausting backend processing capacity for KYC events. | Backend webhook handler | +| ID | Threat | Affected component | L | I | Priority | +|---|---|---|---|---|---| +| DoS.1 | (Step 4) Bots flood an event with tiny contributions, or the platform with entries, to bloat storage or crowd out real participants. | Contributor records, backend | H | M | P2 | +| DoS.2 | (Step 8) A cancellation with thousands of contributors needs more work than one transaction allows and never finishes. | Cancellation flow | M | C | P1 | +| DoS.3 | Unauthenticated request floods exhaust the backend. | Backend API | H | M | P2 | +| DoS.4 | The RPC provider becomes unavailable. | RPC dependency | M | M | P3 | +| DoS.5 | Fee-market spam delays legitimate transactions. | Stellar network | M | L | P4 | +| DoS.6 | Webhook floods exhaust KYC processing. | Backend webhook handler | M | L | P4 | +| DoS.7 | (Step 7) A paused or wrongly bound profile contract makes milestone payouts fail, if payouts depend on the profile update. | `boundless-events` (TB6) | L | H | P3 | +| DoS.8 | (Steps 5, 6, 8) Winners never claim, or lose their wallet, and the pool cannot be cancelled while a prize is inside its claim window. | `claim_prize`, `start_cancel` | M | M | P3 | +| DoS.9 | (Steps 3, 5, 8) Once a manager accepts, selection, cancellation and rotation need the manager's signature. If that key is lost, the owner cannot act and there is no admin override. | Manager delegation (TB7) | M | H | P2 | +| DoS.10 | (Step 9) A global pause stops claims and refunds while time-based windows could keep running. | Admin controls | L | H | P3 | +| DoS.11 | A dormant event's ledger entries expire and are unreadable until restored. | Storage lifetime | M | L | P4 | +| DoS.12 | (Step 9) A migration of a deployment with real history does not fit in one transaction; attempted in one go, it fails and leaves every event unreadable. | `migrate_events` | M | C | P1 | +| DoS.14 | (Step 8) A contributor's trustline is removed or frozen, so their refund cannot be delivered; if the batch cannot skip them, every later refund and the owner's remainder stay locked. | Cancellation flow | M | H | P2 | +| DoS.15 | (Steps 2, 4, 7) The fee account lacks or loses a trustline to a supported token, so deposits and crowdfunding payouts in that token fail until the fee account is changed. | Fee account configuration | L | H | P3 | +| DoS.16 | (Step 7) If a grant payout finds the award by reading every winner record, its cost grows with each payment; a grant with eight recipients and ten milestones passes the 100-entry transaction limit partway through and the rest can never be paid. | `claim_milestone` | M | H | P2 | +| DoS.17 | (Steps 5, 8) A batch or page larger than a transaction can hold. At mainnet's limits only 20 hackathon or bounty awards, 42 grant awards, 17 refunds or 97 read entries fit in one call, so a larger grant could never be awarded and larger refund batches and pages fail on big events. | `select_winners`, `process_cancel_batch`, read functions | M | H | P2 | #### Elevation of Privilege -| ID | Threat | Affected Component | -|---|---|---| -| EoP.1 | A builder calls `select_winners` directly (bypassing the backend), attempting to pick themselves as winner on an event they did not create. | `boundless-events` contract | -| EoP.2 | A staff member with `kyc:read` (Tier 0) permission calls the `kyc:override` endpoint (Tier 2) to approve their own or a collaborator's KYC. | Backend admin KYC controller, `PolicyGuard` | -| EoP.3 | An organizer calls `claim_milestone` on a crowdfunding event without the required admin co-authorization, attempting to claim funds early. | `boundless-events` contract, admin.require_auth() | -| EoP.4 | A regular backend API user (builder/organizer) sends requests to the `/admin/v2/*` routes by crafting bearer tokens with elevated claims. | Backend admin API, `StaffAuthGuard` | -| EoP.5 | An attacker calls `bootstrap_self` on `boundless-profile` with another user's address to create or squat a profile record on their behalf. | `boundless-profile` contract | -| EoP.6 | A malicious event owner calls `set_admin` or `propose_upgrade` directly, attempting to rotate the contract admin to an address they control. | `boundless-events` contract, `admin.rs` | -| EoP.7 | The backend orchestrator key is used to approve a `claim_milestone` on behalf of an event where the organizer did not initiate the call, redirecting funds. | Backend orchestrator, `boundless-events` | +| ID | Threat | Affected component | L | I | Priority | +|---|---|---|---|---|---| +| EoP.1 | (Step 5) A builder calls `select_winners` and names themselves. | `select_winners` | H | C | P1 | +| EoP.2 | A read-only staff member performs a KYC override. | Backend authorization | L | M | P4 | +| EoP.3 | (Step 7) An owner releases a crowdfunding milestone without the co-signature. | `claim_milestone` | M | H | P2 | +| EoP.4 | A user's session is used on admin routes. | Backend staff check | M | M | P3 | +| EoP.5 | An attacker calls `bootstrap_self` with another user's address to take over their profile or operation ids. | `boundless-profile` | H | L | P3 | +| EoP.6 | (Step 9) An event owner calls an admin function such as `set_admin`, `propose_upgrade`, `register_supported_token` or `set_fee_account`. | Admin functions | H | C | P1 | +| EoP.7 | (Step 7) A crowdfunding milestone is co-signed for a payout the owner did not ask for. | `claim_milestone` | L | M | P4 | +| EoP.8 | (Steps 3, 5, 8) A manager gains owner powers: redirects refunds, changes the owner, pays milestones, or drains the pool by awarding itself. | Manager delegation (TB7) | M | H | P2 | +| EoP.9 | (Step 7) The owner pays a milestone to a non-winner or for an inflated amount. | `claim_milestone` | M | H | P2 | +| EoP.10 | (Step 9) With no upgrade timelock, a compromised or coerced quorum could propose and apply new code at once, leaving no time to react. | Upgrade flow, both contracts | L | C | P2 | +| EoP.11 | A non-admin calls `admin_slash_reputation`. | `boundless-profile` | M | M | P3 | +| EoP.12 | (Step 9) A non-admin calls `migrate_events` or `migrate` to rewrite records or stamp a version. | Migration functions | H | C | P1 | +| EoP.13 | (Step 1) The profile contract is re-bound to an attacker's contract, which then creates reputation and earnings at will. | `boundless-profile`, binding rotation | L | H | P3 | +| EoP.14 | (Steps 5, 8) A manager cancels a grant after recipients are selected but before they are paid, and the awarded money returns to the owner and contributors. | `start_cancel` (TB7) | M | H | P2 | +| EoP.15 | (Steps 5, 7) The reputation bump is chosen by the manager or owner. Without a cap, anyone could award themselves the maximum score through a small bounty. | `select_winners`, `claim_milestone`, `boundless-profile` | H | M | P2 | +| EoP.16 | (Step 1) The admin re-points the events contract's profile binding in one step (`set_profile_contract` has no timelock), changing every derived operation id at once and possibly stopping profile updates. | `set_profile_contract` (TB6) | L | M | P4 | + +### 2.3 Priority summary + +Of the 72 active threats, 10 are P1, 23 are P2, 23 are P3 and 16 are P4. + +**Priority 1 (10).** The controls whose failure would be catastrophic, and the ones the audit should check first. All are mitigated and tested: Spoof.1 (acting under another user's address), Spoof.6 (claiming another winner's prize), Tamp.2 (spending more than the pool holds), Tamp.10 (migration correctness), Tamp.13 (replayed operations), DoS.2 (cancellations that cannot finish), DoS.12 (a migration too large for one transaction), EoP.1 (selection by someone other than the manager), EoP.6 (admin functions called by a non-admin), EoP.12 (migration called by a non-admin). + +**Priority 2 (23).** Spoof.5 (one signer posing as the multisig), Spoof.8 (forged calls into the profile), Spoof.9 (admin key theft), Spoof.10 (managed-wallet custody), Tamp.1 (lowering advertised prizes), Tamp.5 (swapped upgrade code), Tamp.6 (altered multisig transaction), Tamp.8 (promising the pool twice), Tamp.11 (re-entry during a payout), Tamp.12 (paying one position twice), Tamp.19 (a migration re-reserving a forfeited share), DoS.1 (storage spam), DoS.3 (backend floods), DoS.9 (manager key loss), DoS.14 (an undeliverable refund blocking the rest), DoS.16 (growing payout cost), DoS.17 (batches larger than a transaction), EoP.3 (crowdfunding payout without the co-signature), EoP.8 (manager gaining owner powers), EoP.9 (milestone paid wrongly), EoP.10 (no upgrade timelock), EoP.14 (cancelling an awarded grant), EoP.15 (unlimited reputation). --- -## Section 3 โ€” What Are We Going to Do About It? +## 3. What are we going to do about it? -### Mitigation Table +**Mitigated** means a control in the contracts or in operating procedure addresses the threat, and every contract-level control has a test. **Accepted** means the remaining risk is carried on purpose, for the reason given. Every control here is in the code under review; the fixes made in 2.0.0 reach mainnet only with the upgrade (Section 4.4). -| Threat ID | Mitigation | -|---|---| -| **Spoof.1** | All state-changing contract functions enforce `addr.require_auth()` via the Soroban auth framework. The Soroban runtime validates the caller's cryptographic signature against the address before executing. No caller can submit a valid auth entry for an address they do not control without its private key. | -| **Spoof.2** | The orchestrator co-signing key is scoped exclusively to `admin.require_auth()` within `claim_milestone`. It does NOT control the admin multi-sig account and cannot call `select_winners`, `set_admin`, or any other admin function. A compromise of the orchestrator key does not grant escrow control โ€” the attacker would also need the event organizer's key (separate party). This is accepted residual risk with limited blast radius. Mitigation: rotate the orchestrator key immediately on suspected compromise; the admin multi-sig is not affected. | -| **Spoof.3** | All incoming Didit webhook requests are verified with HMAC-SHA256 using the `DIDIT_WEBHOOK_SECRET` before any payload is processed. Requests with missing or invalid signatures are rejected with HTTP 401 before deserialization. | -| **Spoof.4** | Staff JWTs are short-lived. Tier 2 actions (KYC override) require a valid TOTP code via `StepUpGuard` โ€” a stolen JWT alone is insufficient. Session invalidation is supported via the `BetterAuth` session table. | -| **Spoof.5** | The admin multi-sig account is a Stellar G-address configured with 2-of-3 signers and threshold weights enforced at the Stellar protocol level. A single-signer transaction is rejected by the network before it reaches the contract. The `verify-multisig.sh` script verifies on-chain signer configuration before any governance operation. | -| **Tamp.1** | Prize amounts are locked in `remaining_escrow` at `create_event`. The `select_winners` function computes payouts from `remaining_escrow` at selection time, not from organizer-supplied values at release time. An organizer cannot change the total available after funding. | -| **Tamp.2** | The `select_winners` fee math divides `remaining_escrow` proportionally using basis points. The contract enforces that all percentages sum to 10,000 bps (100%) and releases only from what is held in escrow. An overflowing sum is rejected with `InvalidAllocation`. | -| **Tamp.3** | Submissions are keyed per `(event_id, applicant_address)`. A builder can update their own submission; another address's submission key is inaccessible without their auth. The submitting address is stored at commit time and is immutable thereafter. | -| **Tamp.4** | The backend verifies event existence against the contract before acting (read-then-act). The Nodies RPC endpoint is managed and dedicated; the backend does not follow `_links` navigation. Soroban event payloads include the emitting contract ID; the indexer filters on the known contract address. | -| **Tamp.5** | `propose_upgrade(wasm_hash, new_version)` stores the WASM hash on-chain. `apply_upgrade()` can only be called after the timelock elapses (~1 day) and re-verifies against the stored hash. The proposal is public on-chain; off-chain monitors can detect unexpected upgrade proposals. The admin multi-sig must authorize both steps. | -| **Tamp.6** | Multi-sig transactions are built offline, inspected before signing, and signed independently by each signer. The `verify-multisig.sh` script validates the on-chain signer configuration. Future target state: hardware keys (Yubikey/Ledger) eliminate in-memory key exposure. | -| **Tamp.7** | Retired. In contract 1.0.0 this was mitigated with `profile.credits.checked_sub(amount).ok_or(Error::InsufficientCredits)?` (Scout remediation round 2). The 1.0.0 โ†’ 1.1.0 upgrade then removed on-chain credits entirely โ€” `spend_credits` and `credits.rs` no longer exist, and credit accounting lives in the off-chain ledger in `boundless-nestjs`, where it is covered by that system's own controls. | -| **Tamp.8** | `remove_applicant` now uses `slot.checked_sub(1).ok_or(Error::ApplicantNotApplied)?` and `count.checked_sub(1).ok_or(Error::EventNotFound)?` for all three arithmetic operations. Even though the `if slot == 0` guard above makes underflow structurally impossible, checked arithmetic makes the invariant explicit and contract-level: if the guard were ever removed or the code path changed, the checked operation would surface the error rather than silently wrapping. Fixed in Scout remediation round 2 (`events/storage.rs`). | -| **Repud.1** | `select_winners` emits a `WinnersSelected` Soroban event containing the event ID, winner addresses, and amounts. This event is immutable on the Stellar ledger and publicly auditable on Stellar Expert. | -| **Repud.2** | Every USDC release is an on-chain SAC `transfer` call. The transaction hash, sender, recipient, and amount are permanently recorded on the Stellar ledger. | -| **Repud.3** | Every admin KYC action (sync, retrigger, override) is recorded by `AdminAuditService` inside a database transaction with the staff member's ID, action type, target user ID, timestamp, and decision reason. The audit log is append-only. | -| **Repud.4** | The paged cancel flow emits `ContributorRefunded` for each payout, `OwnerResidualRefunded` when applicable, and `EventCancelled` at settlement. Each refund transfer is also an on-chain SAC `transfer`, providing an account-level payment trail. | -| **Repud.5** | The admin co-sign is a `SorobanAuthorizationEntry` embedded in the signed XDR of the transaction. It is visible in the transaction envelope on Stellar Expert โ€” both the organizer's auth and the admin's auth are present and attributable to their respective addresses. | -| **Info.1** | Wallet addresses are pseudonymous. Rich personal data (submission content, project descriptions) is stored off-chain via `content_uri` (IPFS or backend storage), not in contract storage. This transparency is by design for a trustless settlement platform. Users are informed that their address and prize amounts are publicly visible. | -| **Info.2** | The Boundless PostgreSQL database stores only the Didit `session_id` (opaque token) and a normalized status string (`Approved / Declined / In Review`). Identity documents, biometrics, and personal details are never received or stored by Boundless. A full database breach does not expose KYC documents. | -| **Info.3** | The orchestrator signing key is stored as an environment variable, never logged, and never serialized in API responses. The server-side signing path reads the key only at transaction build time. Key rotation procedure: update the env var and redeploy; the key does not appear in source code or git history. | -| **Info.4** | Staff sessions use short-lived JWTs. Tier 2 actions require a fresh TOTP token. Admin workstations are on separate browser profiles from personal use. Future: hardware-backed staff keys. | -| **Info.5** | The Didit webhook handler logs only the `session_id` and normalized status, never the full payload. Log levels are set to `error,warn,log` in production; raw request bodies are not logged. | -| **Info.6** | The fee account is a Stellar G-address whose key is held by the admin multi-sig (same custody as the contract admin). Fee diversion requires compromising the multi-sig. | -| **DoS.1** | Per-event applicant cap is 5,000 entries. The `apply` endpoint requires a valid JWT and KYC-approved status, raising the cost of bot registration significantly. Per-event credit costs on application are enforced by the off-chain credit ledger at the API layer (since the 1.1.0 upgrade; previously on-chain via `application_credit_cost`), making spam economically prohibitive for events with non-zero credit costs. | -| **DoS.2** | The paged cancel design keeps `start_cancel` O(1) with a per-event `NonOwnerContributionTotal`. Once status is `Cancelling`, `process_cancel_batch(max_refunds=25)` and `finalize_cancel` are permissionless, so manager loss cannot strand an in-progress refund. | -| **DoS.3** | `GlobalThrottlerGuard` applies per-IP rate limits globally. The backend runs behind a load balancer with DDoS protection at the infrastructure layer. | -| **DoS.4** | Nodies is a managed, SLA-backed RPC provider. BullMQ queues buffer all async contract operations; if RPC is temporarily unavailable, jobs retry with exponential backoff and are not lost. The `DistributedLockService` prevents duplicate submissions during retry storms. | -| **DoS.5** | Soroban's fee market (resource fees) prices out spam. The backend uses `simulateTransaction` before submission to estimate fees; operations that would exceed configured limits are rejected before they reach the network. | -| **DoS.6** | The webhook endpoint is rate-limited separately. Didit sends webhooks from known IP ranges; IP allowlisting can be added as a hardening measure. Invalid HMAC requests are rejected before any DB write. | -| **EoP.1** | `select_winners` enforces `resolve_manager(env, event_id, &event.owner).require_auth()`. The manager is always the event owner address (set at `create_event`). No other address can produce a valid auth entry for the event owner. | -| **EoP.2** | `PolicyGuard` checks the staff member's permission set against the required permission declared on the route (`@RequirePermission`). `kyc:override` maps to Tier 2. `StepUpGuard` independently verifies a fresh TOTP token for all Tier 2 routes. These are orthogonal checks โ€” bypassing one does not bypass the other. | -| **EoP.3** | `claim_milestone` in `crowdfunding.rs` calls both `event.owner.require_auth()` AND `admin.require_auth()`. Both must be satisfied in the same transaction. Without the platform's server-side admin co-sign, the transaction is rejected by the contract at the auth validation step. | -| **EoP.4** | The `/admin/v2/*` routes are gated by `StaffAuthGuard`, which validates a separate staff JWT issued by the admin authentication system (BetterAuth with a separate secret). A user JWT from the main app is not valid on the admin surface. | -| **EoP.5** | `bootstrap_self` calls `caller.require_auth()` where `caller` is `env.invoker()`. The invoker is the transaction source โ€” it is cryptographically bound to the account that signed the transaction. A third party cannot produce a valid auth for another user's address. | -| **EoP.6** | `set_admin` and `propose_upgrade` each enforce `admin.require_auth()` at the contract level. The admin is the 2-of-3 multi-sig account. No event owner address is the admin; the check is against the configured admin key stored in instance storage. | -| **EoP.7** | The orchestrator only co-signs `claim_milestone` calls that originate from a backend-authenticated organizer session who is the verified owner of the event in the DB. The co-sign path checks the event ownership record before building the transaction. If the organizer's session is not the event owner, the build is refused before a signing key is accessed. | +| Threat | Treatment | Status | +|---|---|---| +| **Spoof.1** | Every action that changes state requires the signature of the address it acts for (`require_auth()` on the owner, depositor or award recipient), checked before anything is stored. Idempotency markers are keyed by the signing address, so an unsigned caller cannot use up an operation id that a signed action needs. | Mitigated | +| **Spoof.2** | A release validator appointed by the admin co-signs crowdfunding payouts (the admin does while none is appointed). The admin proposes a key (`ReleaseValidatorProposed`) and the key must accept with its own signature within about 7 days, so an uncontrolled address can never become co-signer; the admin can remove it in one step. The validator can be its own multisig, keeping upgrade keys out of routine payouts. The owner must also sign and is the only possible recipient, so a stolen validator key changes timing, not destination. Tests: `a_release_validator_co_signs_instead_of_the_admin`, `a_proposed_validator_co_signs_nothing_until_it_accepts`, `only_the_proposed_key_can_accept`, `replacing_a_validator_keeps_the_old_one_until_the_new_one_accepts`, `clearing_the_validator_returns_co_signing_to_the_admin_at_once`, `an_unaccepted_proposal_expires_or_can_be_withdrawn`. | Mitigated | +| **Spoof.3** | Webhooks carry an HMAC-SHA256 signature over the raw body, and a missing or invalid one is rejected unread. | Mitigated | +| **Spoof.4** | Staff sessions are short-lived and can be revoked centrally, and sensitive routes need a fresh TOTP code. | Mitigated | +| **Spoof.5** | The Stellar protocol enforces the admin account's thresholds, so a single-signer transaction never reaches the contract. Before every governance operation, `scripts/admin/verify-multisig.sh` confirms three ordinary signing keys of weight 1 (a pre-authorized or hash signer would count without a person behind it), master weight 0, thresholds 0/2/2 and, with `EXPECTED_SIGNERS`, exactly the signers on file. CI tests the script against recorded failures (`scripts/test-admin-scripts.sh`). | Mitigated | +| **Spoof.6** | `claim_prize` takes no recipient argument: the recipient comes from the stored award, must match the winner record and must sign, and only that address is paid. | Mitigated | +| **Spoof.7** | Delegation takes two steps: `propose_manager`, then `accept_manager` signed by the proposed address. Proposals expire after 17,280 ledgers and can be withdrawn with `cancel_pending_manager`. `ManagerProposed` and `ManagerChanged` make the timeline public, and replacing a pending proposal emits `PendingManagerCancelled` first. Test: `replacing_a_pending_manager_is_on_the_record`. | Mitigated | +| **Spoof.8** | The profile contract's four update functions require the signature of the stored events contract address. For a contract this only succeeds when it is the direct caller, so nothing else can satisfy it. | Mitigated | +| **Spoof.9** | Signers keep keys on separate machines under a written custody policy, every admin action needs two of them, and each simulates and inspects a transaction before signing. The policy schedules a move to hardware keys at set value and incident triggers; until then, the risk of two signers being compromised together is carried. | Accepted | +| **Spoof.10** | Each managed key is encrypted with its own data key, itself encrypted by a rotatable master key held only in the backend environment; keys are decrypted only to sign. A separate sponsor pays network fees, so managed wallets hold no XLM to drain. Every managed-wallet action is attributable on chain, and organizers can use an external wallet for high-value programs. Planned hardening: a KMS or HSM for the master key, external signing above a value threshold, and alerts on unusual activity. The remaining custody risk is carried and disclosed. | Accepted | +| **Tamp.1** | Prize floors are written once at `create_event` and never change, and the budget is taken at creation, so the pool exists before builders see the event (see also Tamp.9). | Mitigated | +| **Tamp.2** | `select_winners` totals the batch with overflow-checked arithmetic, adds what is already reserved (`EventOwedTotal`), and refuses with `InsufficientEscrow` if that exceeds `remaining_escrow`; both payout paths check again. Since every payout enforces the event's own balance, one event cannot spend another's money. The escrow, prize and grant suites check recipient and fee-account balances. | Mitigated | +| **Tamp.4** | The indexer accepts events only from the known contract addresses and confirms them with `get_event` before acting. The RPC endpoint is a dedicated managed node. | Mitigated | +| **Tamp.5** | `propose_upgrade` stores the code hash, and `apply_upgrade` uses only that hash, requires the admin, and must come after the timelock and within 30 days. The runbook (`docs/upgrade-runbook.md`) requires reproducing the hash from source and simulating every admin transaction before signing. The review window exists on mainnet only once the timelock is deployed (EoP.10). | Mitigated | +| **Tamp.6** | Transactions are built offline, simulated and inspected by each signer, and signers keep keys on separate machines (Spoof.9). | Mitigated | +| **Tamp.7** | Where an overflow would matter (the event id counter, the contributor index, the winner index in `select_winners`, award and reservation totals), arithmetic is overflow-checked with a typed error. Counts that only go down (unclaimed prizes, the token list) stop at zero. The release build sets `overflow-checks = true`, so any remaining plain arithmetic stops the transaction instead of wrapping. | Mitigated | +| **Tamp.8** | Each event keeps a running total of what it owes (`EventOwedTotal`). `select_winners` reserves each batch on top of it and refuses if the total would exceed `remaining_escrow`. Each payout lowers both together and fails safely if they disagree. `start_cancel` releases the reservation only when no prize is in its window and no grant award is owed (EoP.14). | Mitigated | +| **Tamp.9** | `create_event` requires positive floors totalling at most the budget, and `select_winners` refuses any amount below its floor with `InvalidDistribution`. Positions without a floor take any positive amount, by design. | Mitigated | +| **Tamp.10** | `migrate_events` (admin only) converts records page by page from a stored cursor, up to 8 per call, and `migrate` refuses with `MigrationIncomplete` until all are converted. Old records are read with an exact copy of their original structure, and each floor is `total_budget ร— percent / 100`, exactly what that position would have been paid. Only the record is rewritten. The two records still in the old layout are completed mainnet bounties with every award paid, so nothing needs reserving again (Tamp.19). A test replays the full mainnet upgrade against captured mainnet storage, and testnet was migrated across 185 events in 24 calls. | Mitigated | +| **Tamp.11** | The Soroban host does not allow re-entry during a call, and supported tokens are admin-approved. Both payout paths and `claim_refund` also record the payment, including the operation marker, before transferring, so a call-back would find it already recorded. | Mitigated | +| **Tamp.12** | A selection listing a position twice is refused. Across selections, the stored award for each position stops it being awarded again. A grant selects once, with one award per recipient (Tamp.16). `claim_prize` refuses an award already paid with `PrizeAlreadyClaimed`. | Mitigated | +| **Tamp.13** | Every call that moves money or changes a record carries a 32-byte operation id; a marker under the signing address and that id rejects repeats with `OpAlreadySeen`. Manager rotation and admin functions rely on Soroban's authorization nonces. A marker lasts at least 17,280 ledgers (about one day), longer than backend retries, after which the original signature has expired and a replay needs a new one. A refund batch size of zero is refused with `InvalidBatchSize`, so a stranger cannot burn the backend's next operation id. Test: `an_empty_refund_batch_cannot_burn_the_crank_op_id`. | Mitigated | +| **Tamp.14** | Derived ids hash (SHA-256) the caller's operation id, a tag, an index, the profile address and the original signer, so one id used by two callers yields unrelated derived ids. Profile calls are also best-effort (DoS.7), so a collision could cost a reputation update, never a payout. Tests: `someone_reusing_an_op_id_cannot_block_or_strip_another_payout`, `sha256_child_ids_differ_for_xor_colliding_parents`. | Mitigated | +| **Tamp.15** | Cancelling before selection is a deliberate owner right: the pool is the owner's money until awarded, and the contracts have no entry deadline. The platform's terms and the public `EventCancelled` record are the controls. | Accepted | +| **Tamp.16** | A grant naming a recipient twice is refused with `DuplicateRecipient` before anything is reserved. Test: `one_recipient_cannot_hold_two_awards_in_a_grant`. | Mitigated | +| **Tamp.18** | A grant award smaller than its number of milestones is refused with `InvalidDistribution`, so every milestone pays at least one stroop. Test: `an_award_too_small_to_split_is_refused`. | Mitigated | +| **Tamp.19** | `migrate_events` converts the record layout and nothing else; it does not recalculate amounts owed or awards, which every live payout path keeps current. The only records awaiting conversion need neither. Test: `a_migration_pass_after_a_forfeit_keeps_it_released`. | Mitigated | +| **Repud.1** | The selection, its winner records and its awards are written in the transaction the manager signed, which is public. Each award also emits `WinnerAwarded` with the event, recipient, position and amount. Test: `each_award_and_each_cancel_branch_is_on_the_record`. | Mitigated | +| **Repud.2** | `WinnerPaid` (event, recipient, position, amount) is emitted with the transfer, and the payment time can be read with `get_winner_at`. | Mitigated | +| **Repud.3** | An append-only audit log records the staff member, action, target, time and reason in the same database transaction as the change. | Mitigated | +| **Repud.4** | Each refund emits `ContributorRefunded` or `OwnerResidualRefunded` with its transfer, and `EventCancelled` marks the end. `CancellationStarted` records the refund calculation, a share that rounds to zero still emits a zero refund, a refund set aside emits `RefundDeferred`, and a crowdfunding payout emits `MilestoneFeeCharged` beside `MilestoneClaimed`. The manager's signature on `start_cancel` is public. Tests: `each_award_and_each_cancel_branch_is_on_the_record`, `a_release_records_the_fee_it_withheld`. | Mitigated | +| **Repud.5** | The co-signer's signature is part of the public transaction. | Mitigated | +| **Repud.6** | `ManagerProposed`, `ManagerChanged` and `PendingManagerCancelled` are emitted, and acceptance needs the new manager's own signature. | Mitigated | +| **Info.1** | Public storage is inherent to a trustless settlement layer. Addresses are pseudonymous, event content stays off chain behind `content_uri`, and users are told that addresses and amounts are public. | Accepted | +| **Info.2** | The database stores only Didit's session id and a status. Documents and biometrics never reach Boundless. | Mitigated | +| **Info.3** | Secrets live only in environment variables and are never logged or serialized; rotating the master key re-encrypts every wallet's data key. No server secret can act as the admin, and only the master key matters for escrow (Spoof.10). A validator key held by the backend (Spoof.2) has the same protection and can only co-sign an owner-signed payout to the owner. | Mitigated | +| **Info.4** | Short-lived sessions, a fresh TOTP code for sensitive actions, and dedicated browser profiles. Hardware-backed staff keys are planned. | Mitigated | +| **Info.5** | The webhook handler logs only the session id and status, and production logs exclude request bodies. | Mitigated | +| **Info.6** | The fee account has the same 2-of-3 custody as the admin, and only the admin can change it, which emits `FeeAccountUpdated`. | Mitigated | +| **Info.7** | Inherent to a public ledger. The backend sends selection and announcement minutes apart, and the owner decides when to submit. | Accepted | +| **DoS.1** | Contributors are the only participant list on chain. Each contribution is its own ledger entry, paid for by the contributor and at least 10 tokens, so spam funds its own storage. Nothing processes a whole list at once: refunds run 15 at a time, selection takes at most 20 awards (40 for a grant), reads page at 90, grant payouts read the roster (DoS.16), and `migrate_events` reads one record per event. Taking part on the platform requires a KYC-verified session. | Mitigated | +| **DoS.2** | `start_cancel` does fixed work: it reads the running total of outside contributions, records the refund calculation and enters `Cancelling`. Anyone can run `process_cancel_batch` and `finalize_cancel`, so a missing manager cannot stall refunds. Tested with 220 contributors, and a full batch of 15 within mainnet's limits of 100 entries and 50 writes. | Mitigated | +| **DoS.3** | Per-IP rate limiting plus infrastructure-level DDoS protection. | Mitigated | +| **DoS.4** | Transactions are queued and retried with backoff and distributed locks. A failover RPC provider is planned; until then, depending on one provider is carried. | Accepted | +| **DoS.5** | Soroban resource fees make spam expensive, and the backend simulates every transaction and refuses operations beyond configured limits. | Mitigated | +| **DoS.6** | Webhooks have their own rate limit, an invalid HMAC is rejected before anything is written, and IP allow-listing is available. | Mitigated | +| **DoS.7** | Both payout paths call the profile contract best-effort (`try_`) after the transfer, so a paused or wrongly bound profile contract can delay a reputation update but never a payout; a missed update can be rebuilt from `MilestoneClaimed` and `WinnerPaid`. Tests: `a_paused_profile_does_not_hold_up_payouts`, `a_broken_profile_binding_does_not_hold_up_payouts`. | Mitigated | +| **DoS.8** | Prizes can be claimed for 90 days from the most recent selection, and `start_cancel` is refused meanwhile; afterwards unclaimed money returns through the normal refunds, contributors first. This relies on an available manager (DoS.9) and refund recipients who can receive the token (DoS.14). | Mitigated | +| **DoS.9** | Until the first award, the owner can take management back with `reclaim_management` (emits `ManagementReclaimed`, clears any proposal). After it, awarded money stays reachable without the manager: winners claim, the owner pays or forfeits milestones, and anyone can run refunds once cancellation starts. The remaining case is in Section 4.5. Tests: `the_owner_takes_management_back_before_any_award`, `after_selection_management_stays_with_the_manager`. | Mitigated | +| **DoS.10** | Pausing is the intended emergency brake: admin-only, emitting `Paused` and `Unpaused`, with a written incident record. It never moves escrow, and admin functions keep working. Claim windows count only unpaused time. Proposal expiries are not extended; at worst they cost a new proposal. Tests: `time_spent_paused_does_not_run_down_the_claim_window`, `a_winner_can_claim_after_a_long_pause`. | Mitigated | +| **DoS.11** | Each `get_event` read extends the record's lifetime to about 90 days once it falls below 86,400 ledgers, and new mainnet entries start with about 120 days. Instance storage is extended on every admin write. Anyone can restore an expired entry with `RestoreFootprint`, and the indexer reads the events it tracks. | Accepted | +| **DoS.12** | `migrate_events` is paged over a stored cursor and converts at most 8 events per call, reading one record each. `migrate` refuses until the cursor reaches the newest event. | Mitigated | +| **DoS.14** | Each refund is attempted with `try_transfer`. One the account refuses (frozen, or no trustline) is set aside, `RefundDeferred` is emitted and the batch moves on, so the other refunds and `finalize_cancel` proceed. The contributor later collects it with `claim_refund`, signed by them and paid only to them; `get_unclaimed_refund` shows the amount. Also tested on testnet with an issuer freeze. Tests: `a_frozen_partner_cannot_stall_everyone_else_s_refund`, `a_partner_who_dropped_their_trustline_cannot_stall_the_others`. | Mitigated | +| **DoS.15** | Only an admin mistake causes this, and `set_fee_account` reverses it. `scripts/deploy/register_token.sh` refuses to add a token unless it wraps the named asset and `scripts/admin/verify-fee-trustline.sh` confirms the fee account trusts it; the runbook runs the same check before changing the fee account. `FeeAccountUpdated` and `TokenRegistered` are the monitoring hooks. | Accepted | +| **DoS.16** | A grant selection writes a roster mapping each recipient to their award; each payout reads it and that recipient's progress, so its cost never grows. A grant selected before the roster existed cannot be paid, and mainnet has never held a grant. Crowdfunding payouts go straight to the owner. Tests: `a_release_costs_the_same_however_large_the_grant_grows`, `the_largest_grant_selects_and_releases_every_milestone` (40 recipients, 10 milestones, within mainnet's limits), `claim_milestone_pays_only_the_campaign_owner`. | Mitigated | +| **DoS.17** | Every cap was measured at mainnet's limits, which the test host enforces: 20 awards per hackathon or bounty selection, 40 for a grant, 15 refunds per batch, 90 entries per page. Tests run each at its maximum and one past it. The backend must use the same sizes (Section 4.4). Tests: the `limits` group in `grant_scenarios`. | Mitigated | +| **EoP.1** | `select_winners` requires the current manager's signature (the owner's if there is no manager). | Mitigated | +| **EoP.2** | Each route declares its permission and a policy check enforces it; sensitive routes also need a fresh TOTP code. | Mitigated | +| **EoP.3** | `claim_milestone` requires the owner's signature and, for crowdfunding, the release validator's (the admin's while none is appointed), in the same transaction. Tests check that the admin's signature alone is not enough once a validator is appointed. | Mitigated | +| **EoP.4** | Staff sessions use a separate issuer and secret, so user sessions fail the staff check. | Mitigated | +| **EoP.5** | `bootstrap_self` needs the user's own signature and keys its operation ids to that user, so it cannot touch events-contract markers. It only creates an empty profile, so there is nothing to gain. | Mitigated | +| **EoP.6** | Every admin function first requires the stored admin's signature, and admin rotation takes two steps with a 7-day expiry. Tests check the signature is really required, not mocked. | Mitigated | +| **EoP.7** | The owner must sign the same transaction as the co-signer, the money goes only to the owner, and the amount is calculated from the pool. The backend prepares the transaction only for the signed-in owner. | Mitigated | +| **EoP.8** | The manager can select, cancel and rotate. It cannot change the owner (no function exists), receive refunds, pay milestones, or change floors. It can award any address, including its own: judging is off chain by design, and the owner chooses whom to delegate to. `ManagerChanged` is on chain before any selection. | Accepted | +| **EoP.9** | The recipient must hold an award in the grant roster, and the amount comes from that award (grants) or from `remaining_escrow / milestones_left` (crowdfunding), never from the caller. Each milestone is settled once and must be in range. | Mitigated | +| **EoP.10** | Mainnet builds have a 17,280-ledger upgrade timelock from events 2.0.0 and profile 1.2.1; testnet builds keep zero, and `deploy_mainnet.sh` always builds without the testnet setting. The deployed 1.7.0 and 1.2.0 builds have no timelock until the upgrade in Section 4.4, which itself runs without one. Tests: `apply_upgrade_waits_out_the_timelock`, `apply_upgrade_waits_out_the_timelock_profile`. | Mitigated | +| **EoP.11** | `admin_slash_reputation` requires the admin and a non-empty reason, emits `AdminReputationSlashed`, and is the only way to lower a score. | Mitigated | +| **EoP.12** | Both migration functions require the admin, the cursor only moves forward, and `migrate` runs once per version. | Mitigated | +| **EoP.13** | After the first binding, a change is `propose_events_contract`, a 17,280-ledger wait, then `accept_events_contract` within 7 days, all admin-only and all emitting events. The wait only means something once the profile's upgrade timelock is deployed (EoP.10). | Mitigated | +| **EoP.14** | `start_cancel` refuses a grant while any award is owed (`AwardsOutstanding`). Each milestone ends, signed by the owner, either paid with `claim_milestone` or closed with `forfeit_milestone`, which emits `MilestoneForfeited` and releases that share without moving it. No award disappears silently, and one recipient's milestones do not affect another's. Tests: the `forfeits` group in `grant_scenarios` and the randomized run, which mixes payments and forfeits. | Mitigated | +| **EoP.15** | `select_winners` and `claim_milestone` refuse a reputation bump above 100 with `ReputationBumpTooLarge`, and the profile contract refuses one above 100 per call with `DeltaTooLarge`, so even a faulty events contract cannot move a score far at once. Reputation grants no on-chain privilege, and earnings come from actual transfers. The admin slash is uncapped because it is how a farmed score is corrected. Tests: `reputation_per_award_and_per_release_is_capped`, `bump_over_the_per_call_cap_is_refused`, `admin_slash_is_not_capped`. | Mitigated | +| **EoP.16** | Only the admin can change the binding, it emits an event, and it can be reversed in one step. The profile side has a timelock (EoP.13) because it can create reputation; the events side cannot move money. A two-step change is a possible future improvement. | Accepted | --- -## Section 4 โ€” Did We Do a Good Job? +## 4. Did we do a good job? -### Dataflow Diagram Utility +**Has the data-flow diagram been used since it was created?** +Yes. Drawing it made two boundaries explicit that the code alone did not: owner and manager within an event (TB7), and the two contracts (TB6). Working through TB7 produced Spoof.7, Repud.6, DoS.9, EoP.8 and EoP.14; working through TB6 produced Spoof.8, Tamp.14, DoS.7, EoP.13 and EoP.16. Figure 2 showed straight away that the cancellation guard covered only one of the two kinds of event. -The dataflow diagram directly informed our threat analysis. Mapping the trust boundary between the off-chain backend and the on-chain contracts (TB5) was the most productive part of the exercise โ€” it clarified that compromise of the backend orchestrator does not automatically translate to loss of on-chain escrow, because the contracts enforce their own auth rules independently. This shaped our decision to scope the orchestrator co-signing key narrowly (crowdfunding admin co-auth only) rather than giving it broader permissions. +**Did the model find issues that had not been considered before?** +Yes, ten issues nobody had written down: a lost manager key stranding a pool (DoS.9), one undeliverable refund blocking the rest (DoS.14), cancellation of an awarded grant (EoP.14), unlimited reputation bumps (EoP.15), derived operation ids not tied to the signer (Tamp.14), a grant naming one recipient twice (Tamp.16), payouts depending on the profile contract (DoS.7), inconsistent payout ordering (Tamp.11), gaps in the event record (Repud.1, Repud.4), and payouts co-signed with the upgrade keys (Spoof.2). All are fixed in 2.0.0 (Section 4.2). It also made explicit that managed wallets extend a backend compromise to escrow (Spoof.10, accepted, Section 4.5) and that mainnet had no upgrade timelock and two records in the old layout (EoP.10, Tamp.10, resolved by the upgrade, Section 4.4). Tamp.17 and DoS.13 were retired rather than fixed (Section 4.3). -### STRIDE Coverage Assessment +**Did the treatments in Section 3 address the threats?** +For 62 of the 72 active threats, yes. Every contract-level control has a test: 386 pass (326 for `boundless-events`, 60 for `boundless-profile`), a further test replays the next mainnet upgrade against captured mainnet storage, and the grant lifecycle has run on testnet with exact balance checks (Section 5). Backend and process controls are covered by the backend's tests and procedures. Tamp.5 and EoP.13 depend on the upgrade timelock and are fully effective on mainnet only once EoP.10 is deployed. The other ten threats are accepted with written reasons. Auditors' views on the designs chosen for DoS.9, DoS.14 and EoP.14 are welcome. -All six STRIDE categories produced actionable threats. The most significant findings: +**Were further issues found after the model was written?** +Yes, four, all fixed. Running every entry point at mainnet's per-transaction limits, which the test host now enforces, found DoS.16 (grant payouts whose cost grew until they no longer fit), DoS.17 (batches and pages larger than a transaction) and Tamp.18 (grant awards too small to split); earlier tests never reached those limits. Reviewing a Scout static-analysis scan then found Tamp.19 (a migration that could reserve a forfeited share again). The model will be revised after the audit report and whenever the architecture changes materially: a new event type, authorization flow or external service, or an upgrade that changes the storage layout. -- **Spoofing:** `require_auth()` coverage across all contract functions is thorough, but the orchestrator key's scope needed explicit documentation. The key's limited blast radius (covered under Spoof.2) was identified during this exercise and has been documented in the operational runbooks. -- **Tampering:** The `select_winners` math (Tamp.2) was scrutinized in the June 2026 Stellar-skill audit (finding M1). The fix โ€” computing winner payouts from `remaining_escrow` at selection time โ€” was already applied, but the threat model gave us additional confidence that the math is correct. -- **Information Disclosure:** Info.2 (database breach does not expose KYC documents) is the strongest privacy property of the design, enabled by the architectural decision to keep PII exclusively with Didit. This would not have been called out as explicitly without the Information Disclosure category forcing the question. -- **Denial of Service:** DoS.2 was the design driver for the paged cancellation architecture. The events 1.2.0 review found that the original `start_cancel` snapshot still contained an unbounded scan and that manager-only crank authorization created a second liveness dependency. The running total and permissionless crank close both gaps. -- **Elevation of Privilege:** EoP.3 (crowdfunding claim requires admin co-auth) is the most operationally sensitive control. The threat model confirmed that the dual-auth design is correctly implemented and the blast radius of an orchestrator key leak is bounded. +**What would improve the process next time?** +Modelling the owner and manager boundary as carefully as a system boundary proved valuable, and the grant-committee multisig will get the same treatment before it is built. Every signature check and transfer should also face two questions from the start: what if this key is lost, and what if this transfer fails? Asking them late produced DoS.9 and DoS.14. -### Unresolved / Residual Risks +### 4.1 Open items -| Risk | Status | Acceptance Rationale | -|---|---|---| -| Orchestrator co-signing key compromise (Spoof.2, EoP.7) | Accepted, monitored | Blast radius is limited to crowdfunding claim timing; attacker also needs organizer's key. Key rotation procedure is documented. | -| Nodies RPC single point of failure (DoS.4) | Accepted, mitigated | Queue buffering handles transient outages; failover RPC endpoint planned for mainnet. | -| Software multi-sig (vs. hardware) for admin keys | Accepted, time-bounded | Hardware upgrade is triggered at $250K TVL or first signer-machine incident per the admin custody policy. | -| All contract storage public on-chain | Accepted by design | Pseudonymous addresses; PII off-chain via `content_uri`. Informed user consent. | +None. Every threat is mitigated, accepted with a reason, or retired. -### Post-Modeling Changes +### 4.2 Closed in 2.0.0 -Four issues surfaced during or directly after the modelling process: +These fixes are in the code under review. None of them protects mainnet until the upgrade in Section 4.4. Tests for each are named in Section 3. -1. The orchestrator key's scope was not formally written down anywhere. This threat model prompted us to document the key's exact permissions and rotation procedure in the admin runbook. -2. The audit log for KYC overrides did not originally include the `reason` field in the initial implementation. Reviewing the Repudiation category prompted us to confirm this was added and tested -- it is present in `AdminKycActionsService.override()`. -3. **(v1.1)** A second Scout static analysis run after this document was first published identified two previously-undocumented integer underflow vectors: `profile/credits.rs` (Tamp.7) and `events/storage.rs` (Tamp.8). Both were fixed by converting bare `- 1` and `-= amount` operations to `checked_sub` with typed error returns. These threats have been added to Section 2 and Section 3 in this revision. -4. **(v1.1)** The ENHANCEMENT category in the Scout report flagged ~50 profile contract functions for missing event emissions. Code review confirmed all state-mutating functions already emit events in their implementation modules; Scout cannot trace through function call chains. Documented as false positives. -5. **(v1.2)** The 1.0.0 โ†’ 1.1.0 contract upgrade (2026-06) removed per-user credit balances from the profile contract; credits now live in an off-chain ledger in `boundless-nestjs`. Component descriptions, the dataflow diagram, and the data-store table were updated; Tamp.7 was marked retired (its subject code, `credits.rs`, no longer exists on-chain); EoP.5 and DoS.1 were reworded to match the post-upgrade surface. Credit-ledger threats are now in scope of the backend's threat surface (TB1), not the contract's. +| ID | Issue | Fix | Error or event | +|---|---|---|---| +| EoP.10 | No upgrade timelock | 17,280 ledgers on mainnet builds of both contracts | `UpgradeTimelockNotElapsed` | +| DoS.9 | A lost manager key strands the pool | `reclaim_management`, signed by the owner, until the first award | `ManagementReclaimed` | +| DoS.14 | One refund blocks all the others | Undeliverable refunds are set aside and collected with `claim_refund` | `RefundDeferred`, `NoRefundOwed` | +| EoP.14 | An awarded grant could be cancelled | Cancellation refused while anything is owed; `forfeit_milestone` | `AwardsOutstanding`, `MilestoneForfeited` | +| DoS.7 | Profile availability could block milestone payouts | Best-effort profile calls after the transfer | none | +| Tamp.11 | Milestone payouts transferred before recording | Payment and marker recorded before the transfer | none | +| Tamp.14 | Derived operation ids not tied to the signer | Signing address included in the derivation | none | +| Tamp.16 | A duplicate recipient strands a reservation | Refused at selection | `DuplicateRecipient` | +| Tamp.18 | An award too small to split | Each award at least the number of milestones | `InvalidDistribution` | +| Tamp.19 | A migration could reserve a forfeited share again | Migration converts the record layout only | none | +| EoP.15 | No limit on reputation bumps | At most 100 per award, per payout and per profile call | `ReputationBumpTooLarge`, profile `DeltaTooLarge` | +| DoS.16 | Grant payout cost grows with the grant | Grant roster and per-recipient progress | none | +| DoS.17 | Caps larger than a transaction can hold | 20 and 40 awards, 15 refunds, 90-entry pages | `InvalidWinnerPosition` past a cap | +| Tamp.13 | An empty refund batch could use up an operation id | Batch size of zero refused | `InvalidBatchSize` | +| Spoof.7 | A replaced manager proposal left no record | `PendingManagerCancelled` emitted first | `PendingManagerCancelled` | +| Tamp.7 | Unchecked addition on the winner index | Overflow-checked addition | `InvalidWinnerPosition` | +| Repud.1, Repud.4 | Gaps in the event record | Per-award, cancellation-started, zero-refund and fee events | `WinnerAwarded`, `CancellationStarted`, `MilestoneFeeCharged` | +| Spoof.2 | Upgrade keys co-signed routine payouts | Release validator, appointed in two steps and removable at once | `ReleaseValidatorProposed`, `ReleaseValidatorUpdated`, `ValidatorProposalCancelled` | +| DoS.10 | A pause ran claim windows down | Claim windows count only unpaused time | none | +| Spoof.5 | The multisig check only counted signers | Signer type, uniqueness and roster checks | none | + +### 4.3 Retired threats + +These threats concerned on-chain applications and submissions, which 2.0.0 removed; taking part in an event is now handled by the platform. Nothing on chain ever relied on those records, since selection and both payout paths check only the stored award and the caller's signature. The IDs are kept so earlier versions of this document can be traced. + +| ID | What it was | Why it no longer applies | +|---|---|---| +| Tamp.3 | A builder's submission overwritten or withdrawn by someone else | There are no on-chain submissions. | +| Tamp.17 | A submission rewritten after judging | Submissions are platform records with their own revision history. | +| Repud.7 | A dispute over what a submission pointed to | The contract no longer records submissions. | +| DoS.13 | Grant submissions that could never succeed | The entry points involved were removed. | -6. **(v1.3)** The events 1.2.0 cancellation-liveness upgrade replaced the unbounded `start_cancel` contributor scan with an O(1) running total and made cancellation batching and finalization permissionless after the manager starts cancellation. Mainnet was verified to contain no event rows before the storage change. +### 4.4 Pending deployment -### Living Document Commitment +| Item | What is needed | +|---|---| +| Mainnet upgrade | Mainnet runs events 1.7.0 and profile 1.2.0. Every fix in Section 4.2 takes effect only after the admin multisig upgrades both, to events 2.0.0 and profile 1.2.1, following `docs/upgrade-runbook.md` Section 8. The deployed builds have no timelock, so this upgrade applies immediately; every later one waits 17,280 ledgers (EoP.10). | +| Old-layout records (Tamp.10) | Two mainnet event records cannot be read until converted. Both are completed events with no escrow, so no money is affected. Mainnet holds eight events, so one `migrate_events` call during the upgrade converts the two and leaves the others unchanged, and `migrate` then stamps the version. | +| Backend changes that must ship first | Page winner and contributor reads at 90 or fewer and run refunds in batches of 15 or fewer (DoS.17); pages of 100 and batches of 25 already fail on the deployed build for large events. Split hackathon selections above 20 winners (DoS.17). Call `forfeit_milestone` when a grant milestone is rejected, or the grant can never be cancelled (EoP.14). Support `claim_refund` for refunds set aside (DoS.14). Stop calling the participation functions that 2.0.0 removed. | -This threat model will be revisited before mainnet launch (Tranche 3) and any time the architecture changes materially (new pillar, new auth flow, new external service, contract upgrade). +### 4.5 Accepted risks + +| ID | Risk | Reason | +|---|---|---| +| Spoof.9 | Admin keys are held in software | Two signers on separate machines are required; hardware keys are scheduled by policy. | +| Spoof.10 | The platform holds managed-wallet keys | Per-wallet encryption, fee sponsorship, on-chain attribution and the external-wallet option; KMS or HSM custody is planned. | +| Tamp.15 | An owner can cancel before any selection | The pool is the owner's until awarded, the cancellation is public, and the platform's terms apply. | +| Info.1 | Contract storage is public | Addresses are pseudonymous and content stays off chain. | +| Info.7 | Selections are visible before announcement | They are sent minutes apart, and the owner controls timing. | +| DoS.4 | One RPC provider | Transactions are queued and retried; failover is planned. | +| DoS.11 | Dormant events can expire | Reads extend their lifetime, and anyone can restore them. | +| DoS.15 | The fee account could lack a trustline | Only an admin mistake causes it, it is reversible, and a script checks before any change. | +| EoP.8 | A manager may award itself | Judging is off chain, and delegation is the owner's visible choice. | +| EoP.16 | The events side of the profile binding changes in one step | It cannot move money and is reversible. | + +DoS.9 is mitigated, but one case remains: if a manager's key is lost after the first award, awarded money stays reachable, but expired prizes and a grant's unawarded remainder cannot be returned until a manager acts. --- -## Appendix A โ€” Contract Entry Points and Auth Requirements +## 5. Verification and review plan -| Function | Contract | Caller Auth Required | +| Layer | What is in place | When | |---|---|---| -| `__constructor` | events | None (deploy-time only) | -| `create_event` | events | `params.owner.require_auth()` | -| `apply` | events | `applicant.require_auth()` | -| `withdraw_application` | events | `applicant.require_auth()` | -| `submit` | events | `event.owner.require_auth()` (manager) | -| `add_funds` | events | `from.require_auth()` | -| `select_winners` | events | `event.owner.require_auth()` (manager) | -| `claim_milestone` | events | `event.owner.require_auth()` + `admin.require_auth()` | -| `start_cancel` | events | Current event manager, or owner when no manager override exists | -| `process_cancel_batch` | events | None after the event enters `Cancelling` | -| `finalize_cancel` | events | None after the event enters `Cancelling` | -| `set_admin` | events | `admin.require_auth()` (current admin) | -| `accept_admin` | events | `pending.target.require_auth()` | -| `pause` / `unpause` | events | `admin.require_auth()` | -| `propose_upgrade` | events | `admin.require_auth()` | -| `apply_upgrade` | events | `admin.require_auth()` | -| `migrate` | events | `admin.require_auth()` | -| `register_supported_token` | events | `admin.require_auth()` | -| `set_events_contract` (first) | profile | `admin.require_auth()` | -| `propose_events_contract` | profile | `admin.require_auth()` | -| `accept_events_contract` | profile | `admin.require_auth()` | -| `bootstrap_self` | profile | `caller.require_auth()` | +| Contract tests | 386 tests. Payout splits check recipient and fee-account balances, admin authorization is checked as genuinely required, and cancellation is tested with 220 contributors. The grant scenario suite (`contracts/events/src/tests/grant_scenarios`) checks errors, signers, events and balances after every step, runs every cap at its maximum, and reconciles 48 random grants to the last token (`GRANT_SCENARIO_RUNS` raises the number). A separate test replays the next mainnet upgrade against storage from mainnet ledger 64,747,647 (`docs/storage-compatibility.md`). | Every commit, in CI. | +| Live-network tests | `scripts/testnet/grant-scenarios.ts` runs the grant lifecycle on testnet with a revocable test asset: rounding, payments in any order, forfeits, the cancellation guard, partner refunds, an issuer freeze, every refusal, manager handover and a 40-recipient grant, with exact balance checks. On 3 October 2026 it passed 317 of 317 checks against the final build (events `b63afc1fโ€ฆ`, profile `09110572โ€ฆ`); the report is `docs/audit/testnet-grant-run.md`. The backend's 21 testnet smoke scripts cover other paths through the platform. | Before every upgrade. | +| Build integrity | `scripts/build-release.sh` remaps machine paths out of the wasm, and the mainnet build runs it in CI's Linux x86-64 environment (`scripts/build-release-linux.sh`), so anyone reproduces CI's hash for a commit from any machine. The runbook (`docs/upgrade-runbook.md`) requires a second person to reproduce the hash and every admin transaction to be simulated before signing. The mainnet 1.7.0 binaries predate this and embed the builder's local paths; rebuilt with CLI 27.0.0 on that machine, the 1.7.0 source reproduces both live hashes exactly. | Every upgrade. | +| Static analysis | Scout (CoinFabrik) runs against the code under review; findings are recorded with a register of false positives (`docs/scout-audit-report.md`). | Every release. | +| On-chain monitoring | Both contracts emit an event for every state change, including admin actions (`PendingUpgradeProposed`, `UpgradeApplied`, `AdminUpdated`, `PendingAdminSet`, `FeeAccountUpdated`, `FeeBpsUpdated`, `ProfileContractUpdated`, `TokenRegistered`, `Paused`, `Unpaused`, `EventsContractUpdated`). The exception is `migrate_events`, whose admin-signed transactions are on the ledger and whose completion `migrate` records with `Migrated`. The indexer consumes these events, and a public analytics model reconciles money in and out. Not yet in place, and required before fieldwork: alerts on every admin event, a check that the token balance covers the total of `remaining_escrow`, and detection of stuck states (events left in `Cancelling`, prizes near expiry). | Continuous. | +| Incident response | Pausing both contracts is the first action for a suspected compromise. The custody policy covers emergency signer rotation, lost signers and escalation, and every incident gets a written record. | As needed; rotation rehearsed on testnet. | +| External audit | This audit. Findings will be fixed, re-tested and rehearsed on testnet before a mainnet upgrade, and this document updated to reference the report. | Once, then on material change. | +| Threat model review | Revised with every release that changes the contract interface, authorization or storage layout, and reviewed in full yearly. | Per release; yearly. | --- -## Appendix B โ€” Audit Checklist Cross-Reference +## Appendix A: Contract entry points and authorization -| Checklist Item | Status | Evidence | -|---|---|---| -| SCF funded | Yes | SCF grant recipient; Tranche 2 submission | -| Repo hygiene | Yes | `README.md`, `CONTRIBUTING.md`, `BACKLOG.md`, `docs/`, clean CI | -| Integration tests | Yes | 15+ smoke scripts against live testnet; `cargo test --all` 226/226 passing (149 events + 77 profile) | -| Threat model | Yes | This document (v1.1) | -| Dataflow diagram | Yes | Section 1.2 above | -| Tooling scan | Done | Scout (CoinFabrik) two runs June 2026; report at `docs/scout-audit-report.md` | -| Remediation plan | Done | June 2026 Stellar-skill audit (all HIGH/MEDIUM closed); Scout round 1 (C-3, M-1, M-2 fixed); Scout round 2 (C-6, C-7 fixed -- integer underflows in `credits.rs` and `storage.rs`). 0 real CRITICAL or MEDIUM findings remaining. See `docs/scout-audit-report.md`, `BACKLOG.md`. | +| Function | Contract | Who must sign | Notes | +|---|---|---|---| +| `__constructor` | events | none (runs at deployment) | Fee at most 10%. | +| `create_event` | events | `params.owner` | Supported token; floors positive and totalling at most the budget; budget and fee taken at once (except crowdfunding). | +| `propose_manager`, `cancel_pending_manager` | events | current manager (owner if none) | Proposal expires in 17,280 ledgers; no operation id. | +| `accept_manager` | events | proposed manager | No operation id. | +| `reclaim_management` | events | owner | Only before the first award; clears the manager and any proposal. | +| `add_funds` | events | `from` | At least 10 tokens; event must be `Active`. | +| `select_winners` | events | current manager | Hackathons and bounties: at most 20 per call, each position once. Grants: one call of at most 40, one award per recipient, each at least one stroop per milestone. Every award at or above its floor; reputation bump at most 100; reserved against the owed total. | +| `claim_prize` | events | stored award recipient | Hackathons and bounties only. | +| `claim_milestone` | events | event owner, plus the release validator (or admin) for crowdfunding | Recipient must hold an award; reputation bump at most 100. | +| `forfeit_milestone` | events | event owner | Grants only; closes a milestone unpaid and releases its share. | +| `start_cancel` | events | current manager | Refused while a hackathon or bounty prize is in its window or a grant award is owed. | +| `process_cancel_batch`, `finalize_cancel` | events | anyone | Only while `Cancelling`; at most 15 refunds per batch; zero refused. | +| `claim_refund` | events | contributor | Collects a refund the batch could not deliver. | +| `propose_release_validator`, `cancel_pending_release_validator`, `clear_release_validator` | events | admin | Propose, withdraw, or remove the crowdfunding co-signer. | +| `accept_release_validator` | events | proposed validator | Within 120,960 ledgers. | +| `set_admin` | events, profile | admin | Two-step, 7-day expiry. | +| `accept_admin` | events, profile | proposed admin | | +| `set_fee_bps`, `set_fee_account`, `set_profile_contract` | events | admin | Fee at most 10%; single step. | +| `pause`, `unpause` | events, profile | admin | Admin functions keep working while paused. | +| `register_supported_token`, `deregister_supported_token` | events | admin | | +| `propose_upgrade`, `apply_upgrade`, `cancel_pending_upgrade` | events, profile | admin | 17,280-ledger timelock on mainnet builds (none on the deployed 1.7.0 build); 30-day expiry. | +| `migrate_events` | events | admin | At most 8 events per call. | +| `migrate` | events, profile | admin | Once per version; events refuses with `MigrationIncomplete` until every record is converted. | +| `set_events_contract` (first binding) | profile | admin | Only when no binding exists. | +| `propose_events_contract`, `accept_events_contract`, `cancel_pending_events_contract` | profile | admin | 17,280-ledger timelock, 7-day expiry. | +| `bootstrap`, `bump_reputation`, `register_earnings` | profile | events contract (direct caller) | Operation ids scoped to the events contract. | +| `bootstrap_self` | profile | `user` | Operation ids scoped to the user. | +| `admin_slash_reputation` | profile | admin | A reason is required. | +| All read functions | both | none | List reads page at 90 entries. | + +## Appendix B: Audit readiness summary + +| Item | Status | +|---|---| +| Tests | 386 passing (326 events, 60 profile), plus the mainnet upgrade replay (Section 5). | +| Live-network tests | Grant lifecycle on testnet against the final 2.0.0 build: 317 of 317 checks (Section 5). | +| Continuous integration | Reproducible build (any machine can match CI's hash), size limit, formatting, version checks, admin and upgrade-guard script tests, the upgrade replay, clippy with warnings as errors, full test suite. | +| Static analysis | Scout 0.3.17 on the 2.0.0 code (`docs/scout-audit-report.md`): no critical findings; the real findings (Tamp.19, Tamp.7) are fixed and every other warning is a documented false positive. | +| Upgrade path | Timelocked proposal and application, on-chain `version()`, paged migration, testnet rehearsal, the CI replay, and `docs/upgrade-runbook.md`. | +| Admin custody | Custody policy (`docs/admin-custody-policy.md`), multisig setup checklist (`docs/multisig-guide.md` Part E), on-chain signer check script. | +| On-chain monitoring | Events for every state change are in place; alerting, balance reconciliation and stuck-state detection are not yet, and are required before fieldwork. | +| Disclosed items | Open: 4.1. Closed in 2.0.0: 4.2. Retired: 4.3. Pending deployment: 4.4. Accepted: 4.5. | diff --git a/docs/upgrade-runbook.md b/docs/upgrade-runbook.md new file mode 100644 index 0000000..74d29ef --- /dev/null +++ b/docs/upgrade-runbook.md @@ -0,0 +1,379 @@ +# Upgrade runbook + +How to upgrade a live `boundless-events` or `boundless-profile` contract. On +mainnet every admin step is a 2-of-3 multisig transaction that +`./deploy_mainnet.sh` prepares and checks but never submits; on testnet +`./deploy_and_upgrade.sh` signs with the local admin identity. Section 8 is +the specific procedure for taking mainnet from events 1.7.0 and profile 1.2.0 +to events 2.0.0 and profile 1.2.1. + +Related: `docs/contract-ops-runbook.md` (signing and submitting a multisig +transaction), `docs/admin-custody-policy.md` (who signs what), +`docs/DEPLOYMENT.md` (fresh deploys). + +## 1. How an upgrade works + +| Call | Who | Effect | +|---|---|---| +| `propose_upgrade(new_wasm_hash, new_version)` | admin | Queues the hash and version label. Replaces any earlier proposal. | +| `apply_upgrade()` | admin | After `available_at_ledger` and before `expires_at_ledger`, swaps in the queued wasm and sets `version()`. Atomic: a failed apply leaves the old wasm and the proposal in place. | +| `cancel_pending_upgrade()` | admin | Drops the proposal. | +| `migrate_events(max_events)` | admin, events only | Converts up to `max_events` event records still in an older layout (the contract caps a call at 8) and returns how many remain. | +| `migrate()` | admin | Stamps `get_migrated_to_version()` with the live version. Runs once per version. On events it refuses with `MigrationIncomplete` (97) while `migrate_events` has rows left. | + +There is no `upgrade()` entry point. Both contracts expose `version()`, +`get_pending_upgrade()` (hash, version, `proposed_at_ledger`, +`available_at_ledger`, `expires_at_ledger`) and `get_migrated_to_version()`. + +| Window | Ledgers | Wall clock | Source | +|---|---|---|---| +| `UPGRADE_TIMELOCK_LEDGERS`, mainnet builds | 17,280 | about 1 day | `contracts/{events,profile}/src/admin.rs` | +| `UPGRADE_TIMELOCK_LEDGERS`, `--features testnet` | 0 | none | same | +| `PENDING_UPGRADE_TTL_LEDGERS` | 518,400 | about 30 days | same | + +The timelock that applies is the one compiled into the wasm that is live when +you propose, not the one you are proposing. The deployed mainnet builds, +events 1.7.0 and profile 1.2.0, were compiled with 0 for the August rollout; +events 2.0.0 and profile 1.2.1 restore 17,280. + +Pausing events blocks every event-lifecycle call: `create_event`, `add_funds`, +`select_winners`, `claim_prize`, `claim_milestone`, `forfeit_milestone`, +`start_cancel`, `process_cancel_batch`, `finalize_cancel`, `claim_refund`, +and the manager calls (`propose_manager`, `accept_manager`, +`cancel_pending_manager`, `reclaim_management`). Pausing profile blocks its +reputation and earnings writes; events treats those as best-effort, so payouts +still go through. Neither blocks reads or any admin call, including every step +in this runbook and `unpause`, so a contract can stay paused from apply through +migration. + +## 2. Before you propose + +1. Tag the release commit and build it the way mainnet will run it: + + ```sh + ./scripts/build-release-linux.sh + ./scripts/check-versions.sh + stellar contract info meta --wasm target/release-linux/boundless_events.wasm + ``` + + `build-release-linux.sh` builds in the same Linux x86-64 environment as CI, + so the hashes it prints must equal the ones in CI's "Build contracts + reproducibly" step for the tagged commit. A native build on macOS or arm64 + gives a different hash for the same code, because cargo folds the host + platform into symbol names and that changes the function order, so only + this build is proposed. The contractmeta `version` must equal the version you will + propose, and a second person reproduces both hashes with the same script + before anyone signs. Keep these exact files; every later step checks them. +2. `cargo test --workspace` and `./scripts/test-storage-compat.sh` pass. The + storage suite replays the real mainnet state through the upgrade + (`docs/storage-compatibility.md`). +3. The same source has been upgraded on testnet with `./deploy_and_upgrade.sh` + (Section 5), including every `migrate_events` page and `migrate`. +4. The backend that talks to the new surface is ready to ship before or with + the upgrade. A backend that lags fails loudly with no funds moved; do not + publish events in the gap. +5. `EXPECTED_SIGNERS=,, ./scripts/admin/verify-multisig.sh "$ADMIN_SOURCE" mainnet` + passes: the admin account still has exactly the signer roster on file. +6. Freeze governance for the window: nobody calls `set_admin`, `accept_admin`, + `propose_events_contract`, `accept_events_contract` or + `cancel_pending_events_contract` while upgrade envelopes are in flight. + `deploy_mainnet.sh` refuses every step unless both admins equal + `ADMIN_SOURCE`, the profile still points at `EVENTS_ID`, and no binding + rotation is pending. + +Environment for `deploy_mainnet.sh`: + +```sh +export STELLAR_NETWORK=boundless-mainnet # see docs/DEPLOYMENT.md 4.2 +export ADMIN_SOURCE= +export EVENTS_ID= # default: deployments/mainnet.json +export PROFILE_ID= +export UPLOAD_SOURCE= # uploads need no admin authority +``` + +## 3. Simulate before signing + +Every envelope `deploy_mainnet.sh` writes has been through +`stellar tx simulate`. A `--build-only` transaction on its own has a 100-stroop +fee and no Soroban data (no footprint, no resource fee) and is rejected on +submit; never sign one. + +Each envelope is built against the multisig account's current sequence +number, so two envelopes prepared back to back carry the same sequence and +only one can land (`tx_bad_seq`). Prepare the next envelope only after the +previous transaction has confirmed, and prepare it close to signing so the +simulation reflects current state and the time bounds have not passed +(`txTooLate`). Before signing, every signer decodes the envelope and checks the +source, contract id, function and arguments: + +```sh +stellar tx decode --output json-formatted < events-propose.xdr +``` + +Signers sign sequentially (each signs the previous signer's output) and the +final XDR is submitted from the CLI with `stellar tx send` +(`docs/contract-ops-runbook.md`, Section 5). + +## 4. Mainnet procedure + +Run `./deploy_mainnet.sh upgrade-status` before and after every step. It +prints, per contract, the version, live wasm hash, migration marker, a +simulated `migrate` (ready, incomplete or applied), the pending upgrade, the +pause flag and the admin, plus the release validator and the profile binding. + +Every `prepare-*` command writes a simulated XDR to the path you give it, +after its checks pass. Sign and submit it before running the next one. + +1. Upload each new wasm. No admin authority is needed, so there is no + ceremony; the command refuses unless the network returns the local file's + hash. + + ```sh + ./deploy_mainnet.sh upload-events-wasm + ``` + +2. Propose, then confirm what landed. + + ```sh + ./deploy_mainnet.sh prepare-propose-upgrade-events propose.xdr + ./deploy_mainnet.sh verify-proposed-upgrade-events + ``` + + The prepare step refuses unless the wasm exports the contract's entry + points, its contractmeta version equals ``, the live contract + reports a different version and hash, and nothing is already queued. + `verify-proposed` prints `available_at_ledger` and `expires_at_ledger`; + publish both. +3. Wait for `available_at_ledger`. Users can see the proposal on chain for the + whole window. +4. Events only: pause. + + ```sh + ./deploy_mainnet.sh prepare-pause-events pause.xdr + ``` + +5. Apply. For events the command refuses unless the contract is paused. + + ```sh + ./deploy_mainnet.sh prepare-apply-upgrade-events apply.xdr + ``` + + `upgrade-status` must now show the new version and the new wasm hash. +6. Events only: convert old records. + + ```sh + ./deploy_mainnet.sh prepare-migrate-events-page 8 page.xdr + ``` + + The command prints how many events the page will leave (simulated). Submit + it, and repeat until a page reports 0. It refuses once nothing is left to + convert. +7. Stamp the migration. + + ```sh + ./deploy_mainnet.sh prepare-migrate-upgrade-events migrate.xdr + ``` + + It refuses while `migrate_events` still has rows (error 97) and if the + marker already equals ``. +8. Events only: unpause. Refused unless the version is live, nothing is + queued, and the marker equals the version. + + ```sh + ./deploy_mainnet.sh prepare-unpause-events unpause.xdr + ``` + +9. Confirm the end state and update the local record. + + ```sh + ./deploy_mainnet.sh verify-upgrade-events + ``` + + It requires the exact live hash, the version, the marker, no pending + upgrade and an unpaused contract, then writes the version and hash to + `deployments/mainnet.json` and appends to + `deployments/mainnet-upgrades.jsonl`. Add the transaction hashes to that + log by hand. + +Profile uses the same commands with `-profile` in place of `-events`, skips the +pause and the paging, and has no `migrate_events`. + +## 5. Testnet procedure + +Testnet builds have no timelock, so each step can follow the last at once. +The contract ids come from `deployments/testnet.json` and the signer defaults +to its `deployer_identity` (argument 5 overrides it). + +```sh +./deploy_and_upgrade.sh propose-upgrade events 2.1.0 testnet +./deploy_and_upgrade.sh apply-upgrade events - testnet +./deploy_and_upgrade.sh migrate-events events - testnet # loops until 0 +./deploy_and_upgrade.sh migrate events - testnet +./deploy_and_upgrade.sh status events - testnet +``` + +`propose-upgrade` builds with `--features testnet`, refuses if the build's +contractmeta version differs from the one you pass, uploads, and proposes. + +## 6. Cancelling and rolling back + +| Point reached | What you can still do | +|---|---| +| Proposed, not applied | `prepare-cancel-upgrade-`. The proposal is public for the whole timelock, which is the point of having one. Cancelling leaves the pause flag alone. | +| Applied, no `migrate_events` page yet | Propose and apply the previous wasm. Records have not been touched, but the rollback waits out the timelock of the build that is now live, so keep events paused meanwhile. | +| One or more pages run | Fix forward. Converted records stay converted. | +| Migrated | `migrate` cannot run again for this version (events 69, profile 43). A defect needs a new version. | + +Abandoning an upgrade before it is applied: cancel, then unpause. If the live +contract's migration marker already trailed its version before you started, +as it does on mainnet events today, `prepare-unpause-*` refuses; set +`UNPAUSE_UNMIGRATED=1` for that one command, and only for an upgrade that was +never applied. + +If anything looks wrong mid-sequence, pause first (2-of-3, never blocked) and +decide afterwards. + +Errors you may see while simulating: + +| Error | Events | Profile | Meaning | +|---|---|---|---| +| `UpgradeNotProposed` | 65 | 40 | Nothing queued; check `upgrade-status`. | +| `UpgradeTimelockNotElapsed` | 67 | 41 | Too early; wait for `available_at_ledger`. | +| `UpgradeProposalExpired` | 68 | 42 | Cancel and propose again. | +| `MigrationAlreadyApplied` | 69 | 43 | `migrate` already ran for this version. | +| `MigrationIncomplete` | 97 | | `migrate_events` still has rows. | +| `Paused` | 70 | 30 | A lifecycle call hit a paused contract. | + +## 7. Rotating the profile's events-contract binding + +`set_events_contract` works once, at deploy. If events ever moves to a new +address, profile rotates through a timelock: `propose_events_contract(new)`, +then `accept_events_contract()` after 17,280 ledgers and within 120,960 +ledgers (about 7 days) of the proposal; `cancel_pending_events_contract()` +drops it. Each is an admin call on profile, built and simulated the same way: + +```sh +stellar contract invoke --network "$STELLAR_NETWORK" --source-account "$ADMIN_SOURCE" \ + --id "$PROFILE_ID" --build-only -- propose_events_contract --new_addr \ + | stellar tx simulate --network "$STELLAR_NETWORK" --source-account "$ADMIN_SOURCE" \ + > profile-propose-events-contract.xdr +``` + +Confirm the proposal with `get_pending_events_contract` before preparing the +accept. `deploy_mainnet.sh` refuses upgrade steps while a rotation is pending, +so finish or cancel it first. + +## 8. Mainnet 1.7.0 to 2.0.0 + +### 8.1 Where mainnet stands + +| | events | profile | +|---|---|---| +| Contract | `CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ` | `CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC` | +| Live version | 1.7.0 | 1.2.0 | +| Migration marker | 1.6.0 | none | +| Target | 2.0.0 | 1.2.1 | +| Upgrade timelock of the live build | 0 | 0 | + +The admin of both is the 2-of-3 multisig +`GCVK72I6TVJVDTTY4UKU6MQT4QJ2T2AAG3NULNEUDM46L3UOQYDSO4O2` (three weight-1 +signers, thresholds 0/2/2, master weight 0). The fee account is +`GADSIP2HPINWTMEUNMVYA5NJRL372OV52HDEJTRTLDZXMHADIPQNYH55` at 250 bps, and the +registered USDC SAC is `CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75`. + +Events holds 8 events. The 1.7.0 `migrate_events` never ran (there is no +`MigrationCursor`), so events 1 and 2 (`โ€ฆ609` and `โ€ฆ610`) are still in the +pre-1.7.0 record layout and fail to decode on read. Both are Completed with +zero escrow. The other six are in the current layout. + +Because the live builds have a zero timelock, each 2.0.0 and 1.2.1 proposal +can be applied as soon as it lands, in the same session. Every upgrade after +this one waits 17,280 ledgers. + +Re-read all of this with `upgrade-status` and `get_event` before signing. + +### 8.2 What has to ship in the backend first + +- Read winners and contributors in pages of at most 90 rows. +- Crank cancellation refunds in batches of at most 15 per + `process_cancel_batch`. +- Split hackathon selections above 20 awards per `select_winners` call. A + grant still selects in one call, with at most 40 recipients. +- Call `forfeit_milestone` when a grant milestone is rejected. +- Use `claim_refund` and `get_unclaimed_refund` for refunds the contract had to + hold back. +- Stop calling the participation entry points (`apply`, `apply_to_bounty`, + `remove_applicant`, `submit`) and the applicant and submission reads; 2.0.0 + removes them and participation lives in the backend. + +### 8.3 Steps + +Rehearsed on testnet on 2026-10-02: events `CBEODVJGโ€ฆ` went to 2.0.0 (wasm +`70791d71โ€ฆ`), 185 events paged through `migrate_events` in 24 calls, then +`migrate` stamped 2.0.0. If testnet profile still reports 1.2.0, upgrade it to +1.2.1 there first. + +Build both wasms per Section 2 and set the environment: + +```sh +export STELLAR_NETWORK=boundless-mainnet +export ADMIN_SOURCE=GCVK72I6TVJVDTTY4UKU6MQT4QJ2T2AAG3NULNEUDM46L3UOQYDSO4O2 +export EVENTS_ID=CCFVEGOQJEM47LRAJU2LHEK4KTL5VYN7AOGZ2HH2GNHAMXTILNMMJGQZ +export PROFILE_ID=CD3KH4OE7HDHHHUYFX3U4L7NLIILMXAY6HM5FEH2UH6UBOKX4HDNE3PC +export UPLOAD_SOURCE= +EVENTS_WASM=target/release-linux/boundless_events.wasm +PROFILE_WASM=target/release-linux/boundless_profile.wasm + +./deploy_mainnet.sh upgrade-status +./deploy_mainnet.sh upload-profile-wasm "$PROFILE_WASM" 1.2.1 +./deploy_mainnet.sh upload-events-wasm "$EVENTS_WASM" 2.0.0 +``` + +Profile first. Either order is safe: events 1.7.0 never calls the +`slash_reputation` entry point that 1.2.1 removes, and events 2.0.0 only calls +functions that 1.2.0 already has. Profile stays unpaused. Each line below is +one signing ceremony; submit it and wait for it to land before the next. + +```sh +./deploy_mainnet.sh prepare-propose-upgrade-profile "$PROFILE_WASM" 1.2.1 profile-propose.xdr +./deploy_mainnet.sh verify-proposed-upgrade-profile "$PROFILE_WASM" 1.2.1 +./deploy_mainnet.sh prepare-apply-upgrade-profile "$PROFILE_WASM" 1.2.1 profile-apply.xdr +./deploy_mainnet.sh prepare-migrate-upgrade-profile 1.2.1 profile-migrate.xdr +./deploy_mainnet.sh verify-upgrade-profile "$PROFILE_WASM" 1.2.1 +``` + +Then events: + +```sh +./deploy_mainnet.sh prepare-pause-events events-pause.xdr +./deploy_mainnet.sh prepare-propose-upgrade-events "$EVENTS_WASM" 2.0.0 events-propose.xdr +./deploy_mainnet.sh verify-proposed-upgrade-events "$EVENTS_WASM" 2.0.0 +./deploy_mainnet.sh prepare-apply-upgrade-events "$EVENTS_WASM" 2.0.0 events-apply.xdr +./deploy_mainnet.sh prepare-migrate-events-page 8 events-page.xdr +./deploy_mainnet.sh prepare-migrate-upgrade-events 2.0.0 events-migrate.xdr +./deploy_mainnet.sh prepare-unpause-events 2.0.0 events-unpause.xdr +./deploy_mainnet.sh verify-upgrade-events "$EVENTS_WASM" 2.0.0 +``` + +One page of 8 converts all eight events, so the page command should report 0 +remaining. If more events exist by then, repeat the page until it reports 0; +`migrate` refuses with error 97 until it does. Until 2.0.0 is applied, +`upgrade-status` cannot read the release validator (1.7.0 has no such +function). + +After the unpause: + +- `get_event` on `271539957145796609` and `271539957145796610` decodes and + shows `prize_floors`. +- `get_release_validator` is `null`, so the admin multisig co-signs + crowdfunding releases until a validator is appointed. Appointing one is a + separate decision: `propose_release_validator` from the multisig, then + `accept_release_validator` signed by the validator key itself within + 120,960 ledgers (`docs/admin-custody-policy.md`, Section 4.1). +- Deploy the backend from the matching commit if it was not already live, and + record every transaction hash in `deployments/mainnet-upgrades.jsonl`. + +Rollback: before the events apply, cancel and unpause with +`UNPAUSE_UNMIGRATED=1` (the marker was already 1.6.0). After the apply, a +rollback to 1.7.0 waits the 17,280-ledger timelock that 2.0.0 carries, with +events paused throughout; after the first page, fix forward. diff --git a/scripts/admin/verify-fee-trustline.sh b/scripts/admin/verify-fee-trustline.sh new file mode 100755 index 0000000..9f057e8 --- /dev/null +++ b/scripts/admin/verify-fee-trustline.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# +# verify-fee-trustline.sh: confirm the fee account can receive a token. +# +# The contract moves the platform fee to the fee account inside create_event +# and add_funds. Without an authorized trustline for the token, every such +# call reverts. Run before whitelisting a token and before rotating the fee +# account. +# +# Usage: +# ./scripts/admin/verify-fee-trustline.sh +# +# ASSET is CODE:ISSUER, or "native" for XLM. +# +# FEE_TRUSTLINE_ACCOUNT_FILE reads the Horizon account JSON from a file instead +# of the network (used by scripts/test-admin-scripts.sh). + +set -euo pipefail + +NETWORK=${1:-""} +FEE_ACCOUNT=${2:-""} +ASSET=${3:-""} + +if [[ -z "$NETWORK" || -z "$FEE_ACCOUNT" || -z "$ASSET" ]]; then + echo "Usage: $0 " >&2 + exit 1 +fi +case "$NETWORK" in + testnet) HORIZON="https://horizon-testnet.stellar.org" ;; + mainnet) HORIZON="https://horizon.stellar.org" ;; + *) echo "Unknown network '$NETWORK'." >&2; exit 1 ;; +esac +if [[ ! "$FEE_ACCOUNT" =~ ^G[A-Z2-7]{55}$ ]]; then + echo "error: fee account must be a G... address (got: $FEE_ACCOUNT)" >&2 + exit 1 +fi + +if [[ "$ASSET" == "native" ]]; then + echo "PASS: every account holds XLM." + exit 0 +fi +if [[ ! "$ASSET" =~ ^([A-Za-z0-9]{1,12}):(G[A-Z2-7]{55})$ ]]; then + echo "error: asset must be CODE:ISSUER or native (got: $ASSET)" >&2 + exit 1 +fi +CODE="${BASH_REMATCH[1]}" +ISSUER="${BASH_REMATCH[2]}" + +if [[ -n "${FEE_TRUSTLINE_ACCOUNT_FILE:-}" ]]; then + ACCOUNT_JSON=$(cat "$FEE_TRUSTLINE_ACCOUNT_FILE") +else + ACCOUNT_JSON=$(curl -sf "$HORIZON/accounts/$FEE_ACCOUNT" || true) +fi +if [[ -z "$ACCOUNT_JSON" ]]; then + echo "FAIL: fee account $FEE_ACCOUNT does not exist on $NETWORK." >&2 + exit 1 +fi + +LINE=$(echo "$ACCOUNT_JSON" | jq -c --arg c "$CODE" --arg i "$ISSUER" \ + '[.balances[] | select(.asset_code == $c and .asset_issuer == $i)] | first // empty') +if [[ -z "$LINE" ]]; then + echo "FAIL: $FEE_ACCOUNT has no trustline for $CODE:$ISSUER." >&2 + exit 1 +fi +if [[ "$(echo "$LINE" | jq -r '.is_authorized')" != "true" ]]; then + echo "FAIL: the $CODE trustline on $FEE_ACCOUNT is not authorized by the issuer." >&2 + exit 1 +fi + +echo "PASS: $FEE_ACCOUNT holds an authorized $CODE trustline." diff --git a/scripts/admin/verify-multisig.sh b/scripts/admin/verify-multisig.sh index 4dbcab5..7148591 100755 --- a/scripts/admin/verify-multisig.sh +++ b/scripts/admin/verify-multisig.sh @@ -6,16 +6,24 @@ # asserts the live signer configuration matches docs/admin-custody-policy.md: # # - exactly 3 signers + master key disabled +# - every signer is an ed25519 account key (no pre-auth tx or hash-x +# signers, which would let a single transaction or preimage stand in +# for a person) # - each signer has weight 1 # - low threshold = 0 (no read-only signers allowed) # - med + high thresholds = 2 (2-of-3 quorum) # # Run on testnet first (the practice multisig). After mainnet provisioning, -# run with --network mainnet against the production multi-sig BEFORE the -# `set_admin` call. +# run it with `mainnet` against the production multi-sig BEFORE the +# `set_admin` call (deploy_mainnet.sh rotate-admin runs it for you). # # Usage: # ./scripts/admin/verify-multisig.sh [testnet|mainnet] +# +# EXPECTED_SIGNERS (comma-separated G-addresses) additionally requires the +# signer set to be exactly that roster. MULTISIG_ACCOUNT_FILE reads the +# Horizon account JSON from a file instead of the network (used by +# scripts/test-admin-scripts.sh). set -euo pipefail @@ -35,6 +43,10 @@ if [[ -z "$MULTISIG" ]]; then echo "Usage: $0 [testnet|mainnet]" >&2 exit 1 fi +if [[ ! "$MULTISIG" =~ ^G[A-Z2-7]{55}$ ]]; then + echo "Error: '$MULTISIG' is not a G... account address." >&2 + exit 1 +fi case "$NETWORK" in testnet) HORIZON="https://horizon-testnet.stellar.org" ;; @@ -46,7 +58,11 @@ GREEN='\033[0;32m'; RED='\033[0;31m'; YELLOW='\033[1;33m'; NC='\033[0m' echo -e "${YELLOW}Verifying multi-sig ${MULTISIG} on ${NETWORK}...${NC}" -ACCOUNT_JSON=$(curl -sf "$HORIZON/accounts/$MULTISIG") +if [[ -n "${MULTISIG_ACCOUNT_FILE:-}" ]]; then + ACCOUNT_JSON=$(cat "$MULTISIG_ACCOUNT_FILE") +else + ACCOUNT_JSON=$(curl -sf "$HORIZON/accounts/$MULTISIG" || true) +fi if [[ -z "$ACCOUNT_JSON" ]]; then echo -e "${RED}Account not found on $NETWORK.${NC}" >&2 exit 1 @@ -89,6 +105,21 @@ assert "non-zero-weight signer count" "$SIGNERS_COUNT" "3" WEIGHTS=$(echo "$ACCOUNT_JSON" | jq -r '[.signers[] | select(.weight > 0) | .weight] | join(",")') assert "signer weights" "$WEIGHTS" "1,1,1" +# A pre-auth transaction or hash-x signer counts toward the quorum without a +# person behind it. +NON_KEY=$(echo "$ACCOUNT_JSON" | jq '[.signers[] | select(.weight > 0 and .type != "ed25519_public_key")] | length') +assert "non-key signers (pre-auth tx, hash-x, signed payload)" "$NON_KEY" "0" + +BAD_KEYS=$(echo "$ACCOUNT_JSON" | \ + jq --arg id "$MULTISIG" '[.signers[] | select(.weight > 0) | .key | select((test("^G[A-Z2-7]{55}$") | not) or . == $id)] | length') +assert "signers that are not distinct G-addresses" "$BAD_KEYS" "0" + +if [[ -n "${EXPECTED_SIGNERS:-}" ]]; then + ACTUAL=$(echo "$ACCOUNT_JSON" | jq -r '[.signers[] | select(.weight > 0) | .key] | sort | join(",")') + WANTED=$(echo "$EXPECTED_SIGNERS" | tr ',' '\n' | sed '/^$/d' | sort | paste -sd, -) + assert "signer roster" "$ACTUAL" "$WANTED" +fi + echo echo -e "${YELLOW}Signer addresses on file:${NC}" echo "$ACCOUNT_JSON" | jq -r '.signers[] | select(.weight > 0) | " " + .key + " (weight " + (.weight|tostring) + ", type " + .type + ")"' @@ -105,4 +136,4 @@ echo echo "Next steps:" echo " 1. Compare the printed signer addresses against the founder's roster." echo " 2. Confirm each signer can sign a test transaction (drill)." -echo " 3. Only then run set_admin per docs/mainnet-deploy-runbook.md ยง2.7." +echo " 3. Only then rotate admin per docs/DEPLOYMENT.md (Rotate admin to the multisig)." diff --git a/scripts/build-release-linux.sh b/scripts/build-release-linux.sh new file mode 100755 index 0000000..659976b --- /dev/null +++ b/scripts/build-release-linux.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# Builds the release wasm in the Linux x86-64 environment CI uses, so anyone can +# reproduce CI's hash for a commit from any machine. This is the build that +# goes on mainnet. +# +# A native build on another host (macOS, arm64) produces the same code in a +# different function order, and so a different hash: cargo folds the host +# triple into the hashes behind symbol names, and the linker orders by them. +# +# Usage: scripts/build-release-linux.sh [extra `stellar contract build` args] +# Output: target/release-linux/*.wasm +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +OUT="$ROOT/target/release-linux" +IMAGE="rust:1.93.0@sha256:bbde3ca426faeebab3eb58b8005d3d6da70607817a14bb92a55c94611d4d905f" +CLI_VERSION="28.1.0" +CLI_SHA256="c1680deee94301d33ada7a17f98411e642a4248c727afbd2e43050d345746462" + +command -v docker >/dev/null 2>&1 || { echo "docker not on PATH" >&2; exit 1; } +if [ -n "$(git -C "$ROOT" status --porcelain 2>/dev/null)" ]; then + echo "warning: the working tree has uncommitted changes; they are built too" >&2 +fi +echo "building $(git -C "$ROOT" rev-parse --short HEAD 2>/dev/null || echo 'unknown commit') in $IMAGE" + +rm -rf "$OUT" && mkdir -p "$OUT" +docker run --rm --platform linux/amd64 \ + -v "$ROOT":/src:ro -v "$OUT":/out \ + -e CLI_VERSION="$CLI_VERSION" -e CLI_SHA256="$CLI_SHA256" -e DEBIAN_FRONTEND=noninteractive \ + "$IMAGE" bash -euo pipefail -c ' + apt-get update -qq >/dev/null + apt-get install -y -qq binutils libdbus-1-3 >/dev/null + tar="stellar-cli-${CLI_VERSION}-x86_64-unknown-linux-gnu.tar.gz" + curl -fsSL -o "/tmp/$tar" \ + "https://github.com/stellar/stellar-cli/releases/download/v${CLI_VERSION}/$tar" + echo "${CLI_SHA256} /tmp/$tar" | sha256sum -c - >/dev/null + tar -xzf "/tmp/$tar" -C /usr/local/bin stellar + rustup target add wasm32v1-none >/dev/null 2>&1 + mkdir /build + tar -C /src --exclude=./target --exclude=./.git -cf - . | tar -C /build -xf - + cd /build + ./scripts/build-release.sh "$@" >/tmp/build.log 2>&1 || { cat /tmp/build.log; exit 1; } + cp target/wasm32v1-none/release/*.wasm /out/ + ' bash "$@" + +for wasm in "$OUT"/*.wasm; do + echo "$(shasum -a 256 "$wasm" | awk "{print \$1}") ${wasm#"$ROOT"/}" +done diff --git a/scripts/build-release.sh b/scripts/build-release.sh new file mode 100755 index 0000000..e24f383 --- /dev/null +++ b/scripts/build-release.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +# Builds the release wasm so that the same commit and toolchain give the same +# hash on any machine. +# +# rustc embeds source paths for panic locations, which by default include the +# builder's home directory (cargo registry, rustup toolchain) and checkout path. +# Those are remapped to fixed prefixes here. The rust-src path is mapped to +# /rustc/, the form the prebuilt standard library already uses, so a +# machine with the rust-src component installed and one without agree. +# +# Usage: scripts/build-release.sh [extra `stellar contract build` args] +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cargo_home="${CARGO_HOME:-$HOME/.cargo}" +sysroot="$(cd "$ROOT" && rustc --print sysroot)" +commit="$(cd "$ROOT" && rustc -vV | sed -n 's/^commit-hash: //p')" +[ -n "$commit" ] || { echo "could not read the rustc commit hash" >&2; exit 1; } + +# This replaces target.wasm32v1-none.rustflags from .cargo/config.toml, so it +# must carry the same flags. +export CARGO_TARGET_WASM32V1_NONE_RUSTFLAGS="-C target-feature=+reference-types \ +--remap-path-prefix=$cargo_home=/cargo \ +--remap-path-prefix=$sysroot/lib/rustlib/src/rust=/rustc/$commit \ +--remap-path-prefix=$ROOT=/build" + +cd "$ROOT" +stellar contract build --locked "$@" + +for wasm in target/wasm32v1-none/release/*.wasm; do + if strings "$wasm" | grep -qE "$HOME|/home/|/Users/"; then + echo "$wasm still contains a machine path" >&2 + exit 1 + fi +done diff --git a/scripts/capture-mainnet-compat-snapshot.sh b/scripts/capture-mainnet-compat-snapshot.sh index 51f97a2..2cf6b40 100755 --- a/scripts/capture-mainnet-compat-snapshot.sh +++ b/scripts/capture-mainnet-compat-snapshot.sh @@ -1,13 +1,25 @@ #!/usr/bin/env bash +# Captures the mainnet storage of both contracts from the history archive, for +# the storage-compatibility replay. Read-only: it downloads archive buckets and +# never touches the network otherwise. +# +# capture-mainnet-compat-snapshot.sh +# Recaptures the ledger pinned in the manifest and fails unless the result +# is byte-identical to the reviewed fixture. +# +# capture-mainnet-compat-snapshot.sh +# Captures a new ledger (an archive checkpoint) and prints the values to +# record in the manifest. set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" FIXTURES="$ROOT/contracts/compatibility/fixtures" MANIFEST="$FIXTURES/manifest.json" OUTPUT="${1:-}" +NEW_LEDGER="${2:-}" [ -n "$OUTPUT" ] || { - echo "usage: $0 " >&2 + echo "usage: $0 []" >&2 exit 1 } [ ! -e "$OUTPUT" ] || { @@ -23,18 +35,20 @@ command -v jq >/dev/null 2>&1 || { echo "jq not on PATH" >&2 exit 1 } -stellar --version | head -n 1 | grep -q '^stellar 27\.0\.0 ' || { - echo "Stellar CLI 27.0.0 is required" >&2 +# The fixture is only reproducible byte for byte with the CLI that wrote it. +stellar --version | head -n 1 | grep -q '^stellar 28\.1\.0 ' || { + echo "Stellar CLI 28.1.0 is required" >&2 exit 1 } -LEDGER="$(jq -r '.snapshot.ledger' "$MANIFEST")" -TIMESTAMP="$(jq -r '.snapshot.timestamp' "$MANIFEST")" -PROTOCOL="$(jq -r '.snapshot.protocol' "$MANIFEST")" NETWORK_ID="$(jq -r '.snapshot.network_id' "$MANIFEST")" EVENTS_ID="$(jq -r '.snapshot.events_contract' "$MANIFEST")" PROFILE_ID="$(jq -r '.snapshot.profile_contract' "$MANIFEST")" -EXPECTED_HASH="$(jq -r '.snapshot.sha256' "$MANIFEST")" +if [ -n "$NEW_LEDGER" ]; then + LEDGER="$NEW_LEDGER" +else + LEDGER="$(jq -r '.snapshot.ledger' "$MANIFEST")" +fi ARCHIVE_URL="${STELLAR_ARCHIVE_URL:-https://history.stellar.org/prd/core-live/core_live_001/}" NETWORK_PASSPHRASE="Public Global Stellar Network ; September 2015" @@ -51,6 +65,8 @@ stellar snapshot create \ --address "$EVENTS_ID" \ --address "$PROFILE_ID" +# Keep contract data only. The deployed code is pinned separately as wasm +# fixtures, and uploading those is what makes the captured instances runnable. jq \ --arg events "$EVENTS_ID" \ --arg profile "$PROFILE_ID" \ @@ -70,17 +86,12 @@ jq \ jq -e \ --argjson ledger "$LEDGER" \ - --argjson timestamp "$TIMESTAMP" \ - --argjson protocol "$PROTOCOL" \ --arg network_id "$NETWORK_ID" \ --arg events "$EVENTS_ID" \ --arg profile "$PROFILE_ID" \ ' .sequence_number == $ledger - and .timestamp == $timestamp - and .protocol_version == $protocol and .network_id == $network_id - and (.ledger_entries | length == 10) and (.ledger_entries | all( .live_until == 4294967295 and (.entry.data.contract_data.contract == $events @@ -90,7 +101,7 @@ jq -e \ | select(.entry.data.contract_data.key == "ledger_key_contract_instance")] | length == 2) ' "$normalized_snapshot" >/dev/null || { - echo "captured ledger does not match the pinned snapshot selection" >&2 + echo "captured ledger does not match the expected selection" >&2 exit 1 } @@ -102,10 +113,18 @@ else actual_hash="$(shasum -a 256 "$OUTPUT" | awk '{print $1}')" fi -echo "snapshot: $OUTPUT" -echo "sha256: $actual_hash" -[ "$actual_hash" = "$EXPECTED_HASH" ] || { - echo "expected: $EXPECTED_HASH" >&2 - echo "the regenerated snapshot differs from the reviewed fixture" >&2 - exit 1 -} +echo "snapshot: $OUTPUT" +echo "ledger: $(jq -r '.sequence_number' "$OUTPUT")" +echo "timestamp: $(jq -r '.timestamp' "$OUTPUT")" +echo "protocol: $(jq -r '.protocol_version' "$OUTPUT")" +echo "entries: $(jq -r '.ledger_entries | length' "$OUTPUT")" +echo "sha256: $actual_hash" + +if [ -z "$NEW_LEDGER" ]; then + expected_hash="$(jq -r '.snapshot.sha256' "$MANIFEST")" + [ "$actual_hash" = "$expected_hash" ] || { + echo "expected: $expected_hash" >&2 + echo "the regenerated snapshot differs from the reviewed fixture" >&2 + exit 1 + } +fi diff --git a/scripts/check-versions.sh b/scripts/check-versions.sh new file mode 100755 index 0000000..8531e76 --- /dev/null +++ b/scripts/check-versions.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +# +# check-versions.sh: each contract must report one version everywhere. +# +# The deployed wasm carries contractmeta "version", the constructor stamps +# INITIAL_VERSION, and Cargo.toml names the crate version. When they drift, +# an upgrade proposal can name a version the code does not report. + +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +FAIL=0 + +for contract in events profile; do + dir="$ROOT/contracts/$contract" + cargo=$(sed -nE 's/^version = "([^"]+)"/\1/p' "$dir/Cargo.toml" | head -1) + initial=$(sed -nE 's/.*INITIAL_VERSION: &str = "([^"]+)".*/\1/p' "$dir/src/admin.rs" | head -1) + meta=$(sed -nE 's/.*contractmeta!\(key = "version", val = "([^"]+)"\).*/\1/p' "$dir/src/lib.rs" | head -1) + + echo "$contract: Cargo.toml=$cargo INITIAL_VERSION=$initial contractmeta=${meta:-none}" + if [[ -z "$cargo" || "$cargo" != "$initial" ]]; then + echo "::error::$contract Cargo.toml ($cargo) and INITIAL_VERSION ($initial) differ" >&2 + FAIL=1 + fi + if [[ -n "$meta" && "$meta" != "$initial" ]]; then + echo "::error::$contract contractmeta ($meta) and INITIAL_VERSION ($initial) differ" >&2 + FAIL=1 + fi +done + +exit "$FAIL" diff --git a/scripts/deploy/deploy.sh b/scripts/deploy/deploy.sh index 4f408f1..e13f15f 100755 --- a/scripts/deploy/deploy.sh +++ b/scripts/deploy/deploy.sh @@ -1,41 +1,34 @@ #!/usr/bin/env bash -# deploy.sh โ€” deploy boundless-events + boundless-profile to a Stellar network. +# deploy.sh: deploy boundless-profile and boundless-events to testnet or +# futurenet, wire them together, and write deployments/.json. # # Usage: -# ./scripts/deploy/deploy.sh +# ./scripts/deploy/deploy.sh # -# where is one of: testnet, futurenet, mainnet. -# -# Required env (loaded from .env.deploy or shell): -# ADMIN_IDENTITY stellar CLI identity name with admin authority +# Required env (loaded from .env.deploy or the shell): +# ADMIN_IDENTITY stellar CLI identity that deploys and holds admin # FEE_ACCOUNT Stellar G-address that receives fees # FEE_BPS platform fee in basis points (e.g. 250 = 2.5%) # -# Contract 1.0.0 also required BOOTSTRAP_CREDITS; the 1.1.0 credit-removal -# upgrade (2026-06) moved credits off-chain and the profile constructor now -# takes only --admin. -# -# Spec: boundless-platform-contract-prd.md Section 12.2. +# Mainnet deploys use ./deploy_mainnet.sh instead (docs/DEPLOYMENT.md). set -euo pipefail NETWORK="${1:-}" if [[ -z "$NETWORK" ]]; then - echo "usage: $0 " >&2 + echo "usage: $0 " >&2 exit 1 fi -if [[ "$NETWORK" != "testnet" && "$NETWORK" != "futurenet" && "$NETWORK" != "mainnet" ]]; then - echo "error: network must be one of testnet, futurenet, mainnet (got: $NETWORK)" >&2 +if [[ "$NETWORK" == "mainnet" ]]; then + echo "error: mainnet deploys go through ./deploy_mainnet.sh deploy-profile and deploy-events (docs/DEPLOYMENT.md)" >&2 exit 1 fi - -# Load .env.deploy if present (and not already exported). SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" -if [[ -f "$REPO_ROOT/.env.deploy" ]]; then - # shellcheck disable=SC1091 - set -a; source "$REPO_ROOT/.env.deploy"; set +a -fi +# shellcheck source=../lib/deploy-env.sh +source "$SCRIPT_DIR/../lib/deploy-env.sh" +load_env_deploy "$REPO_ROOT/.env.deploy" +require_network "$NETWORK" require() { local name="$1" @@ -47,12 +40,15 @@ require() { require ADMIN_IDENTITY require FEE_ACCOUNT require FEE_BPS +require_g_address FEE_ACCOUNT "$FEE_ACCOUNT" +if [[ ! "$FEE_BPS" =~ ^[0-9]+$ ]]; then + echo "error: FEE_BPS must be a whole number of basis points (got: $FEE_BPS)" >&2 + exit 1 +fi -# Soroban host on Stellar testnet accepts WebAssembly emitted with the -# reference-types extension; stellar-cli's local simulator only validates that -# extension from 26.0.0 onward. Earlier CLIs reject Rust 1.90.0 wasm32v1-none -# output at simulation time with a "reference-types not enabled" error. -MIN_CLI_MAJOR=26 +# CI builds with stellar CLI 28.1.0 against soroban-sdk 28; older CLIs are +# untested with these contracts. +MIN_CLI_MAJOR=28 CLI_VERSION_LINE="$(stellar --version 2>/dev/null | head -1)" CLI_MAJOR="$(printf '%s' "$CLI_VERSION_LINE" | grep -oE '[0-9]+' | head -1)" if [[ -z "${CLI_MAJOR:-}" ]]; then @@ -60,24 +56,14 @@ if [[ -z "${CLI_MAJOR:-}" ]]; then exit 1 fi if (( CLI_MAJOR < MIN_CLI_MAJOR )); then - cat >&2 <= $MIN_CLI_MAJOR.0.0 so the local simulator can validate - reference-types wasm emitted by Rust 1.90.0. - -Upgrade: - brew upgrade stellar/tap/stellar-cli - # or - cargo install --locked stellar-cli@26.1.0 -EOF + echo "error: stellar CLI $CLI_VERSION_LINE is too old; CI uses 28.1.0 (cargo install --locked stellar-cli@28.1.0)" >&2 exit 1 fi -# Sanity check fee_bps. Contract enforces MAX_FEE_BPS = 1000 (10%) per -# 2026-06 Stellar-skill audit L4; values above this will deploy fine and -# then revert at the first create_event call. +# The constructor accepts any value, but every create_event reverts above the +# contract's MAX_FEE_BPS of 1000 (10%). if (( FEE_BPS < 0 || FEE_BPS > 1000 )); then - echo "error: FEE_BPS must be in [0, 1000] (contract caps at 1000 = 10% per audit L4); got $FEE_BPS" >&2 + echo "error: FEE_BPS must be in [0, 1000] (the contract caps fees at 10%); got $FEE_BPS" >&2 exit 1 fi @@ -90,18 +76,11 @@ echo " fee account: $FEE_ACCOUNT" echo " fee bps: $FEE_BPS" echo -# 1. Build both contracts. Testnet/futurenet enable the `testnet` feature โ†’ -# zero upgrade timelock for fast iteration. Mainnet MUST build WITHOUT it -# (default = full audit-mandated timelock; fail-safe). -echo "==> building contracts" -BUILD_FEATURES="" -if [[ "$NETWORK" == "testnet" || "$NETWORK" == "futurenet" ]]; then - BUILD_FEATURES="--features testnet" -fi -# shellcheck disable=SC2086 -( cd "$REPO_ROOT/contracts/events" && stellar contract build --locked $BUILD_FEATURES ) -# shellcheck disable=SC2086 -( cd "$REPO_ROOT/contracts/profile" && stellar contract build --locked $BUILD_FEATURES ) +# The testnet feature zeroes the upgrade timelock so test upgrades can apply at +# once; mainnet builds (deploy_mainnet.sh) leave it off. +echo "==> building contracts with --features testnet" +"$REPO_ROOT/scripts/build-release.sh" --package boundless-events --features testnet +"$REPO_ROOT/scripts/build-release.sh" --package boundless-profile --features testnet EVENTS_WASM="$REPO_ROOT/target/wasm32v1-none/release/boundless_events.wasm" PROFILE_WASM="$REPO_ROOT/target/wasm32v1-none/release/boundless_profile.wasm" @@ -110,7 +89,7 @@ for f in "$EVENTS_WASM" "$PROFILE_WASM"; do [[ -f "$f" ]] || { echo "error: wasm not found at $f" >&2; exit 1; } done -# 2. Deploy boundless-profile first (events constructor needs its address). +# Profile first: the events constructor takes its address. echo echo "==> deploying boundless-profile" PROFILE_ID=$(stellar contract deploy \ @@ -121,7 +100,6 @@ PROFILE_ID=$(stellar contract deploy \ --admin "$ADMIN_ADDR") echo " profile contract id: $PROFILE_ID" -# 3. Deploy boundless-events pointing at the profile contract. echo echo "==> deploying boundless-events" EVENTS_ID=$(stellar contract deploy \ @@ -135,7 +113,6 @@ EVENTS_ID=$(stellar contract deploy \ --profile_contract "$PROFILE_ID") echo " events contract id: $EVENTS_ID" -# 4. Wire profile to recognize the events contract. echo echo "==> wiring profile.set_events_contract" stellar contract invoke \ @@ -146,7 +123,6 @@ stellar contract invoke \ set_events_contract \ --new_addr "$EVENTS_ID" -# 5. Persist deployment record. DEPLOY_RECORD="$REPO_ROOT/deployments/$NETWORK.json" mkdir -p "$(dirname "$DEPLOY_RECORD")" cat > "$DEPLOY_RECORD" < "$DEPLOY_RECORD" < done. summary written to $DEPLOY_RECORD" +echo "==> done. local record written to $DEPLOY_RECORD" echo -echo "set these in the nestjs deployment env:" +echo "set these in the boundless-nestjs deployment env:" echo " BOUNDLESS_EVENTS_CONTRACT_ADDRESS=$EVENTS_ID" echo " BOUNDLESS_PROFILE_CONTRACT_ADDRESS=$PROFILE_ID" echo -echo "next: ./scripts/deploy/register_token.sh $NETWORK " +echo "next: ./scripts/deploy/register_token.sh $NETWORK " diff --git a/scripts/deploy/register_token.sh b/scripts/deploy/register_token.sh index 35a5e06..ecee24d 100755 --- a/scripts/deploy/register_token.sh +++ b/scripts/deploy/register_token.sh @@ -1,36 +1,33 @@ #!/usr/bin/env bash -# register_token.sh โ€” whitelist a token on boundless-events. +# register_token.sh: whitelist a token on boundless-events while the deployer +# identity still holds admin (before the multisig rotation). # # Usage: -# ./scripts/deploy/register_token.sh +# ./scripts/deploy/register_token.sh # -# Prerequisites (admin's responsibility): -# The fee_account must hold an active trustline for the token. The contract -# does NOT pre-flight this; a missing trustline will surface at the first -# deposit attempt as a transaction failure. -# -# To verify the trustline first (run before this script): -# stellar account get --account "$FEE_ACCOUNT" --network "$NETWORK" -# # confirm the asset appears in balances[] -# -# Spec: boundless-platform-contract-prd.md Section 8. +# The asset must be the one the token contract wraps, and the fee account must +# hold an authorized trustline for it: the contract checks neither, and a +# missing trustline makes every create_event and add_funds for the token +# revert. Both are verified before anything is signed. set -euo pipefail NETWORK="${1:-}" TOKEN="${2:-}" +ASSET="${3:-}" -if [[ -z "$NETWORK" || -z "$TOKEN" ]]; then - echo "usage: $0 " >&2 +if [[ -z "$NETWORK" || -z "$TOKEN" || -z "$ASSET" ]]; then + echo "usage: $0 " >&2 exit 1 fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" -if [[ -f "$REPO_ROOT/.env.deploy" ]]; then - # shellcheck disable=SC1091 - set -a; source "$REPO_ROOT/.env.deploy"; set +a -fi +# shellcheck source=../lib/deploy-env.sh +source "$SCRIPT_DIR/../lib/deploy-env.sh" +load_env_deploy "$REPO_ROOT/.env.deploy" +require_network "$NETWORK" +require_c_address token "$TOKEN" DEPLOY_RECORD="$REPO_ROOT/deployments/$NETWORK.json" if [[ ! -f "$DEPLOY_RECORD" ]]; then @@ -39,8 +36,10 @@ if [[ ! -f "$DEPLOY_RECORD" ]]; then fi # Pull the events contract id and fee account from the deployment record. -EVENTS_ID=$(node -e "console.log(require('$DEPLOY_RECORD').events_contract)") -FEE_ACCOUNT=$(node -e "console.log(require('$DEPLOY_RECORD').fee_account)") +EVENTS_ID=$(record_field "$DEPLOY_RECORD" events_contract) +FEE_ACCOUNT=$(record_field "$DEPLOY_RECORD" fee_account) +require_c_address events_contract "$EVENTS_ID" +require_g_address fee_account "$FEE_ACCOUNT" require() { local name="$1" @@ -54,15 +53,16 @@ require ADMIN_IDENTITY echo "==> registering token on boundless-events" echo " network: $NETWORK" echo " events: $EVENTS_ID" -echo " fee account: $FEE_ACCOUNT (operator: verify trustline exists)" +echo " fee account: $FEE_ACCOUNT" echo " token contract: $TOKEN" echo -read -r -p "fee account holds an active trustline for this token? [y/N] " confirm -if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then - echo "aborted. add the trustline first; the contract does not enforce it." >&2 +WRAPPED=$(stellar contract id asset --asset "$ASSET" --network "$NETWORK") +if [[ "$WRAPPED" != "$TOKEN" ]]; then + echo "error: $ASSET is wrapped by $WRAPPED, not $TOKEN" >&2 exit 1 fi +"$SCRIPT_DIR/../admin/verify-fee-trustline.sh" "$NETWORK" "$FEE_ACCOUNT" "$ASSET" stellar contract invoke \ --id "$EVENTS_ID" \ @@ -74,12 +74,8 @@ stellar contract invoke \ echo "==> done. token $TOKEN is now whitelisted." -# Append the token to the deployment record's supported_tokens array. TMP=$(mktemp) -node -e " -const fs = require('fs'); -const path = '$DEPLOY_RECORD'; -const rec = require(path); -rec.supported_tokens = Array.from(new Set([...(rec.supported_tokens || []), '$TOKEN'])); -fs.writeFileSync(path, JSON.stringify(rec, null, 2) + '\n'); -" +jq --arg t "$TOKEN" \ + '.supported_tokens = ((.supported_tokens // []) | if index($t) then . else . + [$t] end)' \ + "$DEPLOY_RECORD" > "$TMP" +mv "$TMP" "$DEPLOY_RECORD" diff --git a/scripts/deploy/verify.sh b/scripts/deploy/verify.sh index 86ab5bf..eff0047 100755 --- a/scripts/deploy/verify.sh +++ b/scripts/deploy/verify.sh @@ -1,17 +1,18 @@ #!/usr/bin/env bash -# verify.sh โ€” read-only post-deployment checks. +# verify.sh: read-only post-deployment checks. # # Usage: -# ./scripts/deploy/verify.sh +# ./scripts/deploy/verify.sh # -# Reads each contract's admin / fee account / profile binding and prints them -# alongside the deployment record so an operator can confirm they match. +# Prints the local deployment record next to each contract's version, admin, +# fee settings, bindings, pause flag and release validator so an operator can +# confirm they match. set -euo pipefail NETWORK="${1:-}" if [[ -z "$NETWORK" ]]; then - echo "usage: $0 " >&2 + echo "usage: $0 " >&2 exit 1 fi @@ -19,12 +20,11 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" DEPLOY_RECORD="$REPO_ROOT/deployments/$NETWORK.json" -# Load .env.deploy for ADMIN_IDENTITY (the CLI requires --source-account even -# on read-only invokes; the call is unsigned simulate-only). -if [[ -f "$REPO_ROOT/.env.deploy" ]]; then - # shellcheck disable=SC1091 - set -a; source "$REPO_ROOT/.env.deploy"; set +a -fi +# The CLI wants a source account even for a simulated read; nothing is signed. +# shellcheck source=../lib/deploy-env.sh +source "$SCRIPT_DIR/../lib/deploy-env.sh" +require_network "$NETWORK" +load_env_deploy "$REPO_ROOT/.env.deploy" SOURCE="${ADMIN_IDENTITY:-default}" if [[ ! -f "$DEPLOY_RECORD" ]]; then @@ -32,22 +32,35 @@ if [[ ! -f "$DEPLOY_RECORD" ]]; then exit 1 fi -EVENTS_ID=$(node -e "console.log(require('$DEPLOY_RECORD').events_contract)") -PROFILE_ID=$(node -e "console.log(require('$DEPLOY_RECORD').profile_contract)") +EVENTS_ID=$(record_field "$DEPLOY_RECORD" events_contract) +PROFILE_ID=$(record_field "$DEPLOY_RECORD" profile_contract) +require_c_address events_contract "$EVENTS_ID" +require_c_address profile_contract "$PROFILE_ID" echo "==> deployment record" cat "$DEPLOY_RECORD" echo +read_call() { + local id="$1" + shift + stellar contract invoke --id "$id" --source-account "$SOURCE" --network "$NETWORK" --send no -- "$@" +} + echo "==> on-chain events contract state" -echo " admin: $(stellar contract invoke --id "$EVENTS_ID" --source-account "$SOURCE" --network "$NETWORK" -- get_admin)" -echo " fee_account: $(stellar contract invoke --id "$EVENTS_ID" --source-account "$SOURCE" --network "$NETWORK" -- get_fee_account)" -echo " fee_bps: $(stellar contract invoke --id "$EVENTS_ID" --source-account "$SOURCE" --network "$NETWORK" -- get_fee_bps)" -echo " profile_contract: $(stellar contract invoke --id "$EVENTS_ID" --source-account "$SOURCE" --network "$NETWORK" -- get_profile_contract)" -echo " is_paused: $(stellar contract invoke --id "$EVENTS_ID" --source-account "$SOURCE" --network "$NETWORK" -- is_paused)" +echo " version: $(read_call "$EVENTS_ID" version)" +echo " migrated_to: $(read_call "$EVENTS_ID" get_migrated_to_version)" +echo " admin: $(read_call "$EVENTS_ID" get_admin)" +echo " fee_account: $(read_call "$EVENTS_ID" get_fee_account)" +echo " fee_bps: $(read_call "$EVENTS_ID" get_fee_bps)" +echo " profile_contract: $(read_call "$EVENTS_ID" get_profile_contract)" +echo " release_validator: $(read_call "$EVENTS_ID" get_release_validator)" +echo " is_paused: $(read_call "$EVENTS_ID" is_paused)" echo echo "==> on-chain profile contract state" -echo " admin: $(stellar contract invoke --id "$PROFILE_ID" --source-account "$SOURCE" --network "$NETWORK" -- get_admin)" -echo " events_contract: $(stellar contract invoke --id "$PROFILE_ID" --source-account "$SOURCE" --network "$NETWORK" -- get_events_contract)" -echo " is_paused: $(stellar contract invoke --id "$PROFILE_ID" --source-account "$SOURCE" --network "$NETWORK" -- is_paused)" +echo " version: $(read_call "$PROFILE_ID" version)" +echo " migrated_to: $(read_call "$PROFILE_ID" get_migrated_to_version)" +echo " admin: $(read_call "$PROFILE_ID" get_admin)" +echo " events_contract: $(read_call "$PROFILE_ID" get_events_contract)" +echo " is_paused: $(read_call "$PROFILE_ID" is_paused)" diff --git a/scripts/deploy_and_upgrade.sh b/scripts/deploy_and_upgrade.sh deleted file mode 100755 index bab5278..0000000 --- a/scripts/deploy_and_upgrade.sh +++ /dev/null @@ -1,148 +0,0 @@ -#!/bin/bash - -# Script for deploying and upgrading the Boundless contract -# Usage: ./deploy_and_upgrade.sh [deploy|upgrade] [network] [source_account] - -# Default values -ACTION=${1:-"deploy"} -NETWORK=${2:-"testnet"} -SOURCE_ACCOUNT=${3:-"admin"} -# CONTRACT_DIR="boundless/contracts/boundless" - -# Colors for output -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -RED='\033[0;31m' -NC='\033[0m' # No Color - -# Check if stellar CLI is installed -if ! command -v stellar &> /dev/null; then - echo -e "${RED}Error: stellar CLI is not installed.${NC}" - echo "Please install it from https://soroban.stellar.org/docs/getting-started/setup" - exit 1 -fi - -# Function to deploy the contract -deploy_contract() { - echo -e "${YELLOW}Deploying Boundless contract to ${NETWORK}...${NC}" - - # Build the contract with reference-types enabled - echo "Building contract..." - cd $CONTRACT_DIR || { echo -e "${RED}Failed to change directory to $CONTRACT_DIR${NC}"; exit 1; } - - # Use stellar contract build which handles the reference-types issue - stellar contract build --locked - - # Deploy the contract - echo "Deploying contract..." - CONTRACT_ID=$(stellar contract deploy \ - --wasm target/wasm32v1-none/release/boundless.wasm \ - --source $SOURCE_ACCOUNT \ - --network $NETWORK) - - if [ $? -ne 0 ]; then - echo -e "${RED}Deployment failed!${NC}" - exit 1 - fi - - echo -e "${GREEN}Contract deployed successfully!${NC}" - echo "Contract ID: $CONTRACT_ID" - - # Create .stellar directory if it doesn't exist - mkdir -p .stellar - - # Save the contract ID to a file for future reference - echo $CONTRACT_ID > .stellar/contract_id_${NETWORK}.txt - echo "Contract ID saved to .stellar/contract_id_${NETWORK}.txt" - - # Get the admin address - ADMIN_ADDRESS=$(stellar keys address $SOURCE_ACCOUNT) - echo "Admin address: $ADMIN_ADDRESS" - - # Initialize the contract - echo "Initializing contract..." - stellar contract invoke \ - --id $CONTRACT_ID \ - --source $SOURCE_ACCOUNT \ - --network $NETWORK \ - -- \ - initialize \ - --admin $ADMIN_ADDRESS - - if [ $? -ne 0 ]; then - echo -e "${RED}Initialization failed!${NC}" - exit 1 - fi - - echo -e "${GREEN}Contract initialized successfully!${NC}" -} - -# Function to upgrade the contract -upgrade_contract() { - echo -e "${YELLOW}Upgrading Boundless contract on ${NETWORK}...${NC}" - - # Check if contract ID file exists - if [ ! -f .stellar/contract_id_${NETWORK}.txt ]; then - echo -e "${RED}Contract ID file not found. Please deploy the contract first.${NC}" - exit 1 - fi - - # Read the contract ID - CONTRACT_ID=$(cat .stellar/contract_id_${NETWORK}.txt) - - # Build the contract with reference-types enabled - echo "Building contract..." - cd $CONTRACT_DIR || { echo -e "${RED}Failed to change directory to $CONTRACT_DIR${NC}"; exit 1; } - - # Use stellar contract build which handles the reference-types issue - stellar contract build --locked - - # Install the new WASM - echo "Installing new WASM..." - WASM_HASH=$(stellar contract install \ - --source-account $SOURCE_ACCOUNT \ - --wasm target/wasm32v1-none/release/boundless.wasm \ - --network $NETWORK) - - if [ $? -ne 0 ]; then - echo -e "${RED}WASM installation failed!${NC}" - exit 1 - fi - - echo "WASM hash: $WASM_HASH" - - # Upgrade the contract - echo "Upgrading contract..." - stellar contract invoke \ - --id $CONTRACT_ID \ - --source $SOURCE_ACCOUNT \ - --network $NETWORK \ - -- \ - upgrade \ - --new_wasm_hash $WASM_HASH - - if [ $? -ne 0 ]; then - echo -e "${RED}Upgrade failed!${NC}" - exit 1 - fi - - echo -e "${GREEN}Contract upgraded successfully!${NC}" - echo "Contract ID: $CONTRACT_ID" -} - -# Main script logic -case $ACTION in - "deploy") - deploy_contract - ;; - "upgrade") - upgrade_contract - ;; - *) - echo -e "${RED}Invalid action. Use 'deploy' or 'upgrade'.${NC}" - echo "Usage: ./deploy_and_upgrade.sh [deploy|upgrade] [network] [source_account]" - exit 1 - ;; -esac - -echo -e "${GREEN}Operation completed successfully!${NC}" diff --git a/scripts/lib/deploy-env.sh b/scripts/lib/deploy-env.sh new file mode 100644 index 0000000..cdd283f --- /dev/null +++ b/scripts/lib/deploy-env.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +# Helpers shared by the deploy scripts. Source this file; it defines functions +# only. + +# Reads KEY=VALUE lines from a .env.deploy file without executing it, so a +# tampered file cannot run commands. One level of surrounding quotes is +# stripped; nothing is expanded. +load_env_deploy() { + local file=$1 line key value n=0 + [[ -f "$file" ]] || return 0 + while IFS= read -r line || [[ -n "$line" ]]; do + n=$((n + 1)) + line="${line%$'\r'}" + [[ -z "${line//[[:space:]]/}" || "$line" =~ ^[[:space:]]*# ]] && continue + if [[ ! "$line" =~ ^(export[[:space:]]+)?([A-Z_][A-Z0-9_]*)=(.*)$ ]]; then + echo "error: $file:$n is not KEY=VALUE" >&2 + return 1 + fi + key="${BASH_REMATCH[2]}" + value="${BASH_REMATCH[3]}" + if [[ "$value" =~ ^\"(.*)\"$ || "$value" =~ ^\'(.*)\'$ ]]; then + value="${BASH_REMATCH[1]}" + fi + export "$key=$value" + done < "$file" +} + +require_network() { + case "$1" in + testnet | futurenet | mainnet) ;; + *) + echo "error: network must be one of testnet, futurenet, mainnet (got: $1)" >&2 + exit 1 + ;; + esac +} + +require_g_address() { + if [[ ! "$2" =~ ^G[A-Z2-7]{55}$ ]]; then + echo "error: $1 must be a G... account address (got: $2)" >&2 + exit 1 + fi +} + +require_c_address() { + if [[ ! "$2" =~ ^C[A-Z2-7]{55}$ ]]; then + echo "error: $1 must be a C... contract address (got: $2)" >&2 + exit 1 + fi +} + +# Prints one top-level string field of a deployment record. +record_field() { + jq -er --arg k "$2" '.[$k] | strings' "$1" +} diff --git a/scripts/test-admin-scripts.sh b/scripts/test-admin-scripts.sh new file mode 100755 index 0000000..375e613 --- /dev/null +++ b/scripts/test-admin-scripts.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# Runs the admin pre-flight checks against recorded Horizon fixtures, so a +# check that silently passes a bad configuration fails CI. + +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +DATA="$ROOT/scripts/testdata/horizon" +# shellcheck source=testdata/horizon/ids.env +source "$DATA/ids.env" +FAILED=0 + +expect() { + local want=$1 label=$2 + shift 2 + if "$@" >/dev/null 2>&1; then got=pass; else got=fail; fi + if [[ "$got" == "$want" ]]; then + echo "PASS $label ($got)" + else + echo "FAIL $label: expected $want, got $got" + FAILED=1 + fi +} + +multisig() { + MULTISIG_ACCOUNT_FILE="$DATA/$1" "$ROOT/scripts/admin/verify-multisig.sh" "$MULTISIG" testnet +} +roster() { + EXPECTED_SIGNERS=$2 MULTISIG_ACCOUNT_FILE="$DATA/$1" \ + "$ROOT/scripts/admin/verify-multisig.sh" "$MULTISIG" testnet +} +fee() { + FEE_TRUSTLINE_ACCOUNT_FILE="$DATA/$1" \ + "$ROOT/scripts/admin/verify-fee-trustline.sh" testnet "$FEE" "USDC:$ISSUER" +} + +expect pass "2-of-3 of account keys" multisig multisig-ok.json +expect fail "pre-auth tx signer in the quorum" multisig multisig-preauth.json +expect fail "hash-x signer in the quorum" multisig multisig-hashx.json +expect pass "signer roster matches" roster multisig-ok.json "$SIGNERS" +expect fail "signer roster differs" roster multisig-ok.json "${SIGNERS%,*},$OTHER" +expect fail "malformed multisig address" \ + "$ROOT/scripts/admin/verify-multisig.sh" 'GBAD$(id)' testnet + +expect pass "fee account trusts the token" fee fee-ok.json +expect fail "fee account has no trustline" fee fee-missing.json +expect fail "fee trustline not authorized" fee fee-unauthorized.json +expect pass "native needs no trustline" \ + "$ROOT/scripts/admin/verify-fee-trustline.sh" testnet "$FEE" native + +TMP=$(mktemp -d) +trap 'rm -rf "$TMP"' EXIT +printf 'ADMIN_IDENTITY=alice\nFEE_BPS="250"\nINJECT=$(touch %s/pwned)\n' "$TMP" > "$TMP/env" +( + # shellcheck source=lib/deploy-env.sh + source "$ROOT/scripts/lib/deploy-env.sh" + load_env_deploy "$TMP/env" + [[ "$ADMIN_IDENTITY" == alice && "$FEE_BPS" == 250 && ! -e "$TMP/pwned" ]] +) && echo "PASS .env.deploy is parsed, not executed" || { + echo "FAIL .env.deploy is parsed, not executed" + FAILED=1 +} + +exit "$FAILED" diff --git a/scripts/test-mainnet-upgrade-guards.sh b/scripts/test-mainnet-upgrade-guards.sh index 2b61371..ee78b24 100755 --- a/scripts/test-mainnet-upgrade-guards.sh +++ b/scripts/test-mainnet-upgrade-guards.sh @@ -1,15 +1,18 @@ #!/usr/bin/env bash +# Exercises deploy_mainnet.sh against scripts/testdata/mock-stellar, so a guard +# that stops refusing an unsafe upgrade step fails CI. No network is used. set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" TEST_ROOT="$(mktemp -d "${TMPDIR:-/tmp}/boundless-mainnet-guards.XXXXXX")" FAKE_BIN="$TEST_ROOT/bin" SCRIPT="$TEST_ROOT/deploy_mainnet.sh" -EVENTS_WASM="$ROOT/contracts/compatibility/fixtures/events-1.5.0-sdk27.wasm" -PROFILE_WASM="$ROOT/contracts/compatibility/fixtures/profile-1.2.0-sdk27.wasm" XDR_DIR="$TEST_ROOT/xdr" -OLD_EVENTS_HASH="2a8789bf5dd392b91ddfe6591072a0cb9fae70045abf379fd1dbbc2db4af1de3" -OLD_PROFILE_HASH="b9e3500cfb559781e68359655f37775c78afffc5a8436daca9d1d1f8e3569b02" +EVENTS_WASM="$TEST_ROOT/events-2.0.0.wasm" +PROFILE_WASM="$TEST_ROOT/profile-1.2.1.wasm" +MISLABELLED_WASM="$TEST_ROOT/events-mislabelled.wasm" +OLD_EVENTS_HASH="b87365c16102f7242a8fc3e770f615991841741c40673bb241cb254130be4c26" +OLD_PROFILE_HASH="6b4804920a4068dfdcaaa711fac6390850e0a92f4b5ed4e46259694b61cbae12" WRONG_HASH="0000000000000000000000000000000000000000000000000000000000000000" cleanup() { @@ -21,12 +24,16 @@ mkdir -p "$FAKE_BIN" "$XDR_DIR" cp "$ROOT/scripts/testdata/mock-stellar" "$FAKE_BIN/stellar" cp "$ROOT/deploy_mainnet.sh" "$SCRIPT" chmod +x "$FAKE_BIN/stellar" "$SCRIPT" +printf 'kind=events\nversion=2.0.0\n' > "$EVENTS_WASM" +printf 'kind=profile\nversion=1.2.1\n' > "$PROFILE_WASM" +printf 'kind=events\nversion=2.0.1\n' > "$MISLABELLED_WASM" export PATH="$FAKE_BIN:$PATH" export STELLAR_NETWORK=mainnet-review export ADMIN_SOURCE=GADMIN export EVENTS_ID=EVENTS export PROFILE_ID=PROFILE +unset STELLAR_RPC_URL STELLAR_NETWORK_PASSPHRASE UNPAUSE_UNMIGRATED hash_file() { if command -v sha256sum >/dev/null 2>&1; then @@ -36,187 +43,217 @@ hash_file() { fi } -events_wasm_hash="$(hash_file "$EVENTS_WASM")" -profile_wasm_hash="$(hash_file "$PROFILE_WASM")" -events_pending="{\"new_version\":\"1.5.0\",\"wasm_hash\":\"$events_wasm_hash\"}" -profile_pending="{\"new_version\":\"1.2.0\",\"wasm_hash\":\"$profile_wasm_hash\"}" -bad_events_pending="{\"new_version\":\"1.5.0\",\"wasm_hash\":\"$WRONG_HASH\"}" -bad_profile_pending="{\"new_version\":\"1.2.0\",\"wasm_hash\":\"$WRONG_HASH\"}" +events_hash="$(hash_file "$EVENTS_WASM")" +profile_hash="$(hash_file "$PROFILE_WASM")" +events_pending="{\"new_version\":\"2.0.0\",\"wasm_hash\":\"$events_hash\",\"available_at_ledger\":100,\"expires_at_ledger\":518500}" +profile_pending="{\"new_version\":\"1.2.1\",\"wasm_hash\":\"$profile_hash\",\"available_at_ledger\":100,\"expires_at_ledger\":518500}" +bad_events_pending="{\"new_version\":\"2.0.0\",\"wasm_hash\":\"$WRONG_HASH\"}" -set_state() { +# Mainnet as of the 2.0.0 upgrade: events 1.7.0 stamped at 1.6.0 with rows +# still in the old layout, profile 1.2.0 never stamped. +set_events() { export FAKE_EVENTS_VERSION="$1" export FAKE_EVENTS_PAUSED="$2" export FAKE_EVENTS_PENDING="$3" export FAKE_EVENTS_MIGRATED="$4" - export FAKE_PROFILE_VERSION="$5" - export FAKE_PROFILE_PAUSED="$6" - export FAKE_PROFILE_PENDING="$7" - export FAKE_PROFILE_MIGRATED="$8" - export FAKE_PROFILE_EVENTS_CONTRACT=EVENTS - export FAKE_PROFILE_EVENTS_PENDING=null - if [ "$FAKE_EVENTS_VERSION" = "1.5.0" ]; then - export FAKE_EVENTS_LIVE_HASH="$events_wasm_hash" + export FAKE_EVENTS_MIGRATION_REMAINING="${5:-0}" + if [ "$1" = "2.0.0" ]; then + export FAKE_EVENTS_LIVE_HASH="$events_hash" else export FAKE_EVENTS_LIVE_HASH="$OLD_EVENTS_HASH" fi - if [ "$FAKE_PROFILE_VERSION" = "1.2.0" ]; then - export FAKE_PROFILE_LIVE_HASH="$profile_wasm_hash" +} + +set_profile() { + export FAKE_PROFILE_VERSION="$1" + export FAKE_PROFILE_PAUSED="$2" + export FAKE_PROFILE_PENDING="$3" + export FAKE_PROFILE_MIGRATED="$4" + if [ "$1" = "1.2.1" ]; then + export FAKE_PROFILE_LIVE_HASH="$profile_hash" else export FAKE_PROFILE_LIVE_HASH="$OLD_PROFILE_HASH" fi } +reset() { + unset FAKE_CLI_VERSION FAKE_ADMIN UNPAUSE_UNMIGRATED + export FAKE_PROFILE_EVENTS_CONTRACT=EVENTS + export FAKE_PROFILE_EVENTS_PENDING=null + set_events 1.7.0 false null '"1.6.0"' 8 + set_profile 1.2.0 false null null +} + expect_ok() { - local label="$1" + local label="$1" log shift - "$@" >/dev/null + log="$TEST_ROOT/last.log" + if ! "$@" >"$log" 2>&1; then + printf 'FAIL %s\n' "$label" >&2 + cat "$log" >&2 + exit 1 + fi printf 'PASS %s\n' "$label" } expect_fail() { - local label="$1" + local label="$1" log shift - if "$@" >/dev/null 2>&1; then + log="$TEST_ROOT/last.log" + if "$@" >/dev/null 2>"$log"; then printf 'FAIL %s unexpectedly succeeded\n' "$label" >&2 exit 1 fi - printf 'PASS %s failed closed\n' "$label" + printf 'PASS %s failed closed: %s\n' "$label" "$(tail -1 "$log" | sed 's/\x1b\[[0-9;]*m//g')" } -set_state 1.1.0 false null null 1.1.0 false null null -export FAKE_PROFILE_EVENTS_PENDING='{"target":"ROTATED","proposed_at":100}' -expect_fail pause-events-with-pending-profile-rotation \ - "$SCRIPT" prepare-pause-events "$XDR_DIR/pending-rotation-pause-events.xdr" - -set_state 1.1.0 false null null 1.1.0 false null null -export FAKE_PROFILE_EVENTS_CONTRACT=OTHER_EVENTS -expect_fail pause-events-with-profile-binding-drift \ - "$SCRIPT" prepare-pause-events "$XDR_DIR/binding-drift-pause-events.xdr" +x() { + printf '%s/%s.xdr' "$XDR_DIR" "$1" +} -set_state 1.1.0 false null null 1.1.0 false null null -expect_ok pause-events "$SCRIPT" prepare-pause-events "$XDR_DIR/pause-events.xdr" -expect_fail pause-profile-before-events \ - "$SCRIPT" prepare-pause-profile "$XDR_DIR/early-pause-profile.xdr" +reset +expect_ok upgrade-status "$SCRIPT" upgrade-status +expect_ok verify "$SCRIPT" verify +export FAKE_CLI_VERSION=27.0.0 +expect_fail old-cli "$SCRIPT" upgrade-status +reset +export STELLAR_RPC_URL=https://rpc.example.invalid +expect_fail explicit-rpc-with-named-network "$SCRIPT" upgrade-status +unset STELLAR_RPC_URL +expect_fail direct-submit-action "$SCRIPT" propose-upgrade-events "$EVENTS_WASM" 2.0.0 +expect_fail unknown-action "$SCRIPT" launch-everything -set_state 1.1.0 true null null 1.1.0 false null null -expect_ok pause-profile "$SCRIPT" prepare-pause-profile "$XDR_DIR/pause-profile.xdr" +reset +export FAKE_PROFILE_EVENTS_PENDING='{"target":"ROTATED","proposed_at":100}' +expect_fail pause-with-pending-profile-rotation "$SCRIPT" prepare-pause-events "$(x a)" +reset +export FAKE_PROFILE_EVENTS_CONTRACT=OTHER_EVENTS +expect_fail pause-with-profile-binding-drift "$SCRIPT" prepare-pause-events "$(x b)" +reset +export FAKE_ADMIN=GOTHER +expect_fail pause-with-admin-mismatch "$SCRIPT" prepare-pause-events "$(x c)" -set_state 1.1.0 true null null 1.1.0 true null null -expect_ok propose-profile \ - "$SCRIPT" prepare-propose-upgrade-profile "$PROFILE_WASM" 1.2.0 "$XDR_DIR/propose-profile.xdr" -expect_fail propose-profile-with-events-artifact \ - "$SCRIPT" prepare-propose-upgrade-profile "$EVENTS_WASM" 1.2.0 "$XDR_DIR/wrong-profile-artifact.xdr" -expect_fail propose-profile-with-unpinned-version \ - "$SCRIPT" prepare-propose-upgrade-profile "$PROFILE_WASM" 9.9.9 "$XDR_DIR/wrong-profile-version.xdr" -expect_fail propose-events-before-profile-staged \ - "$SCRIPT" prepare-propose-upgrade-events "$EVENTS_WASM" 1.5.0 "$XDR_DIR/early-propose-events.xdr" +reset +expect_ok pause-events "$SCRIPT" prepare-pause-events "$(x pause-events)" +[ -s "$(x pause-events)" ] || { echo "FAIL pause-events wrote no XDR" >&2; exit 1; } +expect_fail pause-events-missing-output-dir "$SCRIPT" prepare-pause-events "$TEST_ROOT/missing/out.xdr" +set_events 1.7.0 true null '"1.6.0"' 8 +expect_fail pause-events-twice "$SCRIPT" prepare-pause-events "$(x d)" -set_state 1.1.0 true null null 1.1.0 true "$profile_pending" null -expect_ok verify-profile-proposal \ - "$SCRIPT" verify-proposed-upgrade-profile "$PROFILE_WASM" 1.2.0 expect_ok propose-events \ - "$SCRIPT" prepare-propose-upgrade-events "$EVENTS_WASM" 1.5.0 "$XDR_DIR/propose-events.xdr" + "$SCRIPT" prepare-propose-upgrade-events "$EVENTS_WASM" 2.0.0 "$(x propose-events)" expect_fail propose-events-with-profile-artifact \ - "$SCRIPT" prepare-propose-upgrade-events "$PROFILE_WASM" 1.5.0 "$XDR_DIR/wrong-events-artifact.xdr" -expect_fail propose-events-with-unpinned-version \ - "$SCRIPT" prepare-propose-upgrade-events "$EVENTS_WASM" 9.9.9 "$XDR_DIR/wrong-events-version.xdr" -set_state 1.1.0 true null null 1.1.0 true "$bad_profile_pending" null -expect_fail propose-events-with-wrong-pending-profile-wasm \ - "$SCRIPT" prepare-propose-upgrade-events "$EVENTS_WASM" 1.5.0 "$XDR_DIR/wrong-profile-pending-propose-events.xdr" - -set_state 1.1.0 true "$events_pending" null 1.1.0 true "$profile_pending" null + "$SCRIPT" prepare-propose-upgrade-events "$PROFILE_WASM" 1.2.1 "$(x e)" +expect_fail propose-events-version-not-in-contractmeta \ + "$SCRIPT" prepare-propose-upgrade-events "$EVENTS_WASM" 2.0.1 "$(x f)" +expect_fail propose-events-mislabelled-artifact \ + "$SCRIPT" prepare-propose-upgrade-events "$MISLABELLED_WASM" 2.0.0 "$(x g)" +expect_fail propose-events-malformed-version \ + "$SCRIPT" prepare-propose-upgrade-events "$EVENTS_WASM" 2.0 "$(x h)" +expect_fail propose-events-missing-wasm \ + "$SCRIPT" prepare-propose-upgrade-events "$TEST_ROOT/none.wasm" 2.0.0 "$(x i)" +set_events 1.7.0 true "$events_pending" '"1.6.0"' 8 +expect_fail propose-events-while-pending \ + "$SCRIPT" prepare-propose-upgrade-events "$EVENTS_WASM" 2.0.0 "$(x j)" +set_events 2.0.0 false null '"2.0.0"' 0 +expect_fail propose-events-same-version \ + "$SCRIPT" prepare-propose-upgrade-events "$EVENTS_WASM" 2.0.0 "$(x k)" + +set_events 1.7.0 true "$events_pending" '"1.6.0"' 8 expect_ok verify-events-proposal \ - "$SCRIPT" verify-proposed-upgrade-events "$EVENTS_WASM" 1.5.0 -expect_ok apply-profile \ - "$SCRIPT" prepare-apply-upgrade-profile "$PROFILE_WASM" 1.2.0 "$XDR_DIR/apply-profile.xdr" -expect_fail apply-events-before-profile-applied \ - "$SCRIPT" prepare-apply-upgrade-events "$EVENTS_WASM" 1.5.0 "$XDR_DIR/early-apply-events.xdr" -set_state 1.1.0 true "$bad_events_pending" null 1.1.0 true "$profile_pending" null -expect_fail apply-profile-with-wrong-pending-events-wasm \ - "$SCRIPT" prepare-apply-upgrade-profile "$PROFILE_WASM" 1.2.0 "$XDR_DIR/wrong-events-pending-apply-profile.xdr" - -set_state 1.1.0 true "$events_pending" null 1.2.0 true null null + "$SCRIPT" verify-proposed-upgrade-events "$EVENTS_WASM" 2.0.0 +expect_fail verify-events-proposal-wrong-version \ + "$SCRIPT" verify-proposed-upgrade-events "$MISLABELLED_WASM" 2.0.1 +set_events 1.7.0 true "$bad_events_pending" '"1.6.0"' 8 +expect_fail verify-events-proposal-wrong-wasm \ + "$SCRIPT" verify-proposed-upgrade-events "$EVENTS_WASM" 2.0.0 + +set_events 1.7.0 true "$events_pending" '"1.6.0"' 8 expect_ok apply-events \ - "$SCRIPT" prepare-apply-upgrade-events "$EVENTS_WASM" 1.5.0 "$XDR_DIR/apply-events.xdr" -export FAKE_PROFILE_LIVE_HASH="$WRONG_HASH" -expect_fail apply-events-with-wrong-live-profile-wasm \ - "$SCRIPT" prepare-apply-upgrade-events "$EVENTS_WASM" 1.5.0 "$XDR_DIR/wrong-profile-live-apply-events.xdr" + "$SCRIPT" prepare-apply-upgrade-events "$EVENTS_WASM" 2.0.0 "$(x apply-events)" +set_events 1.7.0 false "$events_pending" '"1.6.0"' 8 +expect_fail apply-events-unpaused \ + "$SCRIPT" prepare-apply-upgrade-events "$EVENTS_WASM" 2.0.0 "$(x l)" +set_events 1.7.0 true "$bad_events_pending" '"1.6.0"' 8 +expect_fail apply-events-wrong-pending-wasm \ + "$SCRIPT" prepare-apply-upgrade-events "$EVENTS_WASM" 2.0.0 "$(x m)" +set_events 1.7.0 true null '"1.6.0"' 8 +expect_fail apply-events-nothing-pending \ + "$SCRIPT" prepare-apply-upgrade-events "$EVENTS_WASM" 2.0.0 "$(x n)" -set_state 1.5.0 true null null 1.2.0 true null null -expect_ok migrate-profile \ - "$SCRIPT" prepare-migrate-upgrade-profile 1.2.0 "$XDR_DIR/migrate-profile.xdr" -export FAKE_EVENTS_LIVE_HASH="$WRONG_HASH" -expect_fail migrate-profile-with-wrong-live-events-wasm \ - "$SCRIPT" prepare-migrate-upgrade-profile 1.2.0 "$XDR_DIR/wrong-events-live-migrate-profile.xdr" -set_state 1.5.0 true null null 1.2.0 true null null -export FAKE_PROFILE_LIVE_HASH="$WRONG_HASH" -expect_fail migrate-profile-with-wrong-live-profile-wasm \ - "$SCRIPT" prepare-migrate-upgrade-profile 1.2.0 "$XDR_DIR/wrong-profile-live-migrate-profile.xdr" -set_state 1.5.0 true null null 1.2.0 true null null -expect_fail migrate-events-before-profile-migrated \ - "$SCRIPT" prepare-migrate-upgrade-events 1.5.0 "$XDR_DIR/early-migrate-events.xdr" +set_events 2.0.0 true null '"1.6.0"' 2 +expect_ok migrate-events-page \ + "$SCRIPT" prepare-migrate-events-page 8 "$(x migrate-events-page)" +expect_fail migrate-events-page-zero "$SCRIPT" prepare-migrate-events-page 0 "$(x o)" +expect_fail migrate-events-page-not-a-number "$SCRIPT" prepare-migrate-events-page eight "$(x p)" +expect_fail migrate-before-pages-finish \ + "$SCRIPT" prepare-migrate-upgrade-events 2.0.0 "$(x q)" +set_events 2.0.0 false null '"1.6.0"' 2 +expect_fail migrate-events-page-unpaused "$SCRIPT" prepare-migrate-events-page 8 "$(x r)" +set_events 2.0.0 true "$events_pending" '"1.6.0"' 2 +expect_fail migrate-events-page-with-pending-upgrade \ + "$SCRIPT" prepare-migrate-events-page 8 "$(x s)" +set_events 2.0.0 true null '"1.6.0"' 0 +expect_fail migrate-events-page-when-done "$SCRIPT" prepare-migrate-events-page 8 "$(x t)" -set_state 1.5.0 true null null 1.2.0 true null '"1.2.0"' expect_ok migrate-events \ - "$SCRIPT" prepare-migrate-upgrade-events 1.5.0 "$XDR_DIR/migrate-events.xdr" + "$SCRIPT" prepare-migrate-upgrade-events 2.0.0 "$(x migrate-events)" +expect_fail migrate-events-wrong-version \ + "$SCRIPT" prepare-migrate-upgrade-events 1.9.9 "$(x u)" +set_events 2.0.0 false null '"1.6.0"' 0 +expect_fail migrate-events-unpaused \ + "$SCRIPT" prepare-migrate-upgrade-events 2.0.0 "$(x v)" +set_events 2.0.0 true null '"2.0.0"' 0 +expect_fail migrate-events-replay \ + "$SCRIPT" prepare-migrate-upgrade-events 2.0.0 "$(x w)" +expect_fail migrate-events-page-after-stamp "$SCRIPT" prepare-migrate-events-page 8 "$(x y)" -set_state 1.5.0 true null '"1.5.0"' 1.2.0 true null '"1.2.0"' -expect_ok unpause-profile \ - "$SCRIPT" prepare-unpause-profile 1.2.0 "$XDR_DIR/unpause-profile.xdr" -expect_fail unpause-profile-with-unpinned-version \ - "$SCRIPT" prepare-unpause-profile 9.9.9 "$XDR_DIR/wrong-profile-unpause-version.xdr" -export FAKE_PROFILE_LIVE_HASH="$WRONG_HASH" -expect_fail unpause-profile-with-wrong-live-profile-wasm \ - "$SCRIPT" prepare-unpause-profile 1.2.0 "$XDR_DIR/wrong-profile-live-unpause-profile.xdr" -set_state 1.5.0 true null '"1.5.0"' 1.2.0 true null '"1.2.0"' -export FAKE_EVENTS_LIVE_HASH="$WRONG_HASH" -expect_fail unpause-profile-with-wrong-live-events-wasm \ - "$SCRIPT" prepare-unpause-profile 1.2.0 "$XDR_DIR/wrong-events-live-unpause-profile.xdr" -set_state 1.5.0 true null '"1.5.0"' 1.2.0 true null '"1.2.0"' -expect_fail unpause-events-before-profile-unpaused \ - "$SCRIPT" prepare-unpause-events 1.5.0 "$XDR_DIR/early-unpause-events.xdr" - -set_state 1.5.0 true null '"1.5.0"' 1.2.0 false null '"1.2.0"' -expect_ok unpause-events \ - "$SCRIPT" prepare-unpause-events 1.5.0 "$XDR_DIR/unpause-events.xdr" -expect_fail unpause-events-with-unpinned-version \ - "$SCRIPT" prepare-unpause-events 9.9.9 "$XDR_DIR/wrong-events-unpause-version.xdr" -export FAKE_EVENTS_LIVE_HASH="$WRONG_HASH" -expect_fail unpause-events-with-wrong-live-events-wasm \ - "$SCRIPT" prepare-unpause-events 1.5.0 "$XDR_DIR/wrong-events-live-unpause-events.xdr" -set_state 1.5.0 true null '"1.5.0"' 1.2.0 false null '"1.2.0"' -export FAKE_PROFILE_LIVE_HASH="$WRONG_HASH" -expect_fail unpause-events-with-wrong-live-profile-wasm \ - "$SCRIPT" prepare-unpause-events 1.5.0 "$XDR_DIR/wrong-profile-live-unpause-events.xdr" +expect_ok unpause-events "$SCRIPT" prepare-unpause-events 2.0.0 "$(x unpause-events)" +expect_fail unpause-events-wrong-version "$SCRIPT" prepare-unpause-events 1.7.0 "$(x z)" +set_events 2.0.0 true null '"1.6.0"' 0 +expect_fail unpause-events-unmigrated "$SCRIPT" prepare-unpause-events 2.0.0 "$(x aa)" +set_events 1.7.0 true null '"1.6.0"' 8 +export UNPAUSE_UNMIGRATED=1 +expect_ok abandon-unpause-events "$SCRIPT" prepare-unpause-events 1.7.0 "$(x abandon-events)" +unset UNPAUSE_UNMIGRATED +set_events 1.7.0 true "$events_pending" '"1.6.0"' 8 +export UNPAUSE_UNMIGRATED=1 +expect_fail unpause-events-with-pending-upgrade "$SCRIPT" prepare-unpause-events 1.7.0 "$(x ab)" +unset UNPAUSE_UNMIGRATED +set_events 2.0.0 false null '"2.0.0"' 0 +expect_fail unpause-events-not-paused "$SCRIPT" prepare-unpause-events 2.0.0 "$(x ac)" -set_state 1.5.0 false null '"1.5.0"' 1.2.0 false null '"1.2.0"' -expect_ok upgrade-status "$SCRIPT" upgrade-status -expect_ok verify-profile "$SCRIPT" verify-upgrade-profile "$PROFILE_WASM" 1.2.0 -expect_ok verify-events "$SCRIPT" verify-upgrade-events "$EVENTS_WASM" 1.5.0 +expect_ok verify-events "$SCRIPT" verify-upgrade-events "$EVENTS_WASM" 2.0.0 export FAKE_EVENTS_LIVE_HASH="$WRONG_HASH" -expect_fail verify-events-with-wrong-live-wasm \ - "$SCRIPT" verify-upgrade-events "$EVENTS_WASM" 1.5.0 -set_state 1.5.0 false null '"1.5.0"' 1.2.0 false null '"1.2.0"' +expect_fail verify-events-wrong-live-wasm "$SCRIPT" verify-upgrade-events "$EVENTS_WASM" 2.0.0 +set_events 2.0.0 true null '"2.0.0"' 0 +expect_fail verify-events-still-paused "$SCRIPT" verify-upgrade-events "$EVENTS_WASM" 2.0.0 +set_events 2.0.0 false null '"1.6.0"' 0 +expect_fail verify-events-unmigrated "$SCRIPT" verify-upgrade-events "$EVENTS_WASM" 2.0.0 + +reset +set_events 2.0.0 false null '"2.0.0"' 0 +expect_ok propose-profile \ + "$SCRIPT" prepare-propose-upgrade-profile "$PROFILE_WASM" 1.2.1 "$(x propose-profile)" +expect_fail propose-profile-with-events-artifact \ + "$SCRIPT" prepare-propose-upgrade-profile "$EVENTS_WASM" 2.0.0 "$(x ad)" +set_profile 1.2.0 false "$profile_pending" null +expect_ok verify-profile-proposal \ + "$SCRIPT" verify-proposed-upgrade-profile "$PROFILE_WASM" 1.2.1 +expect_ok apply-profile \ + "$SCRIPT" prepare-apply-upgrade-profile "$PROFILE_WASM" 1.2.1 "$(x apply-profile)" +expect_ok cancel-profile "$SCRIPT" prepare-cancel-upgrade-profile "$(x cancel-profile)" +set_profile 1.2.0 false null null +expect_fail cancel-profile-nothing-pending "$SCRIPT" prepare-cancel-upgrade-profile "$(x ae)" +set_profile 1.2.1 false null null +expect_ok migrate-profile "$SCRIPT" prepare-migrate-upgrade-profile 1.2.1 "$(x migrate-profile)" +expect_fail migrate-profile-wrong-version \ + "$SCRIPT" prepare-migrate-upgrade-profile 1.2.0 "$(x af)" +set_profile 1.2.1 false null '"1.2.1"' +expect_fail migrate-profile-replay "$SCRIPT" prepare-migrate-upgrade-profile 1.2.1 "$(x ag)" +expect_ok verify-profile "$SCRIPT" verify-upgrade-profile "$PROFILE_WASM" 1.2.1 export FAKE_PROFILE_LIVE_HASH="$WRONG_HASH" -expect_fail verify-profile-with-wrong-live-wasm \ - "$SCRIPT" verify-upgrade-profile "$PROFILE_WASM" 1.2.0 - -set_state 1.1.0 true "$events_pending" null 1.1.0 true "$profile_pending" null -expect_ok cancel-profile \ - "$SCRIPT" prepare-cancel-upgrade-profile "$XDR_DIR/cancel-profile.xdr" -expect_fail abandon-profile-before-events-cancel \ - "$SCRIPT" prepare-unpause-profile 1.1.0 "$XDR_DIR/early-abandon-profile.xdr" - -set_state 1.1.0 true "$events_pending" null 1.1.0 true null null -expect_ok cancel-events \ - "$SCRIPT" prepare-cancel-upgrade-events "$XDR_DIR/cancel-events.xdr" - -set_state 1.1.0 true null null 1.1.0 true null null -expect_ok abandon-unpause-profile \ - "$SCRIPT" prepare-unpause-profile 1.1.0 "$XDR_DIR/abandon-profile.xdr" -expect_fail abandon-events-before-profile-unpaused \ - "$SCRIPT" prepare-unpause-events 1.1.0 "$XDR_DIR/early-abandon-events.xdr" - -set_state 1.1.0 true null null 1.1.0 false null null -expect_ok abandon-unpause-events \ - "$SCRIPT" prepare-unpause-events 1.1.0 "$XDR_DIR/abandon-events.xdr" +expect_fail verify-profile-wrong-live-wasm "$SCRIPT" verify-upgrade-profile "$PROFILE_WASM" 1.2.1 + +set_events 2.0.0 true "$events_pending" '"1.6.0"' 0 +expect_ok cancel-events "$SCRIPT" prepare-cancel-upgrade-events "$(x cancel-events)" diff --git a/scripts/test-sdk27-compat.sh b/scripts/test-storage-compat.sh similarity index 72% rename from scripts/test-sdk27-compat.sh rename to scripts/test-storage-compat.sh index 4f2194a..fad0401 100755 --- a/scripts/test-sdk27-compat.sh +++ b/scripts/test-storage-compat.sh @@ -28,8 +28,8 @@ rustc --version | grep -q '^rustc 1\.93\.0 ' || { echo "Rust 1.93.0 is required" >&2 exit 1 } -stellar --version | head -n 1 | grep -q '^stellar 27\.0\.0 ' || { - echo "Stellar CLI 27.0.0 is required" >&2 +stellar --version | head -n 1 | grep -q '^stellar 28\.1\.0 ' || { + echo "Stellar CLI 28.1.0 is required" >&2 exit 1 } @@ -86,31 +86,7 @@ jq -e \ exit 1 } -verify_build="${VERIFY_SDK27_BUILD:-0}" -case "$verify_build" in - 0) ;; - 1) - EVENTS_WASM="$ROOT/target/wasm32v1-none/release/boundless_events.wasm" - PROFILE_WASM="$ROOT/target/wasm32v1-none/release/boundless_profile.wasm" - [ -f "$EVENTS_WASM" ] || { - echo "missing $EVENTS_WASM; run stellar contract build --locked first" >&2 - exit 1 - } - [ -f "$PROFILE_WASM" ] || { - echo "missing $PROFILE_WASM; run stellar contract build --locked first" >&2 - exit 1 - } - - events_hash="$(jq -r '.wasm[] | select(.file == "events-1.5.0-sdk27.wasm") | .sha256' "$MANIFEST")" - profile_hash="$(jq -r '.wasm[] | select(.file == "profile-1.2.0-sdk27.wasm") | .sha256' "$MANIFEST")" - check_hash "$EVENTS_WASM" "$events_hash" - check_hash "$PROFILE_WASM" "$profile_hash" - ;; - *) - echo "VERIFY_SDK27_BUILD must be 0 or 1" >&2 - exit 1 - ;; -esac - +# The replay upgrades into the release build of this tree, so build it first. cd "$ROOT" -cargo test --locked -p boundless-storage-compatibility +./scripts/build-release.sh +cargo test --locked -p boundless-storage-compatibility -- --include-ignored diff --git a/scripts/testdata/horizon/fee-missing.json b/scripts/testdata/horizon/fee-missing.json new file mode 100644 index 0000000..b896c6a --- /dev/null +++ b/scripts/testdata/horizon/fee-missing.json @@ -0,0 +1,9 @@ +{ + "id": "GVFZ5ZFKKIBJ5J6WJIBAGI3MNBQNSPUQ2IDW52IJB4LAJLJ6HDU6GDPM", + "balances": [ + { + "asset_type": "native", + "balance": "10.0000000" + } + ] +} \ No newline at end of file diff --git a/scripts/testdata/horizon/fee-ok.json b/scripts/testdata/horizon/fee-ok.json new file mode 100644 index 0000000..159f260 --- /dev/null +++ b/scripts/testdata/horizon/fee-ok.json @@ -0,0 +1,16 @@ +{ + "id": "GVFZ5ZFKKIBJ5J6WJIBAGI3MNBQNSPUQ2IDW52IJB4LAJLJ6HDU6GDPM", + "balances": [ + { + "asset_type": "credit_alphanum4", + "asset_code": "USDC", + "asset_issuer": "GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5", + "balance": "0.0000000", + "is_authorized": true + }, + { + "asset_type": "native", + "balance": "10.0000000" + } + ] +} \ No newline at end of file diff --git a/scripts/testdata/horizon/fee-unauthorized.json b/scripts/testdata/horizon/fee-unauthorized.json new file mode 100644 index 0000000..7c15242 --- /dev/null +++ b/scripts/testdata/horizon/fee-unauthorized.json @@ -0,0 +1,16 @@ +{ + "id": "GVFZ5ZFKKIBJ5J6WJIBAGI3MNBQNSPUQ2IDW52IJB4LAJLJ6HDU6GDPM", + "balances": [ + { + "asset_type": "credit_alphanum4", + "asset_code": "USDC", + "asset_issuer": "GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5", + "balance": "0.0000000", + "is_authorized": false + }, + { + "asset_type": "native", + "balance": "10.0000000" + } + ] +} \ No newline at end of file diff --git a/scripts/testdata/horizon/ids.env b/scripts/testdata/horizon/ids.env new file mode 100644 index 0000000..629355d --- /dev/null +++ b/scripts/testdata/horizon/ids.env @@ -0,0 +1,5 @@ +MULTISIG=GUJZDEGXDNCF32EPF3DHODZDOCIS2JHTLGMXGEDN73U55XTPLPFT7V4S +SIGNERS=GEH2KVJ72CEUVW75EFR6EDT4SYWB5WKH7DNSIPZZ7FK4ZRI3R2WYOJFL,GJOOA7LQSAJ2XUID5ZZZZG6ZDMEN4KHVDGAJGXBENYJQWX6HH7566TFJ,GGVQ6KBNXJBTFQXKWOVOMPZOM7WBBR6QMW4WXFOGO6MVN6A6WFHYM6L3 +OTHER=GRCG4BE4UMR46PQM4I2HZ4UEP3ENTHJXJQI5OGZ7KOK3ZV2MWUFXBV54 +FEE=GVFZ5ZFKKIBJ5J6WJIBAGI3MNBQNSPUQ2IDW52IJB4LAJLJ6HDU6GDPM +ISSUER=GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5 diff --git a/scripts/testdata/horizon/multisig-hashx.json b/scripts/testdata/horizon/multisig-hashx.json new file mode 100644 index 0000000..67ace3b --- /dev/null +++ b/scripts/testdata/horizon/multisig-hashx.json @@ -0,0 +1,30 @@ +{ + "id": "GUJZDEGXDNCF32EPF3DHODZDOCIS2JHTLGMXGEDN73U55XTPLPFT7V4S", + "thresholds": { + "low_threshold": 0, + "med_threshold": 2, + "high_threshold": 2 + }, + "signers": [ + { + "key": "GEH2KVJ72CEUVW75EFR6EDT4SYWB5WKH7DNSIPZZ7FK4ZRI3R2WYOJFL", + "weight": 1, + "type": "ed25519_public_key" + }, + { + "key": "GJOOA7LQSAJ2XUID5ZZZZG6ZDMEN4KHVDGAJGXBENYJQWX6HH7566TFJ", + "weight": 1, + "type": "ed25519_public_key" + }, + { + "key": "XBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "weight": 1, + "type": "sha256_hash" + }, + { + "key": "GUJZDEGXDNCF32EPF3DHODZDOCIS2JHTLGMXGEDN73U55XTPLPFT7V4S", + "weight": 0, + "type": "ed25519_public_key" + } + ] +} \ No newline at end of file diff --git a/scripts/testdata/horizon/multisig-ok.json b/scripts/testdata/horizon/multisig-ok.json new file mode 100644 index 0000000..299e125 --- /dev/null +++ b/scripts/testdata/horizon/multisig-ok.json @@ -0,0 +1,30 @@ +{ + "id": "GUJZDEGXDNCF32EPF3DHODZDOCIS2JHTLGMXGEDN73U55XTPLPFT7V4S", + "thresholds": { + "low_threshold": 0, + "med_threshold": 2, + "high_threshold": 2 + }, + "signers": [ + { + "key": "GEH2KVJ72CEUVW75EFR6EDT4SYWB5WKH7DNSIPZZ7FK4ZRI3R2WYOJFL", + "weight": 1, + "type": "ed25519_public_key" + }, + { + "key": "GJOOA7LQSAJ2XUID5ZZZZG6ZDMEN4KHVDGAJGXBENYJQWX6HH7566TFJ", + "weight": 1, + "type": "ed25519_public_key" + }, + { + "key": "GGVQ6KBNXJBTFQXKWOVOMPZOM7WBBR6QMW4WXFOGO6MVN6A6WFHYM6L3", + "weight": 1, + "type": "ed25519_public_key" + }, + { + "key": "GUJZDEGXDNCF32EPF3DHODZDOCIS2JHTLGMXGEDN73U55XTPLPFT7V4S", + "weight": 0, + "type": "ed25519_public_key" + } + ] +} \ No newline at end of file diff --git a/scripts/testdata/horizon/multisig-preauth.json b/scripts/testdata/horizon/multisig-preauth.json new file mode 100644 index 0000000..51ab4e1 --- /dev/null +++ b/scripts/testdata/horizon/multisig-preauth.json @@ -0,0 +1,30 @@ +{ + "id": "GUJZDEGXDNCF32EPF3DHODZDOCIS2JHTLGMXGEDN73U55XTPLPFT7V4S", + "thresholds": { + "low_threshold": 0, + "med_threshold": 2, + "high_threshold": 2 + }, + "signers": [ + { + "key": "GEH2KVJ72CEUVW75EFR6EDT4SYWB5WKH7DNSIPZZ7FK4ZRI3R2WYOJFL", + "weight": 1, + "type": "ed25519_public_key" + }, + { + "key": "GJOOA7LQSAJ2XUID5ZZZZG6ZDMEN4KHVDGAJGXBENYJQWX6HH7566TFJ", + "weight": 1, + "type": "ed25519_public_key" + }, + { + "key": "TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "weight": 1, + "type": "preauth_tx" + }, + { + "key": "GUJZDEGXDNCF32EPF3DHODZDOCIS2JHTLGMXGEDN73U55XTPLPFT7V4S", + "weight": 0, + "type": "ed25519_public_key" + } + ] +} \ No newline at end of file diff --git a/scripts/testdata/mock-stellar b/scripts/testdata/mock-stellar index 299fb54..4fa75e9 100644 --- a/scripts/testdata/mock-stellar +++ b/scripts/testdata/mock-stellar @@ -2,9 +2,28 @@ set -euo pipefail # Test-only CLI mock for test-mainnet-upgrade-guards.sh. It never uses a network. +# Fake wasm files are text with "kind=" and "version=" lines; contract state +# comes from FAKE_* variables set by the test. + +arg_after() { + local flag="$1" previous="" arg + shift + for arg in "$@"; do + if [ "$previous" = "$flag" ]; then + printf '%s\n' "$arg" + return 0 + fi + previous="$arg" + done + return 1 +} + +wasm_field() { + sed -n "s/^$2=//p" "$1" | head -1 +} if [ "${1:-}" = "--version" ]; then - printf 'stellar 27.0.0 (test)\n' + printf 'stellar %s (test)\n' "${FAKE_CLI_VERSION:-28.1.0}" exit 0 fi @@ -17,17 +36,34 @@ EOF exit 0 fi -if [ "${1:-}" = "contract" ] && [ "${2:-}" = "info" ] && [ "${3:-}" = "hash" ]; then - contract_id="" - previous="" - for arg in "$@"; do - if [ "$previous" = "--contract-id" ] || [ "$previous" = "--id" ]; then - contract_id="$arg" - break - fi - previous="$arg" - done +if [ "${1:-}" = "contract" ] && [ "${2:-}" = "info" ]; then + if wasm="$(arg_after --wasm "$@")"; then + kind="$(wasm_field "$wasm" kind)" + version="$(wasm_field "$wasm" version)" + case "${3:-}" in + meta) + if [ -n "$version" ]; then + printf '[{"sc_meta_v0":{"key":"version","val":"%s"}}]\n' "$version" + else + printf '[]\n' + fi + ;; + interface) + case "$kind" in + events) printf '[{"function_v0":{"name":"create_event"}},{"function_v0":{"name":"migrate_events"}}]\n' ;; + profile) printf '[{"function_v0":{"name":"register_earnings"}}]\n' ;; + *) printf '[]\n' ;; + esac + ;; + *) + printf 'unsupported fake info command: %s\n' "$*" >&2 + exit 1 + ;; + esac + exit 0 + fi + contract_id="$(arg_after --contract-id "$@" || arg_after --id "$@" || true)" case "$contract_id" in EVENTS) printf '%s\n' "${FAKE_EVENTS_LIVE_HASH:?missing FAKE_EVENTS_LIVE_HASH}" ;; PROFILE) printf '%s\n' "${FAKE_PROFILE_LIVE_HASH:?missing FAKE_PROFILE_LIVE_HASH}" ;; @@ -47,11 +83,8 @@ if [ "${1:-}" = "tx" ] && [ "${2:-}" = "simulate" ]; then fi if [ "${1:-}" = "contract" ] && [ "${2:-}" = "invoke" ]; then - contract_id="" function_name="" after_separator=false - previous="" - for arg in "$@"; do if [ "$arg" = "--build-only" ]; then printf 'BUILT-XDR\n' @@ -65,44 +98,53 @@ if [ "${1:-}" = "contract" ] && [ "${2:-}" = "invoke" ]; then after_separator=true fi done - - for arg in "$@"; do - if [ "$previous" = "--id" ]; then - contract_id="$arg" - break - fi - previous="$arg" - done + contract_id="$(arg_after --id "$@" || true)" if [ "$contract_id" = "EVENTS" ]; then - version="${FAKE_EVENTS_VERSION:-1.1.0}" + version="${FAKE_EVENTS_VERSION:-1.7.0}" paused="${FAKE_EVENTS_PAUSED:-false}" pending="${FAKE_EVENTS_PENDING:-null}" migrated="${FAKE_EVENTS_MIGRATED:-null}" + applied_code=69 elif [ "$contract_id" = "PROFILE" ]; then - version="${FAKE_PROFILE_VERSION:-1.1.0}" + version="${FAKE_PROFILE_VERSION:-1.2.0}" paused="${FAKE_PROFILE_PAUSED:-false}" pending="${FAKE_PROFILE_PENDING:-null}" migrated="${FAKE_PROFILE_MIGRATED:-null}" - events_contract="${FAKE_PROFILE_EVENTS_CONTRACT:-EVENTS}" - pending_events_contract="${FAKE_PROFILE_EVENTS_PENDING:-null}" + applied_code=43 else printf 'unknown fake contract id: %s\n' "$contract_id" >&2 exit 1 fi + remaining="${FAKE_EVENTS_MIGRATION_REMAINING:-0}" case "$function_name" in version) printf '"%s"\n' "$version" ;; - get_admin) printf '"GADMIN"\n' ;; + get_admin) printf '"%s"\n' "${FAKE_ADMIN:-GADMIN}" ;; is_paused) printf '%s\n' "$paused" ;; get_pending_upgrade) printf '%s\n' "$pending" ;; get_migrated_to_version) printf '%s\n' "$migrated" ;; - get_events_contract) printf '"%s"\n' "$events_contract" ;; - get_pending_events_contract) printf '%s\n' "$pending_events_contract" ;; - id_base) printf '271539957145796608\n' ;; - get_event) - printf 'HostError: Error(Contract, #30)\n' >&2 - exit 1 + get_events_contract) printf '"%s"\n' "${FAKE_PROFILE_EVENTS_CONTRACT:-EVENTS}" ;; + get_pending_events_contract) printf '%s\n' "${FAKE_PROFILE_EVENTS_PENDING:-null}" ;; + get_release_validator) printf '%s\n' "${FAKE_EVENTS_VALIDATOR:-null}" ;; + migrate) + if [ "$contract_id" = "EVENTS" ] && [ "$remaining" -gt 0 ]; then + printf 'error: transaction simulation failed: HostError: Error(Contract, #97)\n' >&2 + exit 1 + fi + if [ "$migrated" = "\"$version\"" ]; then + printf 'error: transaction simulation failed: HostError: Error(Contract, #%s)\n' "$applied_code" >&2 + exit 1 + fi + ;; + migrate_events) + max="$(arg_after --max_events "$@")" + if [ "$max" -eq 0 ] || [ "$max" -gt 8 ]; then + max=8 + fi + left=$((remaining - max)) + [ "$left" -gt 0 ] || left=0 + printf '%s\n' "$left" ;; *) printf 'null\n' ;; esac diff --git a/scripts/testnet/grant-scenarios.ts b/scripts/testnet/grant-scenarios.ts new file mode 100644 index 0000000..c1afc76 --- /dev/null +++ b/scripts/testnet/grant-scenarios.ts @@ -0,0 +1,824 @@ +/** + * Runs the grant lifecycle against the deployed events contract on testnet, + * with fresh accounts and the BGT test asset, and checks every balance the + * contract moves. Writes a report with each transaction. + * + * cd scripts/testnet && npm install && npm run grants + * + * Needs the stellar CLI identities `boundless-grant-test-issuer` (issues BGT, + * revocable; funds the run) and the events contract to have BGT whitelisted + * with the fee account trusting it. EVENTS_CONTRACT overrides the contract id. + */ +import { execFileSync } from 'node:child_process'; +import { randomBytes } from 'node:crypto'; +import { mkdirSync, writeFileSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { + Account, + Address, + Asset, + BASE_FEE, + Contract, + Horizon, + Keypair, + Networks, + Operation, + TransactionBuilder, + authorizeEntry, + nativeToScVal, + rpc, + scValToNative, + xdr, +} from '@stellar/stellar-sdk'; + +const RPC_URL = process.env.STELLAR_RPC_URL ?? 'https://soroban-testnet.stellar.org'; +const HORIZON_URL = 'https://horizon-testnet.stellar.org'; +const PASSPHRASE = Networks.TESTNET; +const EVENTS = + process.env.EVENTS_CONTRACT ?? 'CBEODVJGUYCIYTVXD7KI5UG3BJ2UE4T7AGI2TGY3T4Q5GQRFGTRYVTZP'; +const ISSUER_IDENTITY = process.env.ISSUER_IDENTITY ?? 'boundless-grant-test-issuer'; +const VALIDATOR_IDENTITY = + process.env.VALIDATOR_IDENTITY ?? 'boundless-release-validator-testnet'; +const CAPACITY = Number(process.env.CAPACITY_RECIPIENTS ?? 40); +const ONLY = process.env.ONLY?.split(',').map((s: string) => s.trim()); +const wanted = (name: string) => !ONLY || ONLY.some((o: string) => name.startsWith(o)); + +const server = new rpc.Server(RPC_URL); +const horizon = new Horizon.Server(HORIZON_URL); +const U = 10_000_000n; +const bgt = (units: number | bigint) => BigInt(units) * U; + +// ---------------------------------------------------------------- reporting + +type Check = { scenario: string; label: string; ok: boolean; detail?: string }; +type TxLog = { scenario: string; step: string; hash: string; fee: string; ok: boolean }; +const checks: Check[] = []; +const txs: TxLog[] = []; +let scenario = 'setup'; + +function check(ok: boolean, label: string, detail?: string) { + checks.push({ scenario, label, ok, detail }); + console.log(`${ok ? 'PASS' : 'FAIL'} [${scenario}] ${label}${detail ? ` (${detail})` : ''}`); +} + +function eq(actual: unknown, expected: unknown, label: string) { + const a = typeof actual === 'bigint' ? actual.toString() : JSON.stringify(actual); + const e = typeof expected === 'bigint' ? expected.toString() : JSON.stringify(expected); + check(a === e, label, a === e ? undefined : `got ${a}, expected ${e}`); +} + +// ---------------------------------------------------------------- encoding + +const sv = { + u32: (n: number) => nativeToScVal(n, { type: 'u32' }), + u64: (n: bigint) => nativeToScVal(n, { type: 'u64' }), + i128: (n: bigint) => nativeToScVal(n, { type: 'i128' }), + addr: (a: string) => new Address(a).toScVal(), + op: () => xdr.ScVal.scvBytes(randomBytes(32)), + sym: (s: string) => xdr.ScVal.scvSymbol(s), + struct(fields: Record) { + return xdr.ScVal.scvMap( + Object.keys(fields) + .sort() + .map((k) => new xdr.ScMapEntry({ key: sv.sym(k), val: fields[k] })), + ); + }, +}; + +type Award = { to: string; position: number; amount: bigint; bump?: number }; + +function winners(awards: Award[]) { + return xdr.ScVal.scvVec( + awards.map((a) => + sv.struct({ + amount: sv.i128(a.amount), + position: sv.u32(a.position), + recipient: sv.addr(a.to), + reputation_bump: sv.u32(a.bump ?? 10), + }), + ), + ); +} + +// ---------------------------------------------------------------- chain + +const stroopsText = (n: bigint) => `${n / U}.${(n % U).toString().padStart(7, '0')}`; + +async function classic(source: Keypair, ops: xdr.Operation[], signers: Keypair[], step: string) { + const account = await horizon.loadAccount(source.publicKey()); + const tx = new TransactionBuilder(account, { + fee: (Number(BASE_FEE) * 10).toString(), + networkPassphrase: PASSPHRASE, + }); + ops.forEach((op) => tx.addOperation(op)); + const built = tx.setTimeout(120).build(); + built.sign(source, ...signers); + const res = await horizon.submitTransaction(built); + txs.push({ scenario, step, hash: res.hash, fee: built.fee, ok: true }); +} + +type Outcome = + | { ok: true; value: unknown; hash: string; fee: string } + | { ok: false; code?: number; detail: string; hash?: string }; + +/** The address an auth entry needs a signature from, or null for source credentials. */ +function signerOf(entry: xdr.SorobanAuthorizationEntry): string | null { + const c = entry.credentials; + if (c.type === 'sorobanCredentialsAddress') { + return Address.fromScAddress(c.address.address).toString(); + } + if (c.type === 'sorobanCredentialsAddressV2') { + return Address.fromScAddress(c.addressV2.address).toString(); + } + return null; +} + +const contractCode = (text: string) => { + const m = /Error\(Contract, #(\d+)\)/.exec(text); + return m ? Number(m[1]) : undefined; +}; + +type InvokeOpts = { signers?: Keypair[]; simulate?: boolean; step?: string }; + +// The RPC sometimes serves an account a ledger behind, so a transaction built +// right after the previous one confirms can carry a stale sequence. Those +// rejections never reach the contract; rebuild and resend. +async function invoke( + contractId: string, + source: Keypair, + method: string, + args: xdr.ScVal[], + opts: InvokeOpts = {}, +): Promise { + for (let attempt = 1; ; attempt++) { + const outcome = await invokeOnce(contractId, source, method, args, opts); + const transient = + !outcome.ok && /send (TRY_AGAIN_LATER|ERROR: txBadSeq)/.test(outcome.detail); + if (!transient || attempt === 4) return outcome; + console.log(`retry ${method} after ${outcome.detail}`); + await new Promise((r) => setTimeout(r, 3000)); + } +} + +async function invokeOnce( + contractId: string, + source: Keypair, + method: string, + args: xdr.ScVal[], + opts: InvokeOpts, +): Promise { + const loaded = await server.getAccount(source.publicKey()); + // build() advances the account's sequence, and a call that signs another + // party's auth entry builds twice, so each build starts from the same one. + const build = (op: xdr.Operation) => + new TransactionBuilder(new Account(loaded.accountId(), loaded.sequenceNumber()), { + fee: BASE_FEE, + networkPassphrase: PASSPHRASE, + }) + .addOperation(op) + .setTimeout(300) + .build(); + + let tx = build(new Contract(contractId).call(method, ...args)); + let sim = await server.simulateTransaction(tx); + if (rpc.Api.isSimulationError(sim)) { + return { ok: false, code: contractCode(sim.error), detail: sim.error.split('\n')[0] }; + } + if (opts.simulate) { + return { + ok: true, + value: sim.result?.retval ? scValToNative(sim.result.retval) : undefined, + hash: '', + fee: sim.minResourceFee, + }; + } + + // Address-credential entries need a signature from that address; sign the + // ones we hold and leave the rest unsigned, so a missing signer fails on chain. + const auth = sim.result?.auth ?? []; + const needsSigning = auth.some((e) => signerOf(e) !== null); + if (needsSigning) { + const { sequence } = await server.getLatestLedger(); + const signed = await Promise.all( + auth.map(async (entry) => { + const who = signerOf(entry); + if (!who) return entry; + const signer = (opts.signers ?? []).find((k) => k.publicKey() === who); + return signer ? authorizeEntry(entry, signer, sequence + 100, PASSPHRASE) : entry; + }), + ); + const func = (tx.operations[0] as Operation.InvokeHostFunction).func; + tx = build(Operation.invokeHostFunction({ func, auth: signed })); + sim = await server.simulateTransaction(tx); + if (rpc.Api.isSimulationError(sim)) { + return { ok: false, code: contractCode(sim.error), detail: sim.error.split('\n')[0] }; + } + } + + const assembled = rpc.assembleTransaction(tx, sim).build(); + assembled.sign(source); + const sent = await server.sendTransaction(assembled); + if (sent.status === 'ERROR' || sent.status === 'TRY_AGAIN_LATER') { + const code = sent.errorResult?.result.type; + const detail = `send ${sent.status}${code ? `: ${code}` : ''}`; + txs.push({ scenario, step: opts.step ?? method, hash: sent.hash, fee: assembled.fee, ok: false }); + return { ok: false, detail, hash: sent.hash }; + } + for (let i = 0; i < 90; i++) { + const got = await server.getTransaction(sent.hash); + if (got.status === rpc.Api.GetTransactionStatus.NOT_FOUND) { + await new Promise((r) => setTimeout(r, 1000)); + continue; + } + const ok = got.status === rpc.Api.GetTransactionStatus.SUCCESS; + txs.push({ scenario, step: opts.step ?? method, hash: sent.hash, fee: assembled.fee, ok }); + if (!ok) return { ok: false, detail: 'transaction failed on chain', hash: sent.hash }; + return { + ok: true, + value: got.returnValue ? scValToNative(got.returnValue) : undefined, + hash: sent.hash, + fee: assembled.fee, + }; + } + return { ok: false, detail: 'not confirmed in 90s', hash: sent.hash }; +} + +const events = (source: Keypair, method: string, args: xdr.ScVal[], opts?: InvokeOpts) => + invoke(EVENTS, source, method, args, opts); + +async function must(outcome: Promise, label: string): Promise { + const o = await outcome; + check(o.ok, label, o.ok ? undefined : `${o.detail}${o.hash ? ` tx ${o.hash}` : ''}`); + if (!o.ok) throw new Error(`${scenario}: ${label} failed`); + return o.value; +} + +async function refused(outcome: Promise, code: number | 'auth' | 'any', label: string) { + const o = await outcome; + if (o.ok) return check(false, label, 'call succeeded'); + if (code === 'any') return check(true, label, o.detail); + if (code === 'auth') return check(o.code === undefined, label, o.detail); + check(o.code === code, label, o.code === code ? undefined : `got ${o.code ?? o.detail}`); +} + +// ---------------------------------------------------------------- setup + +const secretOf = (identity: string) => + execFileSync('stellar', ['keys', 'show', identity], { + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'ignore'], + }).trim(); + +const issuer = Keypair.fromSecret(secretOf(ISSUER_IDENTITY)); +const asset = new Asset('BGT', issuer.publicKey()); +const TOKEN = asset.contractId(PASSPHRASE); +let feeAccount = ''; +let feeBps = 0n; + +async function balance(who: string): Promise { + const o = await invoke(TOKEN, issuer, 'balance', [sv.addr(who)], { simulate: true }); + if (!o.ok) throw new Error(`balance of ${who}: ${o.detail}`); + return BigInt(o.value as bigint); +} + +async function provision(count: number, mint: bigint, xlm = '5'): Promise { + const out: Keypair[] = []; + for (let start = 0; start < count; start += 15) { + const batch = Array.from({ length: Math.min(15, count - start) }, () => Keypair.random()); + const ops: xdr.Operation[] = []; + for (const k of batch) { + ops.push(Operation.createAccount({ destination: k.publicKey(), startingBalance: xlm })); + ops.push(Operation.changeTrust({ asset, source: k.publicKey() })); + if (mint > 0n) { + ops.push( + Operation.payment({ destination: k.publicKey(), asset, amount: stroopsText(mint) }), + ); + } + } + await classic(issuer, ops, batch, `provision ${batch.length} accounts`); + out.push(...batch); + } + return out; +} + +async function setFrozen(who: Keypair, frozen: boolean) { + await classic( + issuer, + [Operation.setTrustLineFlags({ trustor: who.publicKey(), asset, flags: { authorized: !frozen } })], + [], + frozen ? 'freeze' : 'unfreeze', + ); +} + +const fee = (amount: bigint) => (amount * feeBps) / 10_000n; +let feesExpected = 0n; + +type GrantSpec = { + budget: bigint; + milestones: number; + floors: [number, bigint][]; + manager?: string; + pillar?: 'Grant' | 'Crowdfunding'; +}; + +async function createGrant(owner: Keypair, g: GrantSpec): Promise { + const floors = xdr.ScVal.scvMap( + [...g.floors] + .sort((a, b) => a[0] - b[0]) + .map(([p, v]) => new xdr.ScMapEntry({ key: sv.u32(p), val: sv.i128(v) })), + ); + const params = sv.struct({ + content_uri: xdr.ScVal.scvString('https://api.boundless.fi/grants/testnet-run/content'), + deadline: sv.u64(BigInt(Math.floor(Date.now() / 1000) + 30 * 86_400)), + fee_bps_override: xdr.ScVal.scvVoid(), + manager: g.manager ? sv.addr(g.manager) : xdr.ScVal.scvVoid(), + owner: sv.addr(owner.publicKey()), + pillar: xdr.ScVal.scvVec([sv.sym(g.pillar ?? 'Grant')]), + prize_floors: floors, + release_kind: xdr.ScVal.scvVec([sv.sym('Multi'), sv.u32(g.milestones)]), + title: xdr.ScVal.scvString(`Testnet grant run: ${scenario}`), + token: sv.addr(TOKEN), + total_budget: sv.i128(g.budget), + }); + const before = await balance(owner.publicKey()); + const id = BigInt( + (await must(events(owner, 'create_event', [params, sv.op()]), 'publish the grant')) as bigint, + ); + // Crowdfunding starts at zero escrow and takes its fee at release. + const paid = g.pillar === 'Crowdfunding' ? 0n : g.budget + fee(g.budget); + eq(before - (await balance(owner.publicKey())), paid, 'owner paid budget plus fee'); + if (g.pillar !== 'Crowdfunding') feesExpected += fee(g.budget); + return id; +} + +async function event(id: bigint): Promise> { + const o = await events(issuer, 'get_event', [sv.u64(id)], { simulate: true }); + if (!o.ok) throw new Error(`get_event ${id}: ${o.detail}`); + return o.value as Record; +} + +const status = async (id: bigint) => ((await event(id)).status as string[])[0]; + +async function release(owner: Keypair, id: bigint, to: Keypair | string, m: number, expected: bigint) { + const who = typeof to === 'string' ? to : to.publicKey(); + const before = await balance(who); + await must( + events(owner, 'claim_milestone', [sv.u64(id), sv.addr(who), sv.u32(m), sv.u32(10), sv.op()]), + `release milestone ${m} to ${who.slice(0, 6)}`, + ); + eq((await balance(who)) - before, expected, `milestone ${m} paid exactly`); +} + +async function forfeit(owner: Keypair, id: bigint, to: Keypair, m: number) { + const before = await balance(to.publicKey()); + await must( + events(owner, 'forfeit_milestone', [sv.u64(id), sv.addr(to.publicKey()), sv.u32(m), sv.op()]), + `forfeit milestone ${m}`, + ); + eq(await balance(to.publicKey()), before, 'a forfeit pays nothing'); +} + +async function contribute(id: bigint, from: Keypair, amount: bigint) { + const before = await balance(from.publicKey()); + await must( + events(from, 'add_funds', [sv.u64(id), sv.addr(from.publicKey()), sv.i128(amount), sv.op()]), + `partner adds ${stroopsText(amount)}`, + ); + eq(before - (await balance(from.publicKey())), amount + fee(amount), 'partner paid amount plus fee'); + feesExpected += fee(amount); +} + +async function cancel(manager: Keypair, id: bigint) { + await must(events(manager, 'start_cancel', [sv.u64(id), sv.op()]), 'start cancel'); + if ((await status(id)) === 'Cancelling') { + for (;;) { + const left = await must( + events(manager, 'process_cancel_batch', [sv.u64(id), sv.u32(15), sv.op()]), + 'refund batch', + ); + if (Number(left) === 0) break; + } + await must(events(manager, 'finalize_cancel', [sv.u64(id), sv.op()]), 'finalize cancel'); + } + eq(await status(id), 'Cancelled', 'grant cancelled'); +} + +// ---------------------------------------------------------------- scenarios + +async function main() { + feeAccount = (await events(issuer, 'get_fee_account', [], { simulate: true }) as { value: string }).value; + feeBps = BigInt((await events(issuer, 'get_fee_bps', [], { simulate: true }) as { value: number }).value); + const version = (await events(issuer, 'version', [], { simulate: true }) as { value: string }).value; + const listed = await events(issuer, 'is_supported_token', [sv.addr(TOKEN)], { simulate: true }); + check(listed.ok && listed.value === true, `BGT ${TOKEN} is whitelisted on ${EVENTS} (${version})`); + const feeStart = await balance(feeAccount); + + // Owners sign every publish and release, and each release pays rent on a new row. + const [owner, ownerB] = await provision(2, bgt(2_000), '200'); + const partners = await provision(4, bgt(100)); + const people = await provision(CAPACITY + 12, 0n); + const [manager, managerB, stranger] = await provision(3, 0n); + const r = (i: number) => people[i]; + + scenario = 'micro grant'; + if (wanted(scenario)) { + const id = await createGrant(owner, { + budget: bgt(30), + milestones: 1, + floors: [[1, bgt(10)], [2, bgt(10)], [3, bgt(10)]], + }); + await must( + events(owner, 'select_winners', [ + sv.u64(id), + winners([1, 2, 3].map((p) => ({ to: r(p - 1).publicKey(), position: p, amount: bgt(10) }))), + sv.op(), + ]), + 'select three recipients', + ); + for (const i of [0, 1, 2]) await release(owner, id, r(i), 0, bgt(10)); + eq(await status(id), 'Completed', 'completes when the last award is paid'); + } + + scenario = 'tiered, rounding, any order'; + if (wanted(scenario)) { + const [a, b, c] = [bgt(50) + 1n, bgt(30) + 2n, bgt(20)]; + const id = await createGrant(owner, { + budget: a + b + c, + milestones: 3, + floors: [[1, a], [2, b], [3, c]], + }); + await must( + events(owner, 'select_winners', [ + sv.u64(id), + winners([ + { to: r(3).publicKey(), position: 1, amount: a }, + { to: r(4).publicKey(), position: 2, amount: b }, + { to: r(5).publicKey(), position: 3, amount: c }, + ]), + sv.op(), + ]), + 'select three tiers', + ); + const part = (x: bigint) => x / 3n; + const last = (x: bigint) => x - 2n * part(x); + await release(owner, id, r(4), 2, part(b)); + await release(owner, id, r(3), 0, part(a)); + await release(owner, id, r(5), 1, part(c)); + await release(owner, id, r(3), 2, part(a)); + await release(owner, id, r(4), 0, part(b)); + await release(owner, id, r(5), 0, part(c)); + await release(owner, id, r(3), 1, last(a)); + await release(owner, id, r(4), 1, last(b)); + await release(owner, id, r(5), 2, last(c)); + eq(await balance(r(3).publicKey()), a, 'tier 1 received its whole award'); + eq(await balance(r(4).publicKey()), b, 'tier 2 received its whole award'); + eq(await status(id), 'Completed', 'completed'); + } + + scenario = 'forfeit and the cancel guard'; + if (wanted(scenario)) { + const id = await createGrant(owner, { budget: bgt(30), milestones: 3, floors: [[1, bgt(30)]] }); + await must( + events(owner, 'select_winners', [ + sv.u64(id), + winners([{ to: r(6).publicKey(), position: 1, amount: bgt(30) }]), + sv.op(), + ]), + 'select one recipient', + ); + await release(owner, id, r(6), 0, bgt(10)); + await forfeit(owner, id, r(6), 1); + await refused( + events(owner, 'start_cancel', [sv.u64(id), sv.op()], { simulate: true }), + 96, + 'cancel refused while an award is owed (AwardsOutstanding)', + ); + await release(owner, id, r(6), 2, bgt(10)); + const before = await balance(owner.publicKey()); + await cancel(owner, id); + eq((await balance(owner.publicKey())) - before, bgt(10), 'forfeited share returned to the owner'); + } + + scenario = 'partners, pro rata'; + if (wanted(scenario)) { + const [p1, p2] = partners; + const id = await createGrant(owner, { budget: bgt(50), milestones: 2, floors: [[1, bgt(10)]] }); + await contribute(id, p1, bgt(20)); + await must( + events(owner, 'select_winners', [ + sv.u64(id), + winners([{ to: r(7).publicKey(), position: 1, amount: bgt(60) }]), + sv.op(), + ]), + 'award more than the budget, funded by the partner', + ); + await release(owner, id, r(7), 0, bgt(30)); + await contribute(id, p2, bgt(15)); + await release(owner, id, r(7), 1, bgt(30)); + eq(await status(id), 'Active', 'the late top-up keeps the grant open'); + const [b1, b2, bo] = [p1, p2, owner].map((k) => k.publicKey()); + const before = await Promise.all([b1, b2, bo].map(balance)); + await must(events(owner, 'start_cancel', [sv.u64(id), sv.op()]), 'start cancel'); + await refused( + events(owner, 'process_cancel_batch', [sv.u64(id), sv.u32(0), sv.op()], { simulate: true }), + 94, + 'an empty refund batch is refused (InvalidBatchSize)', + ); + await must(events(stranger, 'process_cancel_batch', [sv.u64(id), sv.u32(15), sv.op()]), 'anyone can crank'); + await must(events(stranger, 'finalize_cancel', [sv.u64(id), sv.op()]), 'anyone can finalize'); + const remaining = bgt(25); + const total = bgt(35); + eq((await balance(b1)) - before[0], (bgt(20) * remaining) / total, 'partner 1 refunded pro rata'); + eq((await balance(b2)) - before[1], (bgt(15) * remaining) / total, 'partner 2 refunded pro rata'); + eq((await balance(bo)) - before[2], 0n, 'owner gets nothing when partners are short'); + } + + scenario = 'frozen partner'; + if (wanted(scenario)) { + const [, , p3, p4] = partners; + const id = await createGrant(owner, { budget: bgt(20), milestones: 1, floors: [[1, bgt(20)]] }); + await contribute(id, p3, bgt(10)); + await contribute(id, p4, bgt(10)); + await setFrozen(p4, true); + const before = await Promise.all([p3, p4, owner].map((k) => balance(k.publicKey()))); + await cancel(owner, id); + eq((await balance(p3.publicKey())) - before[0], bgt(10), 'other partners are refunded'); + eq((await balance(owner.publicKey())) - before[2], bgt(20), 'owner residual paid'); + const held = await events(issuer, 'get_unclaimed_refund', [sv.u64(id), sv.addr(p4.publicKey())], { + simulate: true, + }); + eq(held.ok ? BigInt(held.value as bigint) : -1n, bgt(10), 'frozen partner refund held'); + await refused( + events(p4, 'claim_refund', [sv.u64(id), sv.addr(p4.publicKey()), sv.op()]), + 'any', + 'a frozen account cannot take its refund yet', + ); + await setFrozen(p4, false); + await must( + events(p4, 'claim_refund', [sv.u64(id), sv.addr(p4.publicKey()), sv.op()]), + 'refund claimed after unfreezing', + ); + eq((await balance(p4.publicKey())) - before[1], bgt(10), 'frozen partner made whole'); + await refused( + events(p4, 'claim_refund', [sv.u64(id), sv.addr(p4.publicKey()), sv.op()], { simulate: true }), + 95, + 'a second claim is refused (NoRefundOwed)', + ); + } + + scenario = 'refusals'; + if (wanted(scenario)) { + const id = await createGrant(owner, { budget: bgt(100), milestones: 4, floors: [[1, 1n]] }); + const sel = (awards: Award[]) => + events(owner, 'select_winners', [sv.u64(id), winners(awards), sv.op()], { simulate: true }); + const x = r(8).publicKey(); + await refused( + sel([ + { to: x, position: 1, amount: bgt(10) }, + { to: x, position: 2, amount: bgt(10) }, + ]), + 92, + 'one recipient, two awards (DuplicateRecipient)', + ); + await refused(sel([{ to: x, position: 1, amount: 3n }]), 34, 'award smaller than its milestones'); + await refused( + sel([{ to: x, position: 1, amount: bgt(10), bump: 101 }]), + 93, + 'reputation bump over the cap', + ); + await refused( + sel(people.slice(0, CAPACITY + 1).map((k, i) => ({ to: k.publicKey(), position: i + 1, amount: 4n }))), + 51, + `more than ${CAPACITY} recipients`, + ); + await refused(sel([{ to: x, position: 1, amount: bgt(101) }]), 56, 'awards beyond the escrow'); + await must( + events(owner, 'select_winners', [sv.u64(id), winners([{ to: x, position: 1, amount: bgt(100) }]), sv.op()]), + 'select', + ); + await refused(sel([{ to: r(9).publicKey(), position: 2, amount: 4n }]), 90, 'a second selection'); + const claim = (to: string, m: number, op = sv.op(), simulate = true) => + events(owner, 'claim_milestone', [sv.u64(id), sv.addr(to), sv.u32(m), sv.u32(10), op], { simulate }); + await refused(claim(x, 4), 55, 'milestone out of range'); + await refused(claim(r(9).publicKey(), 0), 50, 'someone never selected'); + const op = sv.op(); + await release(owner, id, r(8), 0, bgt(25)); + await refused(claim(x, 0), 54, 'the same milestone twice'); + await must(claim(x, 1, op, false), 'release with an op id'); + await refused(claim(x, 2, op), 60, 'the op id replayed'); + await refused( + events(owner, 'claim_milestone', [sv.u64(id), sv.addr(x), sv.u32(2), sv.u32(101), sv.op()], { simulate: true }), + 93, + 'reputation bump over the cap on release', + ); + await refused( + events(owner, 'claim_prize', [sv.u64(id), sv.u32(1), sv.op()], { simulate: true }), + 33, + 'claim_prize is not a grant path', + ); + await refused( + events(owner, 'start_cancel', [sv.u64(id), sv.op()], { simulate: true }), + 96, + 'cancel refused while owed', + ); + await forfeit(owner, id, r(8), 2); + await forfeit(owner, id, r(8), 3); + await cancel(owner, id); + } + + scenario = 'signatures'; + if (wanted(scenario)) { + const id = await createGrant(owner, { budget: bgt(10), milestones: 1, floors: [[1, bgt(10)]] }); + const x = r(10); + await refused( + events(stranger, 'select_winners', [ + sv.u64(id), + winners([{ to: stranger.publicKey(), position: 1, amount: bgt(10) }]), + sv.op(), + ]), + 'auth', + 'a stranger cannot select', + ); + await must( + events(owner, 'select_winners', [sv.u64(id), winners([{ to: x.publicKey(), position: 1, amount: bgt(10) }]), sv.op()]), + 'owner selects', + ); + await refused( + events(x, 'claim_milestone', [sv.u64(id), sv.addr(x.publicKey()), sv.u32(0), sv.u32(10), sv.op()]), + 'auth', + 'a recipient cannot release their own milestone', + ); + eq(await balance(x.publicKey()), 0n, 'nothing moved'); + await release(owner, id, x, 0, bgt(10)); + } + + scenario = 'manager handover'; + if (wanted(scenario)) { + const id = await createGrant(ownerB, { + budget: bgt(20), + milestones: 2, + floors: [[1, bgt(20)]], + manager: manager.publicKey(), + }); + await must(events(manager, 'accept_manager', [sv.u64(id)]), 'manager accepts'); + const m = await events(issuer, 'get_manager', [sv.u64(id)], { simulate: true }); + eq(m.ok ? m.value : '', manager.publicKey(), 'manager recorded'); + const awards = winners([{ to: r(11).publicKey(), position: 1, amount: bgt(20) }]); + await refused(events(ownerB, 'select_winners', [sv.u64(id), awards, sv.op()]), 'auth', 'the owner no longer selects'); + await must(events(manager, 'select_winners', [sv.u64(id), awards, sv.op()]), 'the manager selects'); + await refused( + events(ownerB, 'reclaim_management', [sv.u64(id)], { simulate: true }), + 90, + 'no reclaim after selection', + ); + await refused( + events(manager, 'claim_milestone', [sv.u64(id), sv.addr(r(11).publicKey()), sv.u32(0), sv.u32(10), sv.op()]), + 'auth', + 'the manager cannot release', + ); + await release(ownerB, id, r(11), 0, bgt(10)); + await release(ownerB, id, r(11), 1, bgt(10)); + + const other = await createGrant(ownerB, { + budget: bgt(20), + milestones: 1, + floors: [[1, bgt(20)]], + manager: managerB.publicKey(), + }); + await must(events(managerB, 'accept_manager', [sv.u64(other)]), 'second manager accepts'); + await must(events(ownerB, 'reclaim_management', [sv.u64(other)]), 'owner takes management back'); + const back = await events(issuer, 'get_manager', [sv.u64(other)], { simulate: true }); + eq(back.ok ? back.value : '', ownerB.publicKey(), 'the owner manages again'); + await must( + events(ownerB, 'select_winners', [ + sv.u64(other), + winners([{ to: r(11).publicKey(), position: 1, amount: bgt(20) }]), + sv.op(), + ]), + 'owner selects after reclaiming', + ); + await release(ownerB, other, r(11), 0, bgt(20)); + } + + scenario = `${CAPACITY} recipients`; + if (wanted(scenario)) { + const award = bgt(2); + const id = await createGrant(owner, { + budget: award * BigInt(CAPACITY), + milestones: 2, + floors: [[1, award]], + }); + const crowd = people.slice(12, 12 + CAPACITY); + await must( + events(owner, 'select_winners', [ + sv.u64(id), + winners(crowd.map((k, i) => ({ to: k.publicKey(), position: i + 1, amount: award }))), + sv.op(), + ]), + `select ${CAPACITY} recipients in one transaction`, + ); + for (const m of [0, 1]) { + for (const k of crowd) await release(owner, id, k, m, bgt(1)); + } + eq(await status(id), 'Completed', 'completed'); + const page = await events(issuer, 'get_winners_page', [sv.u64(id), sv.u32(0), sv.u32(90)], { simulate: true }); + eq(page.ok ? (page.value as unknown[]).length : -1, 90, 'a full page of winners reads in one call'); + const rest = await events(issuer, 'get_winners_page', [sv.u64(id), sv.u32(90), sv.u32(90)], { simulate: true }); + eq(rest.ok ? (rest.value as unknown[]).length : -1, CAPACITY * 3 - 90, 'the rest on the next page'); + } + + scenario = 'crowdfunding release validator'; + if (wanted(scenario)) { + const validator = Keypair.fromSecret(secretOf(VALIDATOR_IDENTITY)); + const appointed = await events(issuer, 'get_release_validator', [], { simulate: true }); + eq(appointed.ok ? appointed.value : null, validator.publicKey(), 'the validator is appointed on chain'); + + const [creator] = await provision(1, 0n, '20'); + const [backer] = partners; + const id = await createGrant(creator, { + budget: bgt(100), + milestones: 2, + floors: [[1, bgt(100)]], + pillar: 'Crowdfunding', + }); + const backerBefore = await balance(backer.publicKey()); + await must( + events(backer, 'add_funds', [sv.u64(id), sv.addr(backer.publicKey()), sv.i128(bgt(60)), sv.op()]), + 'a backer pledges 60', + ); + eq(backerBefore - (await balance(backer.publicKey())), bgt(60), 'backers pay no fee'); + + const release = (source: Keypair, signers: Keypair[], m: number) => + events( + source, + 'claim_milestone', + [sv.u64(id), sv.addr(creator.publicKey()), sv.u32(m), sv.u32(10), sv.op()], + { signers }, + ); + await refused(release(creator, [], 0), 'auth', 'the creator alone cannot release'); + + // The backend's shape: the validator is the source and signs the envelope, + // the creator's auth entry is signed with their own key. + for (const m of [0, 1]) { + const creatorBefore = await balance(creator.publicKey()); + const feeBefore = await balance(feeAccount); + await must(release(validator, [creator], m), `release ${m} co-signed by the validator`); + const share = bgt(30); + eq((await balance(creator.publicKey())) - creatorBefore, share - fee(share), 'creator paid net of fee'); + eq((await balance(feeAccount)) - feeBefore, fee(share), 'fee withheld at release'); + feesExpected += fee(share); + } + eq(await status(id), 'Completed', 'campaign completes on its last release'); + } + + scenario = 'fees'; + eq((await balance(feeAccount)) - feeStart, feesExpected, 'fee account received exactly the fees charged'); +} + +// ---------------------------------------------------------------- report + +function report(error?: unknown) { + const here = dirname(fileURLToPath(import.meta.url)); + const out = join(here, '..', '..', 'docs', 'audit'); + mkdirSync(out, { recursive: true }); + const failed = checks.filter((c) => !c.ok); + const scenarios = [...new Set(checks.map((c) => c.scenario))]; + const fees = txs.filter((t) => t.ok).map((t) => Number(t.fee)); + const lines = [ + '# Testnet grant run', + '', + `Run ${new Date().toISOString()} against \`${EVENTS}\` with the BGT test asset \`${TOKEN}\`.`, + `${checks.length - failed.length} of ${checks.length} checks passed across ${txs.length} transactions` + + (error ? `; the run stopped early: ${String(error)}` : '.'), + fees.length ? `Highest fee paid by one transaction: ${Math.max(...fees)} stroops.` : '', + '', + ...scenarios.flatMap((s) => [ + `## ${s}`, + '', + ...checks + .filter((c) => c.scenario === s) + .map((c) => `- ${c.ok ? 'pass' : '**FAIL**'}: ${c.label}${c.detail ? ` (${c.detail})` : ''}`), + '', + ...txs + .filter((t) => t.scenario === s) + .map( + (t) => + ` - [${t.step}](https://stellar.expert/explorer/testnet/tx/${t.hash})${t.ok ? '' : ' (failed, as expected or not: see checks)'}`, + ), + '', + ]), + ]; + writeFileSync(join(out, 'testnet-grant-run.md'), lines.join('\n')); + console.log(`\n${checks.length - failed.length}/${checks.length} checks passed; report in docs/audit/testnet-grant-run.md`); + if (failed.length || error) process.exitCode = 1; +} + +main().then( + () => report(), + (error) => { + console.error(error); + report(error); + }, +); diff --git a/scripts/testnet/package-lock.json b/scripts/testnet/package-lock.json new file mode 100644 index 0000000..9377ca5 --- /dev/null +++ b/scripts/testnet/package-lock.json @@ -0,0 +1,997 @@ +{ + "name": "boundless-testnet-scenarios", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "boundless-testnet-scenarios", + "dependencies": { + "@stellar/stellar-sdk": "^17.2.1", + "tsx": "^4.20.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.16.0.tgz", + "integrity": "sha512-IcpW84uEn3N7ETtNZMlxKhfl6Pec8rUNGOTBtWbK1FKhJxIFAptZyVrvVRVBimAJxJCgc3PxepxkdWWG4DVzfA==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/@noble/ed25519": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-3.2.0.tgz", + "integrity": "sha512-criDgRlnUA09hchYrTy/JUWPIEap5rZxQe6wDWzRx51oWWpDRcUpuNzlgPxDJaOK6AsW9c0wKcj3rKRv6t+bPQ==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz", + "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@stellar/js-xdr": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-5.0.0.tgz", + "integrity": "sha512-HBDNKnxr+ecdaEmbZ0mcKkirOF8tXXEbWSw34P3wT40Tn3g+u+cCH17xAWZymzscq8cojHB8340pR8QNVaD32w==", + "license": "Apache-2.0", + "engines": { + "node": ">=22.0.0", + "pnpm": ">=10.0.0" + } + }, + "node_modules/@stellar/stellar-sdk": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-17.2.1.tgz", + "integrity": "sha512-kIyfnZ2zCOqV8SUJcsk9buBOvhH1wsLU7KAzqAJyY7AgmD+KdvLTMpI1gcYdhGSakuDG5s6xSO4EN9HZTxpm8g==", + "license": "Apache-2.0", + "dependencies": { + "@exodus/bytes": "^1.15.1", + "@noble/ed25519": "^3.1.0", + "@noble/hashes": "^2.2.0", + "@stellar/js-xdr": "^5.0.0", + "@types/json-schema": "^7.0.15", + "axios": "1.20.0", + "bignumber.js": "^11.1.4", + "commander": "^14.0.3", + "eventsource": "^4.1.0", + "feaxios": "^0.0.23", + "smol-toml": "^1.6.1", + "uint8array-extras": "^1.5.0" + }, + "bin": { + "stellar-contract-bindings-typescript": "bin/stellar-contract-bindings-typescript", + "stellar-js": "bin/stellar-js", + "stellar-sdk": "bin/stellar-js" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/bignumber.js": { + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-11.1.5.tgz", + "integrity": "sha512-6WmzCNtUnfKpbozq+hOgWaZMMzORmYBwF1xZScyoIX3QRYWeKTtxxwDOW5tIz7C9BdjkIYHGTcelCLkXg0mndw==", + "license": "MIT" + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/eventsource": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.1.tgz", + "integrity": "sha512-D6bTRWh6KahHTK/m4WnjPQyEinNPf9eFLEZSEoj7d6fTibspnAVYfzHvirL7u/aoX5d9YYfIkBVAhmigUELk9w==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz", + "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/feaxios": { + "version": "0.0.23", + "resolved": "https://registry.npmjs.org/feaxios/-/feaxios-0.0.23.tgz", + "integrity": "sha512-eghR0A21fvbkcQBgZuMfQhrXxJzC0GNUGC9fXhBge33D+mFDTwl0aJ35zoQQn575BhyjQitRc5N4f+L4cP708g==", + "license": "MIT", + "dependencies": { + "is-retry-allowed": "^3.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.1.tgz", + "integrity": "sha512-FNvFGzoMLWmE6Yj9spb/zjd7yiNCHiAW9/Tg9CXrQ8wuu32HtlJOwWO11OJafl5FfY3DxTdQ0vj42zU1kvv5jg==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/is-retry-allowed": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-3.0.0.tgz", + "integrity": "sha512-9xH0xvoggby+u0uGF7cZXdrutWiBiaFG8ZT4YFPXL8NzkyAwX3AKGLeFQLvzDpM430+nDFBZ1LHkie/8ocL06A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/smol-toml": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.9.0.tgz", + "integrity": "sha512-hpd+HLON7HdZXqYchMM/+LaTTbdK0AU3NngIJ4KVyWbY9bfQqdL9cD+4yf6dUoU2Ap4VsU0JkQi6FxAI1B2mXQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/tsx": { + "version": "4.23.15", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.15.tgz", + "integrity": "sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/uint8array-extras": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.6.0.tgz", + "integrity": "sha512-8iAasVS4wUx0gPLjH8Xtz2PeDzTSiy8QiLGu2DT3X5GU+egFEQhpnbtkehbAwjvDcxIERmCYcysiODFmE3Ud0Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/scripts/testnet/package.json b/scripts/testnet/package.json new file mode 100644 index 0000000..46d5724 --- /dev/null +++ b/scripts/testnet/package.json @@ -0,0 +1,12 @@ +{ + "name": "boundless-testnet-scenarios", + "private": true, + "type": "module", + "scripts": { + "grants": "tsx grant-scenarios.ts" + }, + "dependencies": { + "@stellar/stellar-sdk": "^17.2.1", + "tsx": "^4.20.0" + } +}