From 8bf3caca88df86066615d14f23aa6cc4bae65284 Mon Sep 17 00:00:00 2001 From: classikdev Date: Wed, 30 Sep 2026 07:27:54 +0000 Subject: [PATCH] feat(keeper): make the settlement guard refuse a settle the contract would reject MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The guard only compared its local view with itself, so it recorded "allowed" for a settle whose refund set it could not read, a settle of a round the contract considers voided, and a void inside the grace window — all of which the round contract reverts. The guard now reproduces the contract's winner, refund and void rules and refuses the submission with a typed reason instead of burning a fee on a reverting transaction: - expectedWinner, settleRefunds and voidRefunds read the bidder page and bid states the keeper actually needs. An incomplete page, an unreadable refund, or a winner that disagrees with the on-chain one means no submit; - a void requires status Open and the 3600s grace window past the reveal deadline, matching VOID_GRACE in contracts/round; - closeRound and voidIfStale only submit when the guard allows it, and they carry a typed guardSkip (exposed as guardSkip / guardSkipIndicator on the status API) so the refusal is visible instead of silent; - the early void gate runs the same guard rather than only checking status. Settle and void cases now live in one table, contracts/round/fixtures/settlement-cases.txt, read by both the contract test (settlement_fixture_drives_the_contract and settlement_fixture_guard_reasons_match_contract_rules) and the keeper test. Every row the contract rejects must carry a guard reason, and the rows the guard refuses although the contract would accept are asserted as such, so the two sides cannot drift apart again. Closes #385 --- contracts/round/README.md | 11 + contracts/round/fixtures/settlement-cases.txt | 57 + contracts/round/src/test.rs | 435 ++++ ...tlement_fixture_drives_the_contract.1.json | 1522 +++++++++++++ ...lement_fixture_drives_the_contract.10.json | 1033 +++++++++ ...tlement_fixture_drives_the_contract.2.json | 1522 +++++++++++++ ...tlement_fixture_drives_the_contract.3.json | 1926 +++++++++++++++++ ...tlement_fixture_drives_the_contract.4.json | 1514 +++++++++++++ ...tlement_fixture_drives_the_contract.5.json | 1522 +++++++++++++ ...tlement_fixture_drives_the_contract.6.json | 1926 +++++++++++++++++ ...tlement_fixture_drives_the_contract.7.json | 1032 +++++++++ ...tlement_fixture_drives_the_contract.8.json | 1442 ++++++++++++ ...tlement_fixture_drives_the_contract.9.json | 1030 +++++++++ services/keeper/README.md | 4 + services/keeper/src/index.ts | 21 +- services/keeper/src/keeper.ts | 178 +- services/keeper/src/serve.ts | 1 + services/keeper/src/settlement-guard.test.ts | 745 ++++++- services/keeper/src/settlement-guard.ts | 486 ++++- services/keeper/src/status-server.ts | 4 + services/keeper/src/status.test.ts | 54 + services/keeper/src/status.ts | 26 +- services/keeper/src/watch-lease.test.ts | 32 +- services/keeper/src/watch-loop.ts | 18 +- 24 files changed, 16490 insertions(+), 51 deletions(-) create mode 100644 contracts/round/fixtures/settlement-cases.txt create mode 100644 contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.1.json create mode 100644 contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.10.json create mode 100644 contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.2.json create mode 100644 contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.3.json create mode 100644 contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.4.json create mode 100644 contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.5.json create mode 100644 contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.6.json create mode 100644 contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.7.json create mode 100644 contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.8.json create mode 100644 contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.9.json diff --git a/contracts/round/README.md b/contracts/round/README.md index 7ae604fc..36366363 100644 --- a/contracts/round/README.md +++ b/contracts/round/README.md @@ -25,6 +25,17 @@ user-facing message → suggested next action. cargo test -p sub-rosa-round ``` +### Shared settlement fixture + +[`fixtures/settlement-cases.txt`](fixtures/settlement-cases.txt) describes +settle and void cases in one table. This crate drives the contract through +every row (`settlement_fixture_drives_the_contract`, +`settlement_fixture_guard_reasons_match_contract_rules`), and the keeper's +settlement guard drives the same rows +(`services/keeper/src/settlement-guard.test.ts`). Editing the numbers on one +side only fails the other suite, so the guard's winner/refund rules cannot +drift from the contract's. + ## Related docs - [`docs/TECH_DESIGN.md`](../../docs/TECH_DESIGN.md) — system-wide architecture and storage model diff --git a/contracts/round/fixtures/settlement-cases.txt b/contracts/round/fixtures/settlement-cases.txt new file mode 100644 index 00000000..c7a8677a --- /dev/null +++ b/contracts/round/fixtures/settlement-cases.txt @@ -0,0 +1,57 @@ +# Sub Rosa settlement fixture — SHARED between the contract and the keeper. +# +# Read by: +# contracts/round/src/test.rs (include_str!) +# services/keeper/src/settlement-guard.test.ts +# +# Both suites assert the same rows, so the round contract's rules and the +# keeper settlement guard's rules cannot drift apart. Editing one side only +# fails the other suite. +# +# Syntax: fields are separated by '|', lists are separated by ','. +# Blank lines and lines starting with '#' are ignored. +# Fields: +# name stable case id, referenced by both suites +# action settle | void the submission the keeper is asking for +# rule HighestBid | LowestBid +# status on-chain status when the guard is asked to act +# grace 1 = now is past reveal_deadline + VOID_GRACE, 0 = still inside +# bids bid value per bidder (index aligned with escrows/revealed) +# escrows locked escrow per bidder; ?(N) = the keeper could not read +# that bid state (N is the escrow the contract actually holds) +# revealed 1 = the bidder revealed before clear, 0 = it never did +# read how many bidders of the index the keeper actually read +# (< #bids means the bidder page was truncated) +# winner_idx index of the winner after clear, -1 = nobody won +# operator operator payout when the contract accepts the action +# surplus winner's escrow surplus when the contract accepts the action +# refunds escrow the contract returns for this action, as idx:amount; +# '-' when the contract rejects the action (nothing is paid) +# guard_reason '-' = the guard may submit, otherwise the typed refusal the +# guard must return for this exact view +# contract ok = the contract accepts the action, otherwise the error name +# it must reject with +# +# Agreement rule asserted by both suites: every row the contract rejects has a +# guard_reason, i.e. the guard never submits what the contract would revert. +# +# The rows this fixture exists for — the guard and the contract disagreed on +# all three before Issue #385, because the guard happily submitted them: +# no-valid-bids-voided settle → contract answers RoundVoided +# void-of-revealed-round void → contract answers NotVoidable +# void-inside-grace void → contract answers NotVoidable +# Both suites now assert the guard refuses each of them before submitting. +# The reverse direction is covered too: `missing-refund-state` and +# `truncated-bidder-page` are rounds the contract accepts, which the guard +# still refuses because its local view cannot prove the refund set. +name|action|rule|status|grace|bids|escrows|revealed|read|winner_idx|operator|surplus|refunds|guard_reason|contract +highest-basic|settle|HighestBid|Cleared|1|700,500|700,500|1,1|2|0|700|0|1:500|-|ok +highest-surplus|settle|HighestBid|Cleared|1|700,500|1000,800|1,1|2|0|700|300|1:800|-|ok +lowest-basic|settle|LowestBid|Cleared|1|300,200,100|300,200,100|1,1,1|3|2|100|0|0:300,1:200|-|ok +unrevealed-loser-refunded|settle|HighestBid|Cleared|1|999,100|999,100|0,1|2|1|100|0|0:999|-|ok +missing-refund-state|settle|HighestBid|Cleared|1|700,500|700,?(500)|1,1|2|0|700|0|1:500|refund_missing|ok +truncated-bidder-page|settle|HighestBid|Cleared|1|700,500,500|700,500,500|1,1,1|2|0|700|0|1:500,2:500|bidder_page_incomplete|ok +no-valid-bids-voided|settle|HighestBid|Voided|1|700|700|0|1|-1|0|0|-|round_voided|RoundVoided +void-of-revealed-round|void|HighestBid|Revealing|1|700,500|700,500|1,1|2|-1|0|0|-|void_not_open|NotVoidable +void-inside-grace|void|HighestBid|Open|0|700|700|0|1|-1|0|0|-|void_grace_not_elapsed|NotVoidable +stale-open-void|void|HighestBid|Open|1|700|700|0|1|-1|0|0|0:700|-|ok diff --git a/contracts/round/src/test.rs b/contracts/round/src/test.rs index 596af7eb..14d43e7d 100644 --- a/contracts/round/src/test.rs +++ b/contracts/round/src/test.rs @@ -1511,3 +1511,438 @@ fn error_codes_use_reserved_ranges() { ); } } + +// ───────────────────────────────────────────────────────────────────────────── +// ISSUE #385 — SHARED SETTLEMENT FIXTURE (contract half) +// +// `contracts/round/fixtures/settlement-cases.txt` is read by BOTH suites: +// +// contracts/round/src/test.rs — this file: drives the +// round contract through every row and asserts the exact payout or the +// exact error the contract answers with. +// services/keeper/src/settlement-guard.test.ts — drives the keeper's +// settlement guard through the same rows and asserts its typed refusal +// (or its settlement plan). +// +// The rows the two suites used to disagree about are exactly the ones the +// contract rejects: the guard used to submit a settle or a void the contract +// reverts with `RoundVoided` / `NotVoidable`. Both halves now assert the same +// numbers from the same file, so the guard's rules cannot drift from the +// contract's without one of the two suites failing. +// ───────────────────────────────────────────────────────────────────────────── + +const SETTLEMENT_FIXTURE: &str = include_str!("../fixtures/settlement-cases.txt"); +const FIXTURE_MAX_BIDS: usize = 8; +const FIXTURE_MAX_REFUNDS: usize = 8; + +/// Guard refusal → the contract error the very same view must fail with. +/// These are the rules both suites promise to implement identically. +const GUARD_REASON_CONTRACT_ERROR: &[(&str, &str)] = &[ + ("already_settled", "AlreadySettled"), + ("round_voided", "RoundVoided"), + ("not_cleared", "NotCleared"), + ("missing_winner", "NoValidBids"), + ("void_not_open", "NotVoidable"), + ("void_grace_not_elapsed", "NotVoidable"), +]; + +/// Guard refusals that exist only because the keeper's *local view* is +/// incomplete (truncated bidder page, unreadable bid state, a stale winner). +/// The contract may well accept such a transaction — the guard still refuses, +/// because it cannot promise a refund set it never read. +const LOCAL_VIEW_GUARD_REASONS: &[&str] = + &["refund_missing", "bidder_page_incomplete", "winner_mismatch"]; + +struct SettlementCase { + name: &'static str, + action: &'static str, + rule: &'static str, + status: &'static str, + grace: bool, + bids: [i128; FIXTURE_MAX_BIDS], + bid_count: usize, + escrows: [i128; FIXTURE_MAX_BIDS], + revealed: [bool; FIXTURE_MAX_BIDS], + read: usize, + winner_idx: i32, + operator: i128, + surplus: i128, + refunds: [(usize, i128); FIXTURE_MAX_REFUNDS], + refund_count: usize, + guard_reason: &'static str, + contract: &'static str, +} + +fn fixture_field<'a, I: Iterator>(it: &mut I) -> &'a str { + it.next() + .unwrap_or_else(|| panic!("settlement fixture row is missing a field")) +} + +/// `?(500)` = the keeper could not read this bid state; the contract still +/// holds 500. The contract side only ever needs the real amount. +fn fixture_escrow(token: &str) -> i128 { + let inner = token.strip_prefix("?(").unwrap_or(token); + let inner = inner.strip_suffix(')').unwrap_or(inner); + inner.parse::().expect("fixture escrow must be an amount") +} + +fn parse_settlement_case(line: &'static str) -> SettlementCase { + let mut it = line.split('|'); + let name = fixture_field(&mut it); + let action = fixture_field(&mut it); + let rule = fixture_field(&mut it); + let status = fixture_field(&mut it); + let grace = fixture_field(&mut it) == "1"; + + let mut bids = [0i128; FIXTURE_MAX_BIDS]; + let mut bid_count = 0usize; + for token in fixture_field(&mut it).split(',') { + assert!(bid_count < FIXTURE_MAX_BIDS, "{name}: too many bids"); + bids[bid_count] = token.parse::().expect("fixture bid must be an amount"); + bid_count += 1; + } + + let mut escrows = [0i128; FIXTURE_MAX_BIDS]; + let mut escrow_count = 0usize; + for token in fixture_field(&mut it).split(',') { + assert!(escrow_count < FIXTURE_MAX_BIDS, "{name}: too many escrows"); + escrows[escrow_count] = fixture_escrow(token); + escrow_count += 1; + } + assert_eq!(bid_count, escrow_count, "{name}: bids and escrows must align"); + + let mut revealed = [false; FIXTURE_MAX_BIDS]; + let mut reveal_count = 0usize; + for token in fixture_field(&mut it).split(',') { + assert!(reveal_count < FIXTURE_MAX_BIDS, "{name}: too many revealed flags"); + revealed[reveal_count] = token == "1"; + reveal_count += 1; + } + assert_eq!(bid_count, reveal_count, "{name}: bids and revealed flags must align"); + + let read = fixture_field(&mut it).parse::().expect("fixture read must be a count"); + let winner_idx = fixture_field(&mut it).parse::().expect("fixture winner_idx must be an index"); + let operator = fixture_field(&mut it).parse::().expect("fixture operator must be an amount"); + let surplus = fixture_field(&mut it).parse::().expect("fixture surplus must be an amount"); + + let mut refunds = [(0usize, 0i128); FIXTURE_MAX_REFUNDS]; + let mut refund_count = 0usize; + let refunds_field = fixture_field(&mut it); + if refunds_field != "-" { + for token in refunds_field.split(',') { + assert!(refund_count < FIXTURE_MAX_REFUNDS, "{name}: too many refunds"); + let mut parts = token.split(':'); + let idx = fixture_field(&mut parts).parse::().expect("refund index"); + let amount = fixture_field(&mut parts).parse::().expect("refund amount"); + assert!(parts.next().is_none(), "{name}: malformed refund {token}"); + refunds[refund_count] = (idx, amount); + refund_count += 1; + } + } + + let guard_reason = fixture_field(&mut it); + let contract = fixture_field(&mut it); + assert!(it.next().is_none(), "{name}: fixture row has trailing fields"); + + assert!(read <= bid_count, "{name}: keeper read exceeds the bidder index"); + assert!( + matches!(action, "settle" | "void"), + "{name}: action must be settle or void" + ); + + SettlementCase { + name, + action, + rule, + status, + grace, + bids, + bid_count, + escrows, + revealed, + read, + winner_idx, + operator, + surplus, + refunds, + refund_count, + guard_reason, + contract, + } +} + +fn contract_error_from_name(name: &str, case: &str) -> Error { + for (variant, _) in DOCUMENTED_ERROR_CODES { + if variant_name(*variant) == name { + return *variant; + } + } + panic!("{case}: {name} is not a contract error in src/types.rs") +} + +fn status_from_name(name: &str) -> Status { + match name { + "Open" => Status::Open, + "Revealing" => Status::Revealing, + "Cleared" => Status::Cleared, + "Settled" => Status::Settled, + "Voided" => Status::Voided, + other => panic!("unknown round status {other} in the settlement fixture"), + } +} + +struct CaseRound { + f: Fixture, + id: u64, + bidders: Vec
, + operator: Address, + reveal_deadline: u64, +} + +/// Build the on-chain round a fixture row describes: same bids, same escrow, +/// the same reveal pattern, and the same status when the action is asked for. +fn build_case_round(c: &SettlementCase) -> CaseRound { + let (f, t_reveal, commit_deadline, reveal_deadline) = setup_drand(); + let operator = Address::generate(&f.env); + let rule = match c.rule { + "LowestBid" => ClearingRule::LowestBid, + "HighestBid" => ClearingRule::HighestBid, + other => panic!("{}: unknown clearing rule {other}", c.name), + }; + let id = drand_round(&f, &operator, commit_deadline, reveal_deadline, rule); + + let mut bidders = Vec::new(&f.env); + let mut nonces: Vec> = Vec::new(&f.env); + for i in 0..c.bid_count { + let bidder = funded_bidder(&f, c.escrows[i]); + let nonce = commit_bid(&f, id, &bidder, c.bids[i], c.escrows[i], (i as u8) + 1); + bidders.push_back(bidder); + nonces.push_back(nonce); + } + + // An Open round never opens the reveal window: `void` must be judged on + // status + grace alone. + if c.status == "Open" { + return CaseRound { f, id, bidders, operator, reveal_deadline }; + } + + f.env.ledger().with_mut(|l| l.timestamp = t_reveal + 1); + f.client.open_reveal(&id, &real_sig(&f.env)); + for i in 0..c.bid_count { + if c.revealed[i] { + f.client.reveal( + &id, + &bidders.get(i as u32).unwrap(), + &c.bids[i], + &nonces.get(i as u32).unwrap(), + ); + } + } + + // A fully revealed round that has not been cleared yet: `void` must be + // judged on the status rule alone. + if c.status == "Revealing" { + return CaseRound { f, id, bidders, operator, reveal_deadline }; + } + + f.env.ledger().with_mut(|l| l.timestamp = reveal_deadline + 1); + let winner = f.client.clear(&id); + match winner { + Some(w) => { + assert!( + c.winner_idx >= 0, + "{}: clear found a winner but the fixture says -1", + c.name + ); + assert_eq!( + w, + bidders.get(c.winner_idx as u32).unwrap(), + "{}: winner index", + c.name + ); + } + None => assert_eq!( + c.winner_idx, + -1, + "{}: clear found no winner but the fixture says index {}", + c.name, + c.winner_idx + ), + } + + CaseRound { f, id, bidders, operator, reveal_deadline } +} + +fn run_settlement_case(c: &SettlementCase) { + let case = build_case_round(c); + let f = &case.f; + assert_eq!( + f.client.get_round(&case.id).status, + status_from_name(c.status), + "{}: status before the action", + c.name + ); + // `read` is how much of the index the keeper's local view saw; the + // contract always reads the whole index itself, so all that matters here + // is that the row is well-formed. The truncation itself is the guard's + // half of the fixture (`bidder_page_incomplete`). + assert!( + c.read <= c.bid_count, + "{}: keeper read {} of {} bidders", + c.name, + c.read, + c.bid_count + ); + + // `grace = 1` places the clock past reveal_deadline + VOID_GRACE, `0` + // inside the window — the exact boundary `SubRosaRound::void` enforces. + let now = if c.grace { + case.reveal_deadline + 3_601 + } else { + case.reveal_deadline + 100 + }; + f.env.ledger().with_mut(|l| l.timestamp = now); + + if c.contract == "ok" { + if c.action == "settle" { + f.client.settle(&case.id); + assert_eq!( + f.client.get_round(&case.id).status, + Status::Settled, + "{}: settle must land", + c.name + ); + } else { + f.client.void(&case.id); + assert_eq!( + f.client.get_round(&case.id).status, + Status::Voided, + "{}: void must land", + c.name + ); + } + + assert_eq!( + f.usdc_token.balance(&case.operator), + c.operator, + "{}: operator payout", + c.name + ); + if c.winner_idx >= 0 { + assert_eq!( + f.usdc_token.balance(&case.bidders.get(c.winner_idx as u32).unwrap()), + c.surplus, + "{}: winner surplus", + c.name + ); + } else { + assert_eq!(c.surplus, 0, "{}: surplus without a winner", c.name); + } + for i in 0..c.refund_count { + let (idx, amount) = c.refunds[i]; + assert_eq!( + f.usdc_token.balance(&case.bidders.get(idx as u32).unwrap()), + amount, + "{}: refund for bidder {idx}", + c.name + ); + } + assert_eq!( + f.usdc_token.balance(&f.client.address), + 0, + "{}: contract must be drained", + c.name + ); + } else { + let expected = contract_error_from_name(c.contract, c.name); + if c.action == "settle" { + assert_try_contract_err(f.client.try_settle(&case.id), expected); + } else { + assert_try_contract_err(f.client.try_void(&case.id), expected); + } + assert_eq!( + f.client.get_round(&case.id).status, + status_from_name(c.status), + "{}: a rejected action must not move the round", + c.name + ); + } +} + +/// Iterate every data row of the shared fixture (comments and the header +/// line are skipped, exactly as the keeper suite does). +fn for_each_settlement_case(mut run: impl FnMut(&SettlementCase)) { + let mut count = 0usize; + for line in SETTLEMENT_FIXTURE.lines() { + let line = line.trim(); + if line.is_empty() || line.starts_with('#') || line.starts_with("name|") { + continue; + } + let case = parse_settlement_case(line); + run(&case); + count += 1; + } + assert!( + count >= 10, + "the shared settlement fixture must keep every row (parsed {count})" + ); +} + +#[test] +fn settlement_fixture_drives_the_contract() { + for_each_settlement_case(run_settlement_case); +} + +/// The agreement rule both suites assert: a row the contract rejects always +/// carries the guard refusal that maps back to that exact error, a row the +/// guard submits is always a row the contract accepts, and a local-view +/// refusal never claims the contract would reject on its own. +#[test] +fn settlement_fixture_guard_reasons_match_contract_rules() { + for_each_settlement_case(|c| { + let mapped = GUARD_REASON_CONTRACT_ERROR + .iter() + .find(|(reason, _)| *reason == c.guard_reason) + .map(|(_, error)| *error); + let local_view = LOCAL_VIEW_GUARD_REASONS.contains(&c.guard_reason); + + if c.guard_reason == "-" { + assert_eq!( + c.contract, "ok", + "{}: the guard submits only what the contract accepts", + c.name + ); + } else { + assert!( + mapped.is_some() || local_view, + "{}: {} is not a guard reason both suites know", + c.name, + c.guard_reason + ); + if let Some(error) = mapped { + assert_eq!( + c.contract, error, + "{}: guard reason {} must be exactly why the contract rejects", + c.name, c.guard_reason + ); + } else { + assert_eq!( + c.contract, "ok", + "{}: a local-view refusal must never claim the contract rejects", + c.name + ); + } + } + + if c.contract != "ok" { + assert_ne!( + c.guard_reason, "-", + "{}: the contract rejects with {} — the guard must refuse too", + c.name, + c.contract + ); + // The error name itself has to be a real variant, not a typo. + contract_error_from_name(c.contract, c.name); + } + }); +} diff --git a/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.1.json b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.1.json new file mode 100644 index 00000000..2d194d19 --- /dev/null +++ b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.1.json @@ -0,0 +1,1522 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "create_round", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "bytes": "abababababababababababababababababababababababababababababababab" + }, + { + "u64": 29155653 + }, + { + "vec": [ + { + "symbol": "HighestBid" + } + ] + }, + { + "u64": 1780270226 + }, + { + "u64": 1780270526 + }, + { + "bytes": "61756469746f72" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "bytes": "8e1e85062efc4a3b04e7d8107a9feee77c3f6ca49e0f335742de51ea966c27bd" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "bytes": "be6e7aa2cac5b273664d5f12bd247c45aae4603f42c06af1bf4080814565131d" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 1780274127, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_pubkey" + }, + "val": { + "bytes": "61756469746f72" + } + }, + { + "key": { + "symbol": "bidders" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + { + "key": { + "symbol": "clearing_rule" + }, + "val": { + "vec": [ + { + "symbol": "HighestBid" + } + ] + } + }, + { + "key": { + "symbol": "commit_deadline" + }, + "val": { + "u64": 1780270226 + } + }, + { + "key": { + "symbol": "item_ref" + }, + "val": { + "bytes": "abababababababababababababababababababababababababababababababab" + } + }, + { + "key": { + "symbol": "operator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "reveal_deadline" + }, + "val": { + "u64": 1780270526 + } + }, + { + "key": { + "symbol": "reveal_round" + }, + "val": { + "u64": 29155653 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Settled" + } + ] + } + }, + { + "key": { + "symbol": "winner" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "winning_bid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "8e1e85062efc4a3b04e7d8107a9feee77c3f6ca49e0f335742de51ea966c27bd" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "be6e7aa2cac5b273664d5f12bd247c45aae4603f42c06af1bf4080814565131d" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": { + "bytes": "0202020202020202020202020202020202020202020202020202020202020202" + } + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "drand_genesis" + }, + "val": { + "u64": 1692803367 + } + }, + { + "key": { + "symbol": "drand_period" + }, + "val": { + "u64": 3 + } + }, + { + "key": { + "symbol": "drand_pubkey" + }, + "val": { + "bytes": "03cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a01a714f2edb74119a2f2b0d5a7c75ba902d163700a61bc224ededd8e63aef7be1aaf8e93d7a9718b047ccddb3eb5d68b0e5db2b6bfbb01c867749cadffca88b36c24f3012ba09fc4d3022c5c37dce0f977d3adb5d183c7477c442b1f04515273" + } + }, + { + "key": { + "symbol": "dst" + }, + "val": { + "bytes": "424c535f5349475f424c53313233383147315f584d443a5348412d3235365f535357555f524f5f4e554c5f" + } + }, + { + "key": { + "symbol": "g2_neg_generator" + }, + "val": { + "bytes": "13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb813fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed0d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa" + } + }, + { + "key": { + "symbol": "usdc" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RoundCounter" + } + ] + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 1036800 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.10.json b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.10.json new file mode 100644 index 00000000..66a1c649 --- /dev/null +++ b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.10.json @@ -0,0 +1,1033 @@ +{ + "generators": { + "address": 5, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "create_round", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "bytes": "abababababababababababababababababababababababababababababababab" + }, + { + "u64": 29155653 + }, + { + "vec": [ + { + "symbol": "HighestBid" + } + ] + }, + { + "u64": 1780270226 + }, + { + "u64": 1780270526 + }, + { + "bytes": "61756469746f72" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "bytes": "8e1e85062efc4a3b04e7d8107a9feee77c3f6ca49e0f335742de51ea966c27bd" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 1780274127, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_pubkey" + }, + "val": { + "bytes": "61756469746f72" + } + }, + { + "key": { + "symbol": "bidders" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + { + "key": { + "symbol": "clearing_rule" + }, + "val": { + "vec": [ + { + "symbol": "HighestBid" + } + ] + } + }, + { + "key": { + "symbol": "commit_deadline" + }, + "val": { + "u64": 1780270226 + } + }, + { + "key": { + "symbol": "item_ref" + }, + "val": { + "bytes": "abababababababababababababababababababababababababababababababab" + } + }, + { + "key": { + "symbol": "operator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "reveal_deadline" + }, + "val": { + "u64": 1780270526 + } + }, + { + "key": { + "symbol": "reveal_round" + }, + "val": { + "u64": 29155653 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Voided" + } + ] + } + }, + { + "key": { + "symbol": "winner" + }, + "val": "void" + }, + { + "key": { + "symbol": "winning_bid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "8e1e85062efc4a3b04e7d8107a9feee77c3f6ca49e0f335742de51ea966c27bd" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": "void" + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": "void" + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "drand_genesis" + }, + "val": { + "u64": 1692803367 + } + }, + { + "key": { + "symbol": "drand_period" + }, + "val": { + "u64": 3 + } + }, + { + "key": { + "symbol": "drand_pubkey" + }, + "val": { + "bytes": "03cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a01a714f2edb74119a2f2b0d5a7c75ba902d163700a61bc224ededd8e63aef7be1aaf8e93d7a9718b047ccddb3eb5d68b0e5db2b6bfbb01c867749cadffca88b36c24f3012ba09fc4d3022c5c37dce0f977d3adb5d183c7477c442b1f04515273" + } + }, + { + "key": { + "symbol": "dst" + }, + "val": { + "bytes": "424c535f5349475f424c53313233383147315f584d443a5348412d3235365f535357555f524f5f4e554c5f" + } + }, + { + "key": { + "symbol": "g2_neg_generator" + }, + "val": { + "bytes": "13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb813fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed0d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa" + } + }, + { + "key": { + "symbol": "usdc" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RoundCounter" + } + ] + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 1036800 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.2.json b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.2.json new file mode 100644 index 00000000..bf257106 --- /dev/null +++ b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.2.json @@ -0,0 +1,1522 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "create_round", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "bytes": "abababababababababababababababababababababababababababababababab" + }, + { + "u64": 29155653 + }, + { + "vec": [ + { + "symbol": "HighestBid" + } + ] + }, + { + "u64": 1780270226 + }, + { + "u64": 1780270526 + }, + { + "bytes": "61756469746f72" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "bytes": "8e1e85062efc4a3b04e7d8107a9feee77c3f6ca49e0f335742de51ea966c27bd" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 800 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "bytes": "be6e7aa2cac5b273664d5f12bd247c45aae4603f42c06af1bf4080814565131d" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 800 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 800 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 1780274127, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_pubkey" + }, + "val": { + "bytes": "61756469746f72" + } + }, + { + "key": { + "symbol": "bidders" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + { + "key": { + "symbol": "clearing_rule" + }, + "val": { + "vec": [ + { + "symbol": "HighestBid" + } + ] + } + }, + { + "key": { + "symbol": "commit_deadline" + }, + "val": { + "u64": 1780270226 + } + }, + { + "key": { + "symbol": "item_ref" + }, + "val": { + "bytes": "abababababababababababababababababababababababababababababababab" + } + }, + { + "key": { + "symbol": "operator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "reveal_deadline" + }, + "val": { + "u64": 1780270526 + } + }, + { + "key": { + "symbol": "reveal_round" + }, + "val": { + "u64": 29155653 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Settled" + } + ] + } + }, + { + "key": { + "symbol": "winner" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "winning_bid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "8e1e85062efc4a3b04e7d8107a9feee77c3f6ca49e0f335742de51ea966c27bd" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "be6e7aa2cac5b273664d5f12bd247c45aae4603f42c06af1bf4080814565131d" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 800 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": { + "bytes": "0202020202020202020202020202020202020202020202020202020202020202" + } + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "drand_genesis" + }, + "val": { + "u64": 1692803367 + } + }, + { + "key": { + "symbol": "drand_period" + }, + "val": { + "u64": 3 + } + }, + { + "key": { + "symbol": "drand_pubkey" + }, + "val": { + "bytes": "03cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a01a714f2edb74119a2f2b0d5a7c75ba902d163700a61bc224ededd8e63aef7be1aaf8e93d7a9718b047ccddb3eb5d68b0e5db2b6bfbb01c867749cadffca88b36c24f3012ba09fc4d3022c5c37dce0f977d3adb5d183c7477c442b1f04515273" + } + }, + { + "key": { + "symbol": "dst" + }, + "val": { + "bytes": "424c535f5349475f424c53313233383147315f584d443a5348412d3235365f535357555f524f5f4e554c5f" + } + }, + { + "key": { + "symbol": "g2_neg_generator" + }, + "val": { + "bytes": "13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb813fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed0d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa" + } + }, + { + "key": { + "symbol": "usdc" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RoundCounter" + } + ] + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 300 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 800 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 1036800 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.3.json b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.3.json new file mode 100644 index 00000000..efb83120 --- /dev/null +++ b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.3.json @@ -0,0 +1,1926 @@ +{ + "generators": { + "address": 7, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "create_round", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "bytes": "abababababababababababababababababababababababababababababababab" + }, + { + "u64": 29155653 + }, + { + "vec": [ + { + "symbol": "LowestBid" + } + ] + }, + { + "u64": 1780270226 + }, + { + "u64": 1780270526 + }, + { + "bytes": "61756469746f72" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 300 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "bytes": "3b41f683ac464c53e52759f181b3884d86b33b1ee580531f267ba2e6c6c257ee" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 300 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 300 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 200 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "bytes": "8f84962944c06cbe92f4ab475c961c2db48ca89a840bd6428fffffa2ca04c24a" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 200 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 200 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "bytes": "abd8225a9cd4415f2e7abe83f91984c9d4d5e58848e3602330ef659fd1c002d1" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 1780274127, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_pubkey" + }, + "val": { + "bytes": "61756469746f72" + } + }, + { + "key": { + "symbol": "bidders" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + { + "key": { + "symbol": "clearing_rule" + }, + "val": { + "vec": [ + { + "symbol": "LowestBid" + } + ] + } + }, + { + "key": { + "symbol": "commit_deadline" + }, + "val": { + "u64": 1780270226 + } + }, + { + "key": { + "symbol": "item_ref" + }, + "val": { + "bytes": "abababababababababababababababababababababababababababababababab" + } + }, + { + "key": { + "symbol": "operator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "reveal_deadline" + }, + "val": { + "u64": 1780270526 + } + }, + { + "key": { + "symbol": "reveal_round" + }, + "val": { + "u64": 29155653 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Settled" + } + ] + } + }, + { + "key": { + "symbol": "winner" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "winning_bid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "3b41f683ac464c53e52759f181b3884d86b33b1ee580531f267ba2e6c6c257ee" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 300 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": { + "i128": { + "hi": 0, + "lo": 300 + } + } + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "8f84962944c06cbe92f4ab475c961c2db48ca89a840bd6428fffffa2ca04c24a" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 200 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": { + "bytes": "0202020202020202020202020202020202020202020202020202020202020202" + } + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": { + "i128": { + "hi": 0, + "lo": 200 + } + } + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "abd8225a9cd4415f2e7abe83f91984c9d4d5e58848e3602330ef659fd1c002d1" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": { + "bytes": "0303030303030303030303030303030303030303030303030303030303030303" + } + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "drand_genesis" + }, + "val": { + "u64": 1692803367 + } + }, + { + "key": { + "symbol": "drand_period" + }, + "val": { + "u64": 3 + } + }, + { + "key": { + "symbol": "drand_pubkey" + }, + "val": { + "bytes": "03cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a01a714f2edb74119a2f2b0d5a7c75ba902d163700a61bc224ededd8e63aef7be1aaf8e93d7a9718b047ccddb3eb5d68b0e5db2b6bfbb01c867749cadffca88b36c24f3012ba09fc4d3022c5c37dce0f977d3adb5d183c7477c442b1f04515273" + } + }, + { + "key": { + "symbol": "dst" + }, + "val": { + "bytes": "424c535f5349475f424c53313233383147315f584d443a5348412d3235365f535357555f524f5f4e554c5f" + } + }, + { + "key": { + "symbol": "g2_neg_generator" + }, + "val": { + "bytes": "13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb813fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed0d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa" + } + }, + { + "key": { + "symbol": "usdc" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RoundCounter" + } + ] + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 300 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 200 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 1036800 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.4.json b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.4.json new file mode 100644 index 00000000..9aac60e6 --- /dev/null +++ b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.4.json @@ -0,0 +1,1514 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "create_round", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "bytes": "abababababababababababababababababababababababababababababababab" + }, + { + "u64": 29155653 + }, + { + "vec": [ + { + "symbol": "HighestBid" + } + ] + }, + { + "u64": 1780270226 + }, + { + "u64": 1780270526 + }, + { + "bytes": "61756469746f72" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 999 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "bytes": "4613e28002ac55194395727be70e99d78ffb774a9062f6ecea0692d8fb2934d5" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 999 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 999 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "bytes": "d7cdd859096063e2198d283ff9349b84dc8e02e2889292458fcd810cc35a0b56" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 1780274127, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_pubkey" + }, + "val": { + "bytes": "61756469746f72" + } + }, + { + "key": { + "symbol": "bidders" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + { + "key": { + "symbol": "clearing_rule" + }, + "val": { + "vec": [ + { + "symbol": "HighestBid" + } + ] + } + }, + { + "key": { + "symbol": "commit_deadline" + }, + "val": { + "u64": 1780270226 + } + }, + { + "key": { + "symbol": "item_ref" + }, + "val": { + "bytes": "abababababababababababababababababababababababababababababababab" + } + }, + { + "key": { + "symbol": "operator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "reveal_deadline" + }, + "val": { + "u64": 1780270526 + } + }, + { + "key": { + "symbol": "reveal_round" + }, + "val": { + "u64": 29155653 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Settled" + } + ] + } + }, + { + "key": { + "symbol": "winner" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "winning_bid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "4613e28002ac55194395727be70e99d78ffb774a9062f6ecea0692d8fb2934d5" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 999 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": "void" + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": "void" + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "d7cdd859096063e2198d283ff9349b84dc8e02e2889292458fcd810cc35a0b56" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": { + "bytes": "0202020202020202020202020202020202020202020202020202020202020202" + } + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "drand_genesis" + }, + "val": { + "u64": 1692803367 + } + }, + { + "key": { + "symbol": "drand_period" + }, + "val": { + "u64": 3 + } + }, + { + "key": { + "symbol": "drand_pubkey" + }, + "val": { + "bytes": "03cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a01a714f2edb74119a2f2b0d5a7c75ba902d163700a61bc224ededd8e63aef7be1aaf8e93d7a9718b047ccddb3eb5d68b0e5db2b6bfbb01c867749cadffca88b36c24f3012ba09fc4d3022c5c37dce0f977d3adb5d183c7477c442b1f04515273" + } + }, + { + "key": { + "symbol": "dst" + }, + "val": { + "bytes": "424c535f5349475f424c53313233383147315f584d443a5348412d3235365f535357555f524f5f4e554c5f" + } + }, + { + "key": { + "symbol": "g2_neg_generator" + }, + "val": { + "bytes": "13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb813fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed0d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa" + } + }, + { + "key": { + "symbol": "usdc" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RoundCounter" + } + ] + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 999 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 1036800 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.5.json b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.5.json new file mode 100644 index 00000000..2d194d19 --- /dev/null +++ b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.5.json @@ -0,0 +1,1522 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "create_round", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "bytes": "abababababababababababababababababababababababababababababababab" + }, + { + "u64": 29155653 + }, + { + "vec": [ + { + "symbol": "HighestBid" + } + ] + }, + { + "u64": 1780270226 + }, + { + "u64": 1780270526 + }, + { + "bytes": "61756469746f72" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "bytes": "8e1e85062efc4a3b04e7d8107a9feee77c3f6ca49e0f335742de51ea966c27bd" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "bytes": "be6e7aa2cac5b273664d5f12bd247c45aae4603f42c06af1bf4080814565131d" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 1780274127, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_pubkey" + }, + "val": { + "bytes": "61756469746f72" + } + }, + { + "key": { + "symbol": "bidders" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + { + "key": { + "symbol": "clearing_rule" + }, + "val": { + "vec": [ + { + "symbol": "HighestBid" + } + ] + } + }, + { + "key": { + "symbol": "commit_deadline" + }, + "val": { + "u64": 1780270226 + } + }, + { + "key": { + "symbol": "item_ref" + }, + "val": { + "bytes": "abababababababababababababababababababababababababababababababab" + } + }, + { + "key": { + "symbol": "operator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "reveal_deadline" + }, + "val": { + "u64": 1780270526 + } + }, + { + "key": { + "symbol": "reveal_round" + }, + "val": { + "u64": 29155653 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Settled" + } + ] + } + }, + { + "key": { + "symbol": "winner" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "winning_bid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "8e1e85062efc4a3b04e7d8107a9feee77c3f6ca49e0f335742de51ea966c27bd" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "be6e7aa2cac5b273664d5f12bd247c45aae4603f42c06af1bf4080814565131d" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": { + "bytes": "0202020202020202020202020202020202020202020202020202020202020202" + } + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "drand_genesis" + }, + "val": { + "u64": 1692803367 + } + }, + { + "key": { + "symbol": "drand_period" + }, + "val": { + "u64": 3 + } + }, + { + "key": { + "symbol": "drand_pubkey" + }, + "val": { + "bytes": "03cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a01a714f2edb74119a2f2b0d5a7c75ba902d163700a61bc224ededd8e63aef7be1aaf8e93d7a9718b047ccddb3eb5d68b0e5db2b6bfbb01c867749cadffca88b36c24f3012ba09fc4d3022c5c37dce0f977d3adb5d183c7477c442b1f04515273" + } + }, + { + "key": { + "symbol": "dst" + }, + "val": { + "bytes": "424c535f5349475f424c53313233383147315f584d443a5348412d3235365f535357555f524f5f4e554c5f" + } + }, + { + "key": { + "symbol": "g2_neg_generator" + }, + "val": { + "bytes": "13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb813fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed0d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa" + } + }, + { + "key": { + "symbol": "usdc" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RoundCounter" + } + ] + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 1036800 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.6.json b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.6.json new file mode 100644 index 00000000..6ea5fabb --- /dev/null +++ b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.6.json @@ -0,0 +1,1926 @@ +{ + "generators": { + "address": 7, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "create_round", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "bytes": "abababababababababababababababababababababababababababababababab" + }, + { + "u64": 29155653 + }, + { + "vec": [ + { + "symbol": "HighestBid" + } + ] + }, + { + "u64": 1780270226 + }, + { + "u64": 1780270526 + }, + { + "bytes": "61756469746f72" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "bytes": "8e1e85062efc4a3b04e7d8107a9feee77c3f6ca49e0f335742de51ea966c27bd" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "bytes": "be6e7aa2cac5b273664d5f12bd247c45aae4603f42c06af1bf4080814565131d" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "bytes": "3575c827c723ef854f979d8a6ab26cb62827f730f098d813f6366d8a855d52bb" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 1780274127, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_pubkey" + }, + "val": { + "bytes": "61756469746f72" + } + }, + { + "key": { + "symbol": "bidders" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + { + "key": { + "symbol": "clearing_rule" + }, + "val": { + "vec": [ + { + "symbol": "HighestBid" + } + ] + } + }, + { + "key": { + "symbol": "commit_deadline" + }, + "val": { + "u64": 1780270226 + } + }, + { + "key": { + "symbol": "item_ref" + }, + "val": { + "bytes": "abababababababababababababababababababababababababababababababab" + } + }, + { + "key": { + "symbol": "operator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "reveal_deadline" + }, + "val": { + "u64": 1780270526 + } + }, + { + "key": { + "symbol": "reveal_round" + }, + "val": { + "u64": 29155653 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Settled" + } + ] + } + }, + { + "key": { + "symbol": "winner" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "winning_bid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "8e1e85062efc4a3b04e7d8107a9feee77c3f6ca49e0f335742de51ea966c27bd" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "be6e7aa2cac5b273664d5f12bd247c45aae4603f42c06af1bf4080814565131d" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": { + "bytes": "0202020202020202020202020202020202020202020202020202020202020202" + } + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "3575c827c723ef854f979d8a6ab26cb62827f730f098d813f6366d8a855d52bb" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": { + "bytes": "0303030303030303030303030303030303030303030303030303030303030303" + } + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "drand_genesis" + }, + "val": { + "u64": 1692803367 + } + }, + { + "key": { + "symbol": "drand_period" + }, + "val": { + "u64": 3 + } + }, + { + "key": { + "symbol": "drand_pubkey" + }, + "val": { + "bytes": "03cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a01a714f2edb74119a2f2b0d5a7c75ba902d163700a61bc224ededd8e63aef7be1aaf8e93d7a9718b047ccddb3eb5d68b0e5db2b6bfbb01c867749cadffca88b36c24f3012ba09fc4d3022c5c37dce0f977d3adb5d183c7477c442b1f04515273" + } + }, + { + "key": { + "symbol": "dst" + }, + "val": { + "bytes": "424c535f5349475f424c53313233383147315f584d443a5348412d3235365f535357555f524f5f4e554c5f" + } + }, + { + "key": { + "symbol": "g2_neg_generator" + }, + "val": { + "bytes": "13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb813fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed0d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa" + } + }, + { + "key": { + "symbol": "usdc" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RoundCounter" + } + ] + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 1036800 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.7.json b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.7.json new file mode 100644 index 00000000..ba050d08 --- /dev/null +++ b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.7.json @@ -0,0 +1,1032 @@ +{ + "generators": { + "address": 5, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "create_round", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "bytes": "abababababababababababababababababababababababababababababababab" + }, + { + "u64": 29155653 + }, + { + "vec": [ + { + "symbol": "HighestBid" + } + ] + }, + { + "u64": 1780270226 + }, + { + "u64": 1780270526 + }, + { + "bytes": "61756469746f72" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "bytes": "8e1e85062efc4a3b04e7d8107a9feee77c3f6ca49e0f335742de51ea966c27bd" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 1780274127, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_pubkey" + }, + "val": { + "bytes": "61756469746f72" + } + }, + { + "key": { + "symbol": "bidders" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + { + "key": { + "symbol": "clearing_rule" + }, + "val": { + "vec": [ + { + "symbol": "HighestBid" + } + ] + } + }, + { + "key": { + "symbol": "commit_deadline" + }, + "val": { + "u64": 1780270226 + } + }, + { + "key": { + "symbol": "item_ref" + }, + "val": { + "bytes": "abababababababababababababababababababababababababababababababab" + } + }, + { + "key": { + "symbol": "operator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "reveal_deadline" + }, + "val": { + "u64": 1780270526 + } + }, + { + "key": { + "symbol": "reveal_round" + }, + "val": { + "u64": 29155653 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Voided" + } + ] + } + }, + { + "key": { + "symbol": "winner" + }, + "val": "void" + }, + { + "key": { + "symbol": "winning_bid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "8e1e85062efc4a3b04e7d8107a9feee77c3f6ca49e0f335742de51ea966c27bd" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": "void" + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": "void" + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "drand_genesis" + }, + "val": { + "u64": 1692803367 + } + }, + { + "key": { + "symbol": "drand_period" + }, + "val": { + "u64": 3 + } + }, + { + "key": { + "symbol": "drand_pubkey" + }, + "val": { + "bytes": "03cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a01a714f2edb74119a2f2b0d5a7c75ba902d163700a61bc224ededd8e63aef7be1aaf8e93d7a9718b047ccddb3eb5d68b0e5db2b6bfbb01c867749cadffca88b36c24f3012ba09fc4d3022c5c37dce0f977d3adb5d183c7477c442b1f04515273" + } + }, + { + "key": { + "symbol": "dst" + }, + "val": { + "bytes": "424c535f5349475f424c53313233383147315f584d443a5348412d3235365f535357555f524f5f4e554c5f" + } + }, + { + "key": { + "symbol": "g2_neg_generator" + }, + "val": { + "bytes": "13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb813fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed0d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa" + } + }, + { + "key": { + "symbol": "usdc" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RoundCounter" + } + ] + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 1036800 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.8.json b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.8.json new file mode 100644 index 00000000..d8696dd6 --- /dev/null +++ b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.8.json @@ -0,0 +1,1442 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "create_round", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "bytes": "abababababababababababababababababababababababababababababababab" + }, + { + "u64": 29155653 + }, + { + "vec": [ + { + "symbol": "HighestBid" + } + ] + }, + { + "u64": 1780270226 + }, + { + "u64": 1780270526 + }, + { + "bytes": "61756469746f72" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "bytes": "8e1e85062efc4a3b04e7d8107a9feee77c3f6ca49e0f335742de51ea966c27bd" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "bytes": "be6e7aa2cac5b273664d5f12bd247c45aae4603f42c06af1bf4080814565131d" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 1780274127, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_pubkey" + }, + "val": { + "bytes": "61756469746f72" + } + }, + { + "key": { + "symbol": "bidders" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + { + "key": { + "symbol": "clearing_rule" + }, + "val": { + "vec": [ + { + "symbol": "HighestBid" + } + ] + } + }, + { + "key": { + "symbol": "commit_deadline" + }, + "val": { + "u64": 1780270226 + } + }, + { + "key": { + "symbol": "item_ref" + }, + "val": { + "bytes": "abababababababababababababababababababababababababababababababab" + } + }, + { + "key": { + "symbol": "operator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "reveal_deadline" + }, + "val": { + "u64": 1780270526 + } + }, + { + "key": { + "symbol": "reveal_round" + }, + "val": { + "u64": 29155653 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Revealing" + } + ] + } + }, + { + "key": { + "symbol": "winner" + }, + "val": "void" + }, + { + "key": { + "symbol": "winning_bid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "8e1e85062efc4a3b04e7d8107a9feee77c3f6ca49e0f335742de51ea966c27bd" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "be6e7aa2cac5b273664d5f12bd247c45aae4603f42c06af1bf4080814565131d" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": { + "bytes": "0202020202020202020202020202020202020202020202020202020202020202" + } + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "drand_genesis" + }, + "val": { + "u64": 1692803367 + } + }, + { + "key": { + "symbol": "drand_period" + }, + "val": { + "u64": 3 + } + }, + { + "key": { + "symbol": "drand_pubkey" + }, + "val": { + "bytes": "03cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a01a714f2edb74119a2f2b0d5a7c75ba902d163700a61bc224ededd8e63aef7be1aaf8e93d7a9718b047ccddb3eb5d68b0e5db2b6bfbb01c867749cadffca88b36c24f3012ba09fc4d3022c5c37dce0f977d3adb5d183c7477c442b1f04515273" + } + }, + { + "key": { + "symbol": "dst" + }, + "val": { + "bytes": "424c535f5349475f424c53313233383147315f584d443a5348412d3235365f535357555f524f5f4e554c5f" + } + }, + { + "key": { + "symbol": "g2_neg_generator" + }, + "val": { + "bytes": "13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb813fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed0d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa" + } + }, + { + "key": { + "symbol": "usdc" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RoundCounter" + } + ] + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1200 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 1036800 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.9.json b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.9.json new file mode 100644 index 00000000..c4b80b29 --- /dev/null +++ b/contracts/round/test_snapshots/test/settlement_fixture_drives_the_contract.9.json @@ -0,0 +1,1030 @@ +{ + "generators": { + "address": 5, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "create_round", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "bytes": "abababababababababababababababababababababababababababababababab" + }, + { + "u64": 29155653 + }, + { + "vec": [ + { + "symbol": "HighestBid" + } + ] + }, + { + "u64": 1780270226 + }, + { + "u64": 1780270526 + }, + { + "bytes": "61756469746f72" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "bytes": "8e1e85062efc4a3b04e7d8107a9feee77c3f6ca49e0f335742de51ea966c27bd" + }, + { + "bytes": "7365616c6564" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + }, + { + "bytes": "69642d626c6f62" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 700 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 1780270626, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Round" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_pubkey" + }, + "val": { + "bytes": "61756469746f72" + } + }, + { + "key": { + "symbol": "bidders" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + { + "key": { + "symbol": "clearing_rule" + }, + "val": { + "vec": [ + { + "symbol": "HighestBid" + } + ] + } + }, + { + "key": { + "symbol": "commit_deadline" + }, + "val": { + "u64": 1780270226 + } + }, + { + "key": { + "symbol": "item_ref" + }, + "val": { + "bytes": "abababababababababababababababababababababababababababababababab" + } + }, + { + "key": { + "symbol": "operator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "reveal_deadline" + }, + "val": { + "u64": 1780270526 + } + }, + { + "key": { + "symbol": "reveal_round" + }, + "val": { + "u64": 29155653 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Open" + } + ] + } + }, + { + "key": { + "symbol": "winner" + }, + "val": "void" + }, + { + "key": { + "symbol": "winning_bid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Seal" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_blob" + }, + "val": { + "bytes": "69642d626c6f62" + } + }, + { + "key": { + "symbol": "ciphertext" + }, + "val": { + "bytes": "7365616c6564" + } + } + ] + } + } + }, + "ext": "v0" + }, + 34560 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "State" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "commitment" + }, + "val": { + "bytes": "8e1e85062efc4a3b04e7d8107a9feee77c3f6ca49e0f335742de51ea966c27bd" + } + }, + { + "key": { + "symbol": "escrow" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "revealed_nonce" + }, + "val": "void" + }, + { + "key": { + "symbol": "revealed_value" + }, + "val": "void" + }, + { + "key": { + "symbol": "settled" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "valid" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "drand_genesis" + }, + "val": { + "u64": 1692803367 + } + }, + { + "key": { + "symbol": "drand_period" + }, + "val": { + "u64": 3 + } + }, + { + "key": { + "symbol": "drand_pubkey" + }, + "val": { + "bytes": "03cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a01a714f2edb74119a2f2b0d5a7c75ba902d163700a61bc224ededd8e63aef7be1aaf8e93d7a9718b047ccddb3eb5d68b0e5db2b6bfbb01c867749cadffca88b36c24f3012ba09fc4d3022c5c37dce0f977d3adb5d183c7477c442b1f04515273" + } + }, + { + "key": { + "symbol": "dst" + }, + "val": { + "bytes": "424c535f5349475f424c53313233383147315f584d443a5348412d3235365f535357555f524f5f4e554c5f" + } + }, + { + "key": { + "symbol": "g2_neg_generator" + }, + "val": { + "bytes": "13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb813fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed0d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa" + } + }, + { + "key": { + "symbol": "usdc" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RoundCounter" + } + ] + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 1036800 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 700 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 1036800 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/services/keeper/README.md b/services/keeper/README.md index 950032c9..13c66c33 100644 --- a/services/keeper/README.md +++ b/services/keeper/README.md @@ -78,6 +78,8 @@ Response shape (typed in `@sub-rosa/sdk` as `KeeperStatusResponse`): "winningValue": null, "clearingRule": "HighestBid", "settlement": "none", + "guardSkip": null, + "guardSkipIndicator": null, "lastKeeperAction": null, "lastError": null, "retryCount": 0, @@ -98,6 +100,8 @@ Response shape (typed in `@sub-rosa/sdk` as `KeeperStatusResponse`): - `voidableAfter`: unix seconds after which a still-Open round can be voided (reveal_deadline + 3600s grace). - `bidderCount`, `revealedCount`: from the on-chain bidder index / bid states; `null` when unreachable. - `settlement`: `pending | submitted | terminal | none` — reflects the in-memory settlement guard. +- `guardSkip`: the typed reason the settlement guard last refused a submission for this round, or `null`. Shape: `{ action, reason, detail, at }` where `reason` is one of `already_settled | round_voided | not_cleared | missing_winner | bidder_page_incomplete | refund_missing | winner_mismatch | void_not_open | void_grace_not_elapsed`. It is set only when the keeper looked at a settle or a void and did **not** submit it because the round contract would have rejected the transaction (or the local view could not prove the refund set). +- `guardSkipIndicator`: `" refused: "` — the same refusal, flattened for logs and dashboards. - `lastKeeperAction`: human-readable summary of the last mutation the keeper performed for this round. - `lastError`, `retryCount`: tick failure tracking. diff --git a/services/keeper/src/index.ts b/services/keeper/src/index.ts index 895abf1a..833864f5 100644 --- a/services/keeper/src/index.ts +++ b/services/keeper/src/index.ts @@ -9,7 +9,6 @@ export { waitForRound, errorName, errorMatches, - VOID_GRACE_SECONDS, type KeeperDeps, type KeeperResult, type CloseResult, @@ -20,10 +19,29 @@ export { } from "./keeper.js"; export { createSettlementGuard, + describeSettlementSkip, + evaluateSettle, + evaluateVoid, + expectedWinner, + readSettlementView, + settleRefunds, + voidRefunds, + VOID_GRACE_SECONDS, + type ClearingRuleTag, + type ContractDecision, + type ContractSkipEvent, + type ContractSkipReason, type DuplicateSkipEvent, + type GuardBidderState, + type GuardSkipRecord, + type RoundSettlementView, + type SettlementAction, + type SettlementCheck, type SettlementGuard, type SettlementGuardEntry, type SettlementGuardStatus, + type SettlementPlan, + type SettlementSkipEvent, } from "./settlement-guard.js"; export { buildKeeperDryRunSummary, @@ -46,6 +64,7 @@ export { buildKeeperStatus, buildRoundStatus, checkHealth, + guardSkipIndicator, type BuildStatusSource, type BuildRoundStatusArgs, type StatusReader, diff --git a/services/keeper/src/keeper.ts b/services/keeper/src/keeper.ts index 74d55d01..552414ea 100644 --- a/services/keeper/src/keeper.ts +++ b/services/keeper/src/keeper.ts @@ -19,6 +19,16 @@ import { normalizeError } from "@sub-rosa/logging/errors"; import type { SubRosaClient } from "@sub-rosa/sdk"; import { openBid, fetchRoundSignature, type DrandClient } from "@sub-rosa/tlock"; import { compareRoundIds } from "./store.js"; +import { + describeSettlementSkip, + evaluateVoid, + readSettlementView, + voidAfter, + type ContractSkipEvent, + type RoundSettlementView, + type SettlementGuard, + type SettlementSkipEvent, +} from "./settlement-guard.js"; import { resolveTimeContext, systemTime, @@ -26,6 +36,8 @@ import { type TimeContext, } from "@sub-rosa/time"; +export { VOID_GRACE_SECONDS } from "./settlement-guard.js"; + export type KeeperLogger = (msg: string) => void; export interface KeeperDeps { @@ -39,6 +51,13 @@ export interface KeeperDeps { pollMs?: number; /** Injectable wall clock and scheduler. Default: systemTime. */ time?: PartialTimeContext; + /** + * Duplicate + contract-rule guard. When present, a settle or a void is + * refused (with a typed reason) if the local view of the round is one the + * contract would reject — incomplete bidder page, unreadable refund, + * winner mismatch, wrong status, or a void inside the grace window. + */ + settlementGuard?: SettlementGuard; } export interface SkipRecord { @@ -68,6 +87,17 @@ export function errorMatches(e: unknown, names: string[]): boolean { return names.some((name) => diagnostic.includes(name)); } +/** + * Narrow a guard decision to a contract-rule refusal. A duplicate skip is + * already reported by the settlement indicator, so only the typed contract + * reason is carried on the close/void result. + */ +function contractRefusal( + event: SettlementSkipEvent, +): ContractSkipEvent | undefined { + return event.event === "settlement_skipped_contract" ? event : undefined; +} + function keeperTime(deps: KeeperDeps): TimeContext { return resolveTimeContext(systemTime, deps.time); } @@ -229,6 +259,8 @@ export interface CloseResult { winner?: string; finalStatus: string; skipped: string[]; + /** Set when the settlement guard refused to submit (typed contract rule). */ + guardSkip?: ContractSkipEvent; } /** Drive a revealed round to completion: clear (after the reveal deadline) then @@ -284,15 +316,38 @@ export async function closeRound( // ── Phase D: settle a cleared round (real SAC transfers) ────────────── if (round.status.tag === "Cleared") { - try { - await sdk.settle(rid); - result.settled = true; - log(`settled round ${rid}`); - } catch (e) { - if (errorMatches(e, ["AlreadySettled", "NotCleared", "WrongStatus"])) { - result.skipped.push(`settle skipped: ${errorName(e)}`); + const guard = deps.settlementGuard; + let refused = false; + if (guard) { + // The contract decides the winner and the refund set; we check our local + // view of both before paying for a transaction it would reject. + const view = await readSettlementView(sdk, rid, clock.nowSeconds()); + const check = guard.checkSettle(view); + if (check.allowed) { + guard.markSubmitted(rid); } else { - throw e; + refused = true; + result.guardSkip = contractRefusal(check.event); + const reason = describeSettlementSkip(check.event); + result.skipped.push(`settle refused: ${reason}`); + log(`settle refused for round ${rid}: ${reason}`); + } + } + + if (!refused) { + try { + await sdk.settle(rid); + result.settled = true; + guard?.markTerminal(rid, "settled on-chain"); + log(`settled round ${rid}`); + } catch (e) { + if (errorMatches(e, ["AlreadySettled", "NotCleared", "WrongStatus"])) { + result.skipped.push(`settle skipped: ${errorName(e)}`); + guard?.markTerminal(rid, errorName(e)); + } else { + guard?.markRetryable(rid, errorName(e)); + throw e; + } } } round = await sdk.getRound(rid); @@ -309,14 +364,39 @@ export async function closeRound( return result; } -/** Matches `VOID_GRACE` in the Round contract (seconds after reveal_deadline). */ -export const VOID_GRACE_SECONDS = 3600; - export interface VoidResult { roundId: bigint; voided: boolean; skipped: string[]; finalStatus: string; + /** Set when the settlement guard refused to submit (typed contract rule). */ + guardSkip?: ContractSkipEvent; +} + +/** + * The status/grace half of the void rules, as a view with no bidder reads: + * `evaluateVoid` only inspects status and the grace window until the bidder + * page is consulted, so this decides "is a void even on the table?" without + * paying for the full read when it is not. + */ +function voidGateView(round: { + status: { tag: string }; + clearing_rule?: { tag: string }; + reveal_deadline: bigint | number; + winner?: string | null; + winning_bid?: bigint | null; +}, roundId: bigint, nowSeconds: number): RoundSettlementView { + return { + roundId: roundId.toString(), + status: round.status.tag, + clearingRule: round.clearing_rule?.tag === "LowestBid" ? "LowestBid" : "HighestBid", + revealDeadline: Number(round.reveal_deadline), + nowSeconds, + bidders: [], + bidderTotal: 0, + winner: round.winner ?? null, + winningBid: round.winning_bid == null ? null : BigInt(round.winning_bid), + }; } /** Liveness safety valve: void an Open round if R never arrived and grace elapsed. */ @@ -326,6 +406,7 @@ export async function voidIfStale( ): Promise { const { sdk, log = () => {} } = deps; const { clock } = keeperTime(deps); + const guard = deps.settlementGuard; const rid = BigInt(roundId); const result: VoidResult = { roundId: rid, @@ -334,34 +415,91 @@ export async function voidIfStale( finalStatus: "", }; - let round = await sdk.getRound(rid); + const round = await sdk.getRound(rid); + const now = clock.nowSeconds(); + + // ── Cheap gate: only an Open round can ever be voided ────────────────── if (round.status.tag !== "Open") { - result.skipped.push(`status ${round.status.tag}`); result.finalStatus = round.status.tag; + if (!guard) { + result.skipped.push(`status ${round.status.tag}`); + return result; + } + // A void of a round the contract would not accept (Revealing, Cleared, + // Settled, Voided) is refused with the typed rule the status endpoint + // shows — the keeper considered it and deliberately did not submit. + const checked = guard.checkVoid(voidGateView(round, rid, now)); + const noteStatus = () => result.skipped.push(`status ${round.status.tag}`); + if (checked.allowed) { + noteStatus(); + return result; + } + const refusal = contractRefusal(checked.event); + if (!refusal) { + // Duplicate suppression already reported this round; nothing withheld. + noteStatus(); + return result; + } + result.guardSkip = refusal; + const reason = describeSettlementSkip(checked.event); + result.skipped.push(`void refused: ${reason}`); + log(`void refused for round ${rid}: ${reason}`); return result; } - const now = clock.nowSeconds(); - const voidAfter = Number(round.reveal_deadline) + VOID_GRACE_SECONDS; - if (now <= voidAfter) { - result.skipped.push(`void not yet allowed until ${voidAfter}`); + const gate = evaluateVoid(voidGateView(round, rid, now)); + if (!gate.allowed) { + // Open, but the contract would still reject it — record the typed reason + // the status endpoint shows instead of paying for a failed transaction. + if (guard) { + const refused = guard.checkVoid(voidGateView(round, rid, now)); + if (!refused.allowed) { + result.guardSkip = contractRefusal(refused.event); + const reason = describeSettlementSkip(refused.event); + result.skipped.push(`void refused: ${reason}`); + log(`void refused for round ${rid}: ${reason}`); + } + } else { + result.skipped.push( + `void not yet allowed until ${voidAfter(Number(round.reveal_deadline))}`, + ); + } result.finalStatus = round.status.tag; return result; } + // ── A void is on the table: verify the refund set before dispatching ─── + if (guard) { + const view = await readSettlementView(sdk, rid, now); + const check = guard.checkVoid(view); + if (!check.allowed) { + result.guardSkip = contractRefusal(check.event); + const reason = describeSettlementSkip(check.event); + result.skipped.push(`void refused: ${reason}`); + log(`void refused for round ${rid}: ${reason}`); + const after = await sdk.getRound(rid); + result.finalStatus = after.status.tag; + return result; + } + guard.markSubmitted(rid); + } + try { await sdk.void(rid); result.voided = true; + guard?.markTerminal(rid, "voided on-chain"); log(`voided round ${rid} (Drand liveness / grace elapsed)`); } catch (e) { if (errorMatches(e, ["NotVoidable", "WrongStatus", "AlreadyCleared"])) { result.skipped.push(errorName(e)); + guard?.markTerminal(rid, errorName(e)); } else { + guard?.markRetryable(rid, errorName(e)); throw e; } } - round = await sdk.getRound(rid); - result.finalStatus = round.status.tag; + const after = await sdk.getRound(rid); + result.finalStatus = after.status.tag; return result; } @@ -416,7 +554,7 @@ export async function watchRound( const tick: WatchTickResult = { roundId: rid, finalStatus: "" }; const voidRes = await voidIfStale(deps, rid); - if (voidRes.voided) tick.void = voidRes; + if (voidRes.voided || voidRes.guardSkip) tick.void = voidRes; let round = await deps.sdk.getRound(rid); if (round.status.tag === "Open" || round.status.tag === "Revealing") { diff --git a/services/keeper/src/serve.ts b/services/keeper/src/serve.ts index 93ac4660..234a757f 100644 --- a/services/keeper/src/serve.ts +++ b/services/keeper/src/serve.ts @@ -96,6 +96,7 @@ async function main() { if (entry.status === "submitted") return "submitted"; return "terminal"; }, + guardSkip: (rid) => settlementGuard.getEntry(rid)?.skip ?? null, }); statusHandle = withGracefulShutdown(server); diagnostics.info("status-api-http", `· status API: http://${statusHost}:${statusPort} (GET /status, /status/rounds/:id, /healthz, /status/health)`); diff --git a/services/keeper/src/settlement-guard.test.ts b/services/keeper/src/settlement-guard.test.ts index 5c9b1388..820ef452 100644 --- a/services/keeper/src/settlement-guard.test.ts +++ b/services/keeper/src/settlement-guard.test.ts @@ -10,10 +10,27 @@ import { describe, it } from "node:test"; import assert from "node:assert/strict"; +import * as fs from "node:fs"; +import { fileURLToPath } from "node:url"; -import { createSettlementGuard } from "./settlement-guard.js"; +import type { SubRosaClient } from "@sub-rosa/sdk"; +import type { DrandClient } from "@sub-rosa/tlock"; +import { FakeClock } from "@sub-rosa/time"; + +import { closeRound, voidIfStale } from "./keeper.js"; +import { + createSettlementGuard, + describeSettlementSkip, + evaluateSettle, + evaluateVoid, + expectedWinner, + readSettlementView, + VOID_GRACE_SECONDS, +} from "./settlement-guard.js"; import type { DuplicateSkipEvent, + GuardBidderState, + RoundSettlementView, SettlementGuard, } from "./settlement-guard.js"; @@ -362,4 +379,730 @@ describe("Bounded retry invariant", () => { ); } }); +}); + +// --------------------------------------------------------------------------- +// 4. Shared settlement fixture — contracts/round/fixtures/settlement-cases.txt +// +// The same file drives contracts/round/src/test.rs. Every row asserts the +// guard's verdict against the verdict the round contract answers with, so the +// two suites can never drift apart: edit one side only and the other fails. +// --------------------------------------------------------------------------- + +const FIXTURE_PATH = fileURLToPath( + new URL( + "../../../contracts/round/fixtures/settlement-cases.txt", + import.meta.url, + ), +); + +const REVEAL_DEADLINE = 1_700_000_000; + +/** + * Guard refusal → the contract error the very same view must fail with. + * `null` marks a refusal that only exists because the keeper's local view is + * incomplete: the contract may well accept the transaction, the guard still + * refuses because it cannot promise a refund set it never read. + * + * Mirrored by `GUARD_REASON_CONTRACT_ERROR` / `LOCAL_VIEW_GUARD_REASONS` in + * contracts/round/src/test.rs. + */ +const GUARD_REASON_TO_CONTRACT_ERROR: Record = { + already_settled: "AlreadySettled", + round_voided: "RoundVoided", + not_cleared: "NotCleared", + missing_winner: "NoValidBids", + void_not_open: "NotVoidable", + void_grace_not_elapsed: "NotVoidable", + refund_missing: null, + bidder_page_incomplete: null, + winner_mismatch: null, +}; + +interface FixtureRow { + name: string; + action: "settle" | "void"; + rule: "HighestBid" | "LowestBid"; + status: string; + grace: boolean; + bids: bigint[]; + /** Escrow the keeper could read; null when the bid state read failed. */ + keeperEscrows: (bigint | null)[]; + /** Escrow the contract actually holds (`?(N)` rows keep N here). */ + onChainEscrows: bigint[]; + revealed: boolean[]; + read: number; + winnerIdx: number; + operator: bigint; + surplus: bigint; + refunds: Array<{ idx: number; amount: bigint }>; + guardReason: string; + contract: string; +} + +function parseFixtureRows(): FixtureRow[] { + const text = fs.readFileSync(FIXTURE_PATH, "utf8"); + const rows: FixtureRow[] = []; + for (const raw of text.split(/\r?\n/)) { + const line = raw.trim(); + if (!line || line.startsWith("#") || line.startsWith("name|")) continue; + const f = line.split("|"); + assert.equal(f.length, 15, `fixture row "${line}" must have 15 fields`); + const [name, action, rule, status, grace, bidsS, escrowsS, revealedS, readS, winnerS, operatorS, surplusS, refundsS, guardReason, contract] = f; + + const keeperEscrows: (bigint | null)[] = []; + const onChainEscrows: bigint[] = []; + for (const token of escrowsS.split(",")) { + if (token.startsWith("?(") && token.endsWith(")")) { + keeperEscrows.push(null); + onChainEscrows.push(BigInt(token.slice(2, -1))); + } else { + keeperEscrows.push(BigInt(token)); + onChainEscrows.push(BigInt(token)); + } + } + + const bids = bidsS.split(",").map((bid) => BigInt(bid)); + const revealed = revealedS.split(",").map((flag) => flag === "1"); + assert.equal(bids.length, keeperEscrows.length, `${name}: bids and escrows must align`); + assert.equal(bids.length, revealed.length, `${name}: bids and revealed flags must align`); + + const refunds = + refundsS === "-" + ? [] + : refundsS.split(",").map((pair) => { + const [idx, amount] = pair.split(":"); + return { idx: Number(idx), amount: BigInt(amount) }; + }); + + rows.push({ + name, + action: action as "settle" | "void", + rule: rule as "HighestBid" | "LowestBid", + status, + grace: grace === "1", + bids, + keeperEscrows, + onChainEscrows, + revealed, + read: Number(readS), + winnerIdx: Number(winnerS), + operator: BigInt(operatorS), + surplus: BigInt(surplusS), + refunds, + guardReason, + contract, + }); + } + assert.ok( + rows.length >= 10, + `the shared settlement fixture must keep every row (read ${rows.length})`, + ); + return rows; +} + +const FIXTURE_ROWS = parseFixtureRows(); + +/** The local view the guard sees for a fixture row, truncations and all. */ +function fixtureView(row: FixtureRow): RoundSettlementView { + const nowSeconds = row.grace + ? REVEAL_DEADLINE + VOID_GRACE_SECONDS + 1 + : REVEAL_DEADLINE + 100; + const bidders: GuardBidderState[] = row.bids.slice(0, row.read).map((bid, i) => ({ + bidder: `B${i}`, + escrow: row.keeperEscrows[i] ?? null, + // An unreadable bid state hides the reveal as well: readSettlementView + // records nothing it could not read instead of guessing a value. + revealedValue: + row.keeperEscrows[i] === null ? null : row.revealed[i] ? bid : null, + settled: false, + })); + return { + roundId: "1", + status: row.status, + clearingRule: row.rule, + revealDeadline: REVEAL_DEADLINE, + nowSeconds, + bidders, + bidderTotal: row.bids.length, + winner: row.winnerIdx >= 0 ? `B${row.winnerIdx}` : null, + winningBid: row.winnerIdx >= 0 ? row.bids[row.winnerIdx] : null, + }; +} + +function refundLabels( + refunds: Array<{ bidder: string; amount: bigint }>, + row: FixtureRow, +): string[] { + return refunds.map((refund) => { + const idx = row.bids.findIndex((_bid, i) => `B${i}` === refund.bidder); + return `${idx}:${refund.amount}`; + }); +} + +describe("Shared settlement fixture (contract ⇄ guard)", () => { + it("loads every row of the fixture the contract suite reads", () => { + const names = FIXTURE_ROWS.map((row) => row.name); + assert.equal(names.length, new Set(names).size, "fixture names must be unique"); + }); + + for (const row of FIXTURE_ROWS) { + it(`${row.name}: guard verdict matches the contract`, () => { + const view = fixtureView(row); + const decision = + row.action === "settle" ? evaluateSettle(view) : evaluateVoid(view); + + if (row.guardReason === "-") { + assert.equal( + decision.allowed, + true, + `${row.name}: the guard must submit a round the contract accepts`, + ); + const plan = decision.plan; + assert.equal(plan.action, row.action, `${row.name}: action`); + assert.equal(plan.operatorPayout, row.operator, `${row.name}: operator payout`); + assert.equal(plan.winnerSurplus, row.surplus, `${row.name}: winner surplus`); + if (row.action === "settle") { + assert.equal(plan.winner, `B${row.winnerIdx}`, `${row.name}: winner`); + } else { + assert.equal(plan.winner, null, `${row.name}: a void has no winner`); + } + assert.deepEqual( + refundLabels(plan.refunds, row), + row.refunds.map((refund) => `${refund.idx}:${refund.amount}`), + `${row.name}: refund set`, + ); + } else { + assert.equal( + decision.allowed, + false, + `${row.name}: the guard must refuse what the contract would reject`, + ); + assert.equal(decision.event.reason, row.guardReason, `${row.name}: reason`); + assert.equal(decision.event.action, row.action, `${row.name}: refused action`); + assert.equal(decision.event.event, "settlement_skipped_contract"); + assert.equal(decision.event.roundId, "1"); + assert.ok(describeSettlementSkip(decision.event).includes(row.guardReason)); + } + }); + } + + it("every row the contract rejects is refused with the matching reason", () => { + for (const row of FIXTURE_ROWS) { + if (row.contract === "ok") continue; + assert.notEqual( + row.guardReason, + "-", + `${row.name}: the contract rejects with ${row.contract} — the guard must refuse too`, + ); + const mapped = GUARD_REASON_TO_CONTRACT_ERROR[row.guardReason]; + assert.ok(mapped, `${row.name}: ${row.guardReason} is not a known guard reason`); + assert.equal( + mapped, + row.contract, + `${row.name}: guard reason ${row.guardReason} must be exactly why the contract rejects`, + ); + } + }); + + it("every row the guard submits is a row the contract accepts", () => { + for (const row of FIXTURE_ROWS) { + if (row.guardReason !== "-") continue; + assert.equal( + row.contract, + "ok", + `${row.name}: the guard must never submit what the contract reverts`, + ); + } + }); + + it("a local-view refusal never claims the contract rejects on its own", () => { + for (const row of FIXTURE_ROWS) { + const mapped = GUARD_REASON_TO_CONTRACT_ERROR[row.guardReason]; + if (row.guardReason === "-" || mapped !== null) continue; + assert.equal( + row.contract, + "ok", + `${row.name}: ${row.guardReason} is the keeper's view, not a contract rule`, + ); + } + }); + + it("every guard reason in the fixture is one both suites know", () => { + for (const row of FIXTURE_ROWS) { + if (row.guardReason === "-") continue; + assert.ok( + Object.prototype.hasOwnProperty.call(GUARD_REASON_TO_CONTRACT_ERROR, row.guardReason), + `${row.name}: unknown guard reason ${row.guardReason}`, + ); + } + }); +}); + +// --------------------------------------------------------------------------- +// 5. Acceptance: the guard refuses before anything reaches the chain +// --------------------------------------------------------------------------- + +interface FakeRound { + status: string; + rule?: "HighestBid" | "LowestBid"; + revealDeadline: bigint; + bidders: string[]; + states: Record; + winner?: string | null; + winningBid?: bigint | null; + /** Bidder addresses whose bid state read throws. */ + unreadable?: string[]; + /** Bidder addresses dropped from the index page (a truncated read). */ + dropped?: string[]; +} + +function createFakeSdk(round: FakeRound) { + const calls = { settle: 0, void: 0, clear: 0 }; + const sdk = { + async getRound(_id: bigint) { + return { + status: { tag: round.status }, + reveal_round: 1n, + commit_deadline: round.revealDeadline - 3600n, + reveal_deadline: round.revealDeadline, + clearing_rule: { tag: round.rule ?? "HighestBid" }, + bidders: round.bidders, + winner: round.winner ?? undefined, + winning_bid: round.winningBid ?? undefined, + operator: "GOPERATOR", + item_ref: Buffer.alloc(32), + auditor_pubkey: Buffer.alloc(0), + }; + }, + async getBiddersPage(_id: bigint, _cursor: number, _limit: number) { + const dropped = new Set(round.dropped ?? []); + return { + data: round.bidders.filter((bidder) => !dropped.has(bidder)), + next_cursor: 0, + total: round.bidders.length, + }; + }, + async getBidState(_id: bigint, bidder: string) { + if ((round.unreadable ?? []).includes(bidder)) { + throw new Error(`HostError: BidNotFound(${bidder})`); + } + const state = round.states[bidder]; + if (!state) throw new Error(`HostError: BidNotFound(${bidder})`); + return { + commitment: Buffer.alloc(32), + escrow: state.escrow, + revealed_nonce: undefined, + revealed_value: state.revealed, + settled: false, + valid: state.revealed != null && state.revealed > 0n, + }; + }, + async settle(_id: bigint) { + calls.settle += 1; + }, + async void(_id: bigint) { + calls.void += 1; + }, + async clear(_id: bigint) { + calls.clear += 1; + return round.winner ?? undefined; + }, + async openReveal() { + throw new Error("openReveal must not run in these tests"); + }, + async *bidders(_id: bigint) { + for (const bidder of round.bidders) yield bidder; + }, + async getSeal() { + return null; + }, + async reveal() { + throw new Error("reveal must not run in these tests"); + }, + }; + return { sdk: sdk as unknown as SubRosaClient, calls }; +} + +function keeperDeps(opts: { + sdk: SubRosaClient; + clock: FakeClock; + guard: SettlementGuard; + logs?: string[]; +}) { + return { + sdk: opts.sdk, + drand: {} as DrandClient, + log: (message: string) => opts.logs?.push(message), + time: { clock: opts.clock }, + settlementGuard: opts.guard, + }; +} + +function clearedRound(overrides: Partial = {}): FakeRound { + return { + status: "Cleared", + rule: "HighestBid", + revealDeadline: BigInt(REVEAL_DEADLINE), + bidders: ["GAAA", "GBBB"], + states: { + GAAA: { escrow: 700n, revealed: 700n }, + GBBB: { escrow: 500n, revealed: 500n }, + }, + winner: "GAAA", + winningBid: 700n, + ...overrides, + }; +} + +describe("Settlement guard refuses what the contract would reject", () => { + it("does not submit a settle whose refund the keeper could not read", async () => { + const guard = createSettlementGuard(); + const clock = new FakeClock(REVEAL_DEADLINE * 1000); + const { sdk, calls } = createFakeSdk(clearedRound({ unreadable: ["GBBB"] })); + + const res = await closeRound(keeperDeps({ sdk, clock, guard }), 1n); + + assert.equal(calls.settle, 0, "a settle with a missing refund must not be submitted"); + assert.equal(res.settled, false); + assert.equal(res.guardSkip?.reason, "refund_missing"); + assert.equal(res.guardSkip?.action, "settle"); + assert.match(res.skipped.join(" "), /refund_missing/); + // The status endpoint reads the guard entry, not the close result. + assert.equal(guard.getEntry(1n)?.skip?.reason, "refund_missing"); + assert.equal(guard.getEntry(1n)?.status, "pending", "the refusal is retryable"); + }); + + it("does not submit a settle built from a truncated bidder page", async () => { + const guard = createSettlementGuard(); + const clock = new FakeClock(REVEAL_DEADLINE * 1000); + const { sdk, calls } = createFakeSdk( + clearedRound({ + bidders: ["GAAA", "GBBB", "GCCC"], + states: { + GAAA: { escrow: 700n, revealed: 700n }, + GBBB: { escrow: 500n, revealed: 500n }, + GCCC: { escrow: 500n, revealed: 500n }, + }, + dropped: ["GCCC"], + }), + ); + + const res = await closeRound(keeperDeps({ sdk, clock, guard }), 1n); + + assert.equal(calls.settle, 0, "an incomplete refund set must not be submitted"); + assert.equal(res.guardSkip?.reason, "bidder_page_incomplete"); + assert.equal(guard.getEntry(1n)?.skip?.reason, "bidder_page_incomplete"); + }); + + it("does not submit a settle whose local winner disagrees with the chain", async () => { + const guard = createSettlementGuard(); + const clock = new FakeClock(REVEAL_DEADLINE * 1000); + const { sdk, calls } = createFakeSdk( + clearedRound({ winner: "GBBB", winningBid: 500n }), + ); + + const res = await closeRound(keeperDeps({ sdk, clock, guard }), 1n); + + assert.equal(calls.settle, 0, "a winner mismatch must not be submitted"); + assert.equal(res.guardSkip?.reason, "winner_mismatch"); + assert.match(res.guardSkip!.detail, /GAAA/); + }); + + it("submits a complete, consistent round exactly once", async () => { + const guard = createSettlementGuard(); + const clock = new FakeClock(REVEAL_DEADLINE * 1000); + const { sdk, calls } = createFakeSdk(clearedRound()); + const logs: string[] = []; + const deps = keeperDeps({ sdk, clock, guard, logs }); + + const first = await closeRound(deps, 1n); + assert.equal(calls.settle, 1, "the consistent round must be submitted"); + assert.equal(first.settled, true); + assert.equal(first.guardSkip, undefined); + assert.equal(guard.getEntry(1n)?.status, "terminal"); + + // Same local view one tick later: the duplicate is suppressed, not + // resubmitted. + const second = await closeRound(deps, 1n); + assert.equal(calls.settle, 1, "a settled-in-flight round must not be submitted twice"); + assert.equal(second.settled, false); + assert.match(second.skipped.join(" "), /duplicate/); + }); + + it("does not submit a void of a fully revealed round", async () => { + const guard = createSettlementGuard(); + const clock = new FakeClock( + (REVEAL_DEADLINE + VOID_GRACE_SECONDS + 1) * 1000, + ); + const { sdk, calls } = createFakeSdk( + clearedRound({ status: "Revealing" }), + ); + + const res = await voidIfStale(keeperDeps({ sdk, clock, guard }), 1n); + + assert.equal(calls.void, 0, "a void of a revealed round must not be submitted"); + assert.equal(res.voided, false); + assert.equal(res.guardSkip?.reason, "void_not_open"); + assert.equal(res.guardSkip?.action, "void"); + assert.equal(guard.getEntry(1n)?.skip?.reason, "void_not_open"); + assert.match(res.skipped.join(" "), /void_not_open/); + }); + + it("does not submit a void of a cleared round either", async () => { + const guard = createSettlementGuard(); + const clock = new FakeClock( + (REVEAL_DEADLINE + VOID_GRACE_SECONDS + 1) * 1000, + ); + const { sdk, calls } = createFakeSdk(clearedRound()); + + const res = await voidIfStale(keeperDeps({ sdk, clock, guard }), 1n); + + assert.equal(calls.void, 0); + assert.equal(res.guardSkip?.reason, "void_not_open"); + }); + + it("does not submit a void inside the grace window", async () => { + const guard = createSettlementGuard(); + const clock = new FakeClock((REVEAL_DEADLINE + 100) * 1000); + const { sdk, calls } = createFakeSdk( + clearedRound({ status: "Open", bidders: ["GAAA"], states: { GAAA: { escrow: 700n, revealed: null } }, winner: null, winningBid: null }), + ); + + const res = await voidIfStale(keeperDeps({ sdk, clock, guard }), 1n); + + assert.equal(calls.void, 0, "an early void must not be submitted"); + assert.equal(res.guardSkip?.reason, "void_grace_not_elapsed"); + assert.equal(guard.getEntry(1n)?.skip?.reason, "void_grace_not_elapsed"); + }); + + it("does not submit a void built from a truncated bidder page", async () => { + const guard = createSettlementGuard(); + const clock = new FakeClock( + (REVEAL_DEADLINE + VOID_GRACE_SECONDS + 1) * 1000, + ); + const { sdk, calls } = createFakeSdk( + clearedRound({ + status: "Open", + bidders: ["GAAA", "GBBB", "GCCC"], + states: { + GAAA: { escrow: 700n, revealed: null }, + GBBB: { escrow: 500n, revealed: null }, + GCCC: { escrow: 500n, revealed: null }, + }, + dropped: ["GCCC"], + winner: null, + winningBid: null, + }), + ); + + const res = await voidIfStale(keeperDeps({ sdk, clock, guard }), 1n); + + assert.equal(calls.void, 0, "an incomplete void refund set must not be submitted"); + assert.equal(res.guardSkip?.reason, "bidder_page_incomplete"); + assert.equal(guard.getEntry(1n)?.skip?.reason, "bidder_page_incomplete"); + }); + + it("submits a stale open void once and only once", async () => { + const guard = createSettlementGuard(); + const clock = new FakeClock( + (REVEAL_DEADLINE + VOID_GRACE_SECONDS + 1) * 1000, + ); + const { sdk, calls } = createFakeSdk( + clearedRound({ status: "Open", bidders: ["GAAA"], states: { GAAA: { escrow: 700n, revealed: null } }, winner: null, winningBid: null }), + ); + const deps = keeperDeps({ sdk, clock, guard }); + + const first = await voidIfStale(deps, 1n); + assert.equal(calls.void, 1, "the stale round must be voided"); + assert.equal(first.voided, true); + assert.equal(guard.getEntry(1n)?.status, "terminal"); + + const second = await voidIfStale(deps, 1n); + assert.equal(calls.void, 1, "a void in flight must not be submitted twice"); + assert.equal(second.voided, false); + assert.match(second.skipped.join(" "), /duplicate/); + }); + + it("marks an already settled round terminal instead of submitting", async () => { + const guard = createSettlementGuard(); + const clock = new FakeClock(REVEAL_DEADLINE * 1000); + const { sdk, calls } = createFakeSdk(clearedRound({ status: "Settled" })); + + const res = await voidIfStale(keeperDeps({ sdk, clock, guard }), 1n); + + assert.equal(calls.void, 0); + assert.equal(res.guardSkip?.reason, "already_settled"); + assert.equal(guard.getEntry(1n)?.status, "terminal"); + assert.equal(guard.canSettle(1n).allowed, false); + }); +}); + +// --------------------------------------------------------------------------- +// 6. readSettlementView — the local view is exactly what the guard sees +// --------------------------------------------------------------------------- + +describe("readSettlementView", () => { + it("keeps a truncated index visible as a shorter bidder list", async () => { + const { sdk } = createFakeSdk( + clearedRound({ + bidders: ["GAAA", "GBBB", "GCCC"], + states: { + GAAA: { escrow: 700n, revealed: 700n }, + GBBB: { escrow: 500n, revealed: 500n }, + GCCC: { escrow: 500n, revealed: 500n }, + }, + dropped: ["GCCC"], + }), + ); + + const view = await readSettlementView(sdk, 1n, REVEAL_DEADLINE); + assert.equal(view.bidderTotal, 3, "the contract still reports 3 bidders"); + assert.equal(view.bidders.length, 2, "the keeper only read 2"); + assert.equal(view.status, "Cleared"); + assert.equal(view.winner, "GAAA"); + assert.equal(view.winningBid, 700n); + assert.equal(view.clearingRule, "HighestBid"); + }); + + it("records an unreadable bid state instead of dropping the bidder", async () => { + const { sdk } = createFakeSdk(clearedRound({ unreadable: ["GBBB"] })); + + const view = await readSettlementView(sdk, 1n, REVEAL_DEADLINE); + assert.equal(view.bidders.length, 2); + assert.deepEqual(view.bidders[1], { + bidder: "GBBB", + escrow: null, + revealedValue: null, + settled: false, + }); + assert.equal(evaluateSettle(view).allowed, false); + }); + + it("reads a complete round as the contract would settle it", async () => { + const { sdk } = createFakeSdk(clearedRound()); + const view = await readSettlementView(sdk, 1n, REVEAL_DEADLINE); + const decision = evaluateSettle(view); + assert.equal(decision.allowed, true); + assert.equal(decision.plan.winner, "GAAA"); + assert.equal(decision.plan.operatorPayout, 700n); + assert.equal(decision.plan.winnerSurplus, 0n); + assert.deepEqual(decision.plan.refunds, [{ bidder: "GBBB", amount: 500n }]); + }); +}); + +// --------------------------------------------------------------------------- +// 7. Contract rules with no fixture row of their own +// --------------------------------------------------------------------------- + +function bareView(overrides: Partial): RoundSettlementView { + return { + roundId: "1", + status: "Cleared", + clearingRule: "HighestBid", + revealDeadline: REVEAL_DEADLINE, + nowSeconds: REVEAL_DEADLINE + VOID_GRACE_SECONDS + 1, + bidders: [], + bidderTotal: 0, + winner: null, + winningBid: null, + ...overrides, + }; +} + +describe("Contract rules the fixture cannot express", () => { + it("refuses a settle while the round is not Cleared", () => { + const decision = evaluateSettle(bareView({ status: "Revealing" })); + assert.equal(decision.allowed, false); + assert.equal(decision.event.reason, "not_cleared"); + }); + + it("refuses a settle with no winner on chain", () => { + const decision = evaluateSettle( + bareView({ status: "Cleared", winner: null, winningBid: null }), + ); + assert.equal(decision.allowed, false); + assert.equal(decision.event.reason, "missing_winner"); + }); + + it("refuses a settle of an already settled round and marks it terminal", () => { + const guard = createSettlementGuard(); + const decision = guard.checkSettle(bareView({ status: "Settled" })); + assert.equal(decision.allowed, false); + assert.equal(decision.event.event, "settlement_skipped_contract"); + if (decision.event.event === "settlement_skipped_contract") { + assert.equal(decision.event.reason, "already_settled"); + } + assert.equal(guard.getEntry(1n)?.status, "terminal"); + assert.equal(guard.getEntry(1n)?.skip?.reason, "already_settled"); + }); + + it("refuses a settle of a voided round", () => { + const decision = evaluateSettle(bareView({ status: "Voided" })); + assert.equal(decision.allowed, false); + assert.equal(decision.event.reason, "round_voided"); + }); + + it("refuses a void of a voided round and marks it terminal", () => { + const guard = createSettlementGuard(); + const decision = guard.checkVoid(bareView({ status: "Voided" })); + assert.equal(decision.allowed, false); + if (decision.event.event === "settlement_skipped_contract") { + assert.equal(decision.event.reason, "round_voided"); + } + assert.equal(guard.getEntry(1n)?.status, "terminal"); + }); + + it("refuses a void of a settled round", () => { + const guard = createSettlementGuard(); + const decision = guard.checkVoid(bareView({ status: "Settled" })); + assert.equal(decision.allowed, false); + if (decision.event.event === "settlement_skipped_contract") { + assert.equal(decision.event.reason, "already_settled"); + } + assert.equal(guard.getEntry(1n)?.status, "terminal"); + }); + + it("accepts a void exactly one second after the grace window closes", () => { + const open = bareView({ + status: "Open", + nowSeconds: REVEAL_DEADLINE + VOID_GRACE_SECONDS, + }); + const refused = evaluateVoid(open); + assert.equal(refused.allowed, false); + assert.equal(refused.event.reason, "void_grace_not_elapsed"); + + const allowed = evaluateVoid({ ...open, nowSeconds: open.nowSeconds + 1 }); + assert.equal(allowed.allowed, true, "the contract accepts at deadline + grace + 1"); + assert.deepEqual(allowed.plan.refunds, []); + }); + + it("expectedWinner follows the clearing rule and ignores unrevealed bids", () => { + const bidders: GuardBidderState[] = [ + { bidder: "B0", escrow: 700n, revealedValue: null, settled: false }, + { bidder: "B1", escrow: 500n, revealedValue: 500n, settled: false }, + { bidder: "B2", escrow: 100n, revealedValue: 0n, settled: false }, + { bidder: "B3", escrow: 900n, revealedValue: 900n, settled: false }, + ]; + assert.deepEqual( + expectedWinner(bareView({ bidders, bidderTotal: 4 })), + { bidder: "B3", value: 900n }, + ); + assert.deepEqual( + expectedWinner( + bareView({ bidders, bidderTotal: 4, clearingRule: "LowestBid" }), + ), + { bidder: "B1", value: 500n }, + ); + assert.equal( + expectedWinner( + bareView({ + bidders: [{ bidder: "B0", escrow: null, revealedValue: 700n, settled: false }], + bidderTotal: 1, + }), + ), + null, + "an unreadable bid state cannot win a round the keeper cannot price", + ); + }); }); \ No newline at end of file diff --git a/services/keeper/src/settlement-guard.ts b/services/keeper/src/settlement-guard.ts index 4ea45172..4a6d483d 100644 --- a/services/keeper/src/settlement-guard.ts +++ b/services/keeper/src/settlement-guard.ts @@ -1,7 +1,9 @@ // Copyright (c) 2026 Sub Rosa contributors // settlement-guard.ts // -// In-memory duplicate-settlement suppression for the keeper. +// In-memory duplicate-settlement suppression for the keeper, plus the round +// contract's own settle/void rules so the keeper never submits a transaction +// the contract would revert. // // A keeper may observe the same round across many polling cycles. Without // this guard it would attempt to settle an already-submitted (or terminal) @@ -15,11 +17,22 @@ // Only "pending" rounds are allowed to proceed to settlement. Submitted and // terminal rounds are skipped with a structured log event that carries a // `skippedDuplicateReason` field so it is searchable in structured logs. +// +// On top of that state machine the guard mirrors the contract rules in +// `contracts/round/src/lib.rs` — status guards, winner selection, and the +// refund set — against the keeper's local view of a round. When the local +// view would produce a settle or a void the contract rejects (or cannot be +// verified at all), the guard refuses the submission and records a typed +// reason the status endpoint shows. +import type { SubRosaClient } from "@sub-rosa/sdk"; import { systemClock, type Clock } from "@sub-rosa/time"; export type SettlementGuardStatus = "pending" | "submitted" | "terminal"; +/** Lifecycle action the keeper asked the guard to authorize. */ +export type SettlementAction = "settle" | "void"; + export interface SettlementGuardEntry { roundId: bigint; status: SettlementGuardStatus; @@ -27,6 +40,8 @@ export interface SettlementGuardEntry { updatedAt: string; /** Human-readable reason recorded when the entry was last updated. */ reason: string; + /** Most recent contract-rule refusal, if the guard declined to submit. */ + skip?: GuardSkipRecord; } /** Structured event emitted when a duplicate settlement is suppressed. */ @@ -38,6 +53,113 @@ export interface DuplicateSkipEvent { lastReason: string; } +/** Matches `VOID_GRACE` in the Round contract (seconds after reveal_deadline). */ +export const VOID_GRACE_SECONDS = 3600; + +/** Unix seconds after which the contract accepts a void for this round. */ +export function voidAfter(revealDeadline: number): number { + return revealDeadline + VOID_GRACE_SECONDS; +} + +/** Clearing rule tag as the contract records it on the round. */ +export type ClearingRuleTag = "HighestBid" | "LowestBid"; + +/** + * One bidder as the keeper's local view knows it. `escrow: null` means the + * bid state could not be read, so the refund the contract would pay this + * bidder cannot be predicted. + */ +export interface GuardBidderState { + bidder: string; + /** Escrow locked at commit; null when the state read failed. */ + escrow: bigint | null; + /** Revealed value; null when the bid is not revealed (or unreadable). */ + revealedValue: bigint | null; + /** True once the contract has already paid this bidder. */ + settled: boolean; +} + +/** + * The keeper's local snapshot of a round, exactly as it will be submitted. + * Every field maps to state the contract reads when it evaluates `settle` or + * `void`. + */ +export interface RoundSettlementView { + roundId: string; + /** On-chain status tag: Open | Revealing | Cleared | Settled | Voided. */ + status: string; + clearingRule: ClearingRuleTag; + /** Reveal deadline in unix seconds. */ + revealDeadline: number; + /** Keeper clock in unix seconds, used for the void grace window. */ + nowSeconds: number; + /** The part of the ordered bidder index the keeper actually read. */ + bidders: readonly GuardBidderState[]; + /** Bidder count the contract reports for the round. */ + bidderTotal: number; + /** Winner recorded on-chain by `clear()`; null while nobody won. */ + winner: string | null; + /** Winning bid recorded on-chain by `clear()`; null while not cleared. */ + winningBid: bigint | null; +} + +/** + * Typed refusals. The names mirror what the contract would have rejected: + * `not_cleared` is `Error::NotCleared`, `void_not_open` is `Error::NotVoidable`, + * and so on — the guard simply decides before paying for a failed transaction. + */ +export type ContractSkipReason = + | "already_settled" + | "round_voided" + | "not_cleared" + | "missing_winner" + | "bidder_page_incomplete" + | "refund_missing" + | "winner_mismatch" + | "void_not_open" + | "void_grace_not_elapsed"; + +/** Structured event emitted when a submission fails a contract rule. */ +export interface ContractSkipEvent { + event: "settlement_skipped_contract"; + roundId: string; + action: SettlementAction; + reason: ContractSkipReason; + detail: string; +} + +export type SettlementSkipEvent = DuplicateSkipEvent | ContractSkipEvent; + +/** What the contract will move if it accepts this action. */ +export interface SettlementPlan { + action: SettlementAction; + /** Winning bidder for a settle; null for a void. */ + winner: string | null; + /** Escrow the contract pays the operator (0 for a void). */ + operatorPayout: bigint; + /** Winner surplus returned on settle (0 for a void). */ + winnerSurplus: bigint; + /** Every other escrow the contract returns, in bidder index order. */ + refunds: Array<{ bidder: string; amount: bigint }>; +} + +export type ContractDecision = + | { allowed: true; plan: SettlementPlan } + | { allowed: false; event: ContractSkipEvent }; + +export type SettlementCheck = + | { allowed: true; plan: SettlementPlan } + | { allowed: false; event: SettlementSkipEvent }; + +/** Typed refusal, stored on the guard entry and served by the status API. */ +export interface GuardSkipRecord { + action: SettlementAction; + reason: ContractSkipReason; + detail: string; + /** ISO-8601 timestamp of the refusal. */ + at: string; +} + export interface SettlementGuard { /** * Check whether settlement may proceed for this round. @@ -50,6 +172,18 @@ export interface SettlementGuard { roundId: bigint, ): { allowed: true } | { allowed: false; event: DuplicateSkipEvent }; + /** + * Contract-rule check before dispatching a settle: duplicate suppression + * first, then the winner/refund rules the contract enforces. + * + * A refusal records a typed reason on the entry (`getEntry(...).skip`) so + * the status endpoint can show why nothing was submitted. + */ + checkSettle(view: RoundSettlementView): SettlementCheck; + + /** Contract-rule check before dispatching a void. */ + checkVoid(view: RoundSettlementView): SettlementCheck; + /** Call immediately before dispatching the settle transaction. */ markSubmitted(roundId: bigint): void; @@ -73,6 +207,280 @@ export interface SettlementGuard { entries(): SettlementGuardEntry[]; } +/** One page of the bidder index at a time, so a truncated read is visible. */ +const BIDDER_PAGE_SIZE = 100; + +/** + * The winner the contract would pick from these revealed bids: only revealed, + * positive, fully-read bids participate, and the first bidder wins a tie — + * exactly the loop in `SubRosaRound::clear`. + */ +export function expectedWinner( + view: RoundSettlementView, +): { bidder: string; value: bigint } | null { + let best: { bidder: string; value: bigint } | null = null; + for (const state of view.bidders) { + if (state.escrow === null || state.revealedValue === null) continue; + if (state.revealedValue <= 0n) continue; + if (best === null) { + best = { bidder: state.bidder, value: state.revealedValue }; + continue; + } + const better = + view.clearingRule === "LowestBid" + ? state.revealedValue < best.value + : state.revealedValue > best.value; + if (better) best = { bidder: state.bidder, value: state.revealedValue }; + } + return best; +} + +/** + * The escrow the contract returns for a settle, mirroring `SubRosaRound::settle` + * and the winner's surplus: the winner pays `winningBid` to the operator and + * gets `escrow - winningBid` back, every other bidder gets their escrow. + */ +export function settleRefunds( + view: RoundSettlementView, + winner: string, + winningBid: bigint, +): { refunds: Array<{ bidder: string; amount: bigint }>; winnerSurplus: bigint } { + const refunds: Array<{ bidder: string; amount: bigint }> = []; + let winnerSurplus = 0n; + for (const state of view.bidders) { + if (state.settled || state.escrow === null) continue; + if (state.bidder === winner) { + const surplus = state.escrow - winningBid; + winnerSurplus = surplus > 0n ? surplus : 0n; + } else if (state.escrow > 0n) { + refunds.push({ bidder: state.bidder, amount: state.escrow }); + } + } + return { refunds, winnerSurplus }; +} + +/** The escrow `SubRosaRound::void` returns: every unsettled escrow, in order. */ +export function voidRefunds( + view: RoundSettlementView, +): Array<{ bidder: string; amount: bigint }> { + const refunds: Array<{ bidder: string; amount: bigint }> = []; + for (const state of view.bidders) { + if (state.settled || state.escrow === null) continue; + if (state.escrow > 0n) refunds.push({ bidder: state.bidder, amount: state.escrow }); + } + return refunds; +} + +function refuse( + view: RoundSettlementView, + action: SettlementAction, + reason: ContractSkipReason, + detail: string, +): ContractDecision { + return { + allowed: false, + event: { + event: "settlement_skipped_contract", + roundId: view.roundId, + action, + reason, + detail, + }, + }; +} + +/** + * Would the contract accept a settle of this view? Mirrors the checks in + * `SubRosaRound::settle` (status, then winner) and adds the two completeness + * checks a local view needs before it can promise the refund set. + */ +export function evaluateSettle(view: RoundSettlementView): ContractDecision { + if (view.status === "Settled") { + return refuse(view, "settle", "already_settled", "the contract rejects settle on a Settled round"); + } + if (view.status === "Voided") { + return refuse( + view, + "settle", + "round_voided", + "the contract rejects settle on a Voided round (escrow was refunded at clear)", + ); + } + if (view.status !== "Cleared") { + return refuse(view, "settle", "not_cleared", `the contract rejects settle while the round is ${view.status}`); + } + if (view.winner === null) { + return refuse(view, "settle", "missing_winner", "the contract rejects settle when no bid won (NoValidBids)"); + } + if (view.bidders.length < view.bidderTotal) { + return refuse( + view, + "settle", + "bidder_page_incomplete", + `read ${view.bidders.length} of ${view.bidderTotal} bidders; the refund set would be incomplete`, + ); + } + for (const state of view.bidders) { + if (state.escrow === null) { + return refuse( + view, + "settle", + "refund_missing", + `escrow for ${state.bidder} is unreadable; its refund cannot be verified`, + ); + } + } + const expected = expectedWinner(view); + const onChainBid = view.winningBid; + if (expected === null || expected.bidder !== view.winner || onChainBid === null || expected.value !== onChainBid) { + return refuse( + view, + "settle", + "winner_mismatch", + `local winner ${expected ? `${expected.bidder}=${expected.value}` : "none"} does not match ` + + `on-chain winner ${view.winner}=${onChainBid ?? "unset"}`, + ); + } + const { refunds, winnerSurplus } = settleRefunds(view, view.winner, onChainBid); + return { + allowed: true, + plan: { + action: "settle", + winner: view.winner, + operatorPayout: onChainBid, + winnerSurplus, + refunds, + }, + }; +} + +/** + * Would the contract accept a void of this view? Mirrors the checks in + * `SubRosaRound::void`: the round must still be Open, the grace window after + * the reveal deadline must have elapsed, and — as for settle — the local view + * must cover the whole bidder index so the refund set is complete. + */ +export function evaluateVoid(view: RoundSettlementView): ContractDecision { + if (view.status === "Voided") { + return refuse(view, "void", "round_voided", "the contract rejects void on a Voided round"); + } + if (view.status === "Settled") { + return refuse(view, "void", "already_settled", "the contract rejects void on a Settled round"); + } + if (view.status !== "Open") { + return refuse( + view, + "void", + "void_not_open", + `the contract rejects void while the round is ${view.status} (void needs Open)`, + ); + } + const opensAt = voidAfter(view.revealDeadline); + if (view.nowSeconds <= opensAt) { + return refuse( + view, + "void", + "void_grace_not_elapsed", + `void opens after ${opensAt} (reveal deadline ${view.revealDeadline} + ${VOID_GRACE_SECONDS}s grace)`, + ); + } + if (view.bidders.length < view.bidderTotal) { + return refuse( + view, + "void", + "bidder_page_incomplete", + `read ${view.bidders.length} of ${view.bidderTotal} bidders; the refund set would be incomplete`, + ); + } + for (const state of view.bidders) { + if (state.escrow === null) { + return refuse( + view, + "void", + "refund_missing", + `escrow for ${state.bidder} is unreadable; its refund cannot be verified`, + ); + } + } + return { + allowed: true, + plan: { + action: "void", + winner: null, + operatorPayout: 0n, + winnerSurplus: 0n, + refunds: voidRefunds(view), + }, + }; +} + +/** Human-readable line for logs, store `lastError` fields, and skip lists. */ +export function describeSettlementSkip(event: SettlementSkipEvent): string { + if (event.event === "settlement_skipped_duplicate") { + return `duplicate ${event.skippedDuplicateReason}: ${event.lastReason}`; + } + return `${event.action} refused (${event.reason}): ${event.detail}`; +} + +/** + * Build the local view the guard evaluates, straight from the contract. + * + * The bidder index is read page by page so a truncated read stays visible as + * `bidders.length < bidderTotal`, and a bid state that cannot be read is kept + * as `escrow: null` instead of being dropped — both are refusals, never a + * silently smaller refund set. Index or page failures propagate; a bid state + * failure is recorded as unread so the guard can refuse with a typed reason. + */ +export async function readSettlementView( + reader: Pick, + roundId: bigint, + nowSeconds: number, +): Promise { + const round = await reader.getRound(roundId); + let total = round.bidders?.length ?? 0; + const index: string[] = []; + try { + let cursor = 0; + for (;;) { + const page = await reader.getBiddersPage(roundId, cursor, BIDDER_PAGE_SIZE); + total = page.total; + for (const bidder of page.data) index.push(bidder); + if (page.next_cursor === 0 || index.length >= total) break; + cursor = page.next_cursor; + } + } catch { + // Keep the bidders read so far: an incomplete page must be refused, not + // silently rounded up to a refund set the keeper never looked at. + } + + const bidders: GuardBidderState[] = []; + for (const bidder of index) { + try { + const state = await reader.getBidState(roundId, bidder); + bidders.push({ + bidder, + escrow: BigInt(state.escrow), + revealedValue: state.revealed_value == null ? null : BigInt(state.revealed_value), + settled: Boolean(state.settled), + }); + } catch { + bidders.push({ bidder, escrow: null, revealedValue: null, settled: false }); + } + } + + return { + roundId: roundId.toString(), + status: round.status.tag, + clearingRule: round.clearing_rule?.tag === "LowestBid" ? "LowestBid" : "HighestBid", + revealDeadline: Number(round.reveal_deadline), + nowSeconds, + bidders, + bidderTotal: total, + winner: round.winner ?? null, + winningBid: round.winning_bid == null ? null : BigInt(round.winning_bid), + }; +} + function now(clock: Clock): string { return clock.toISOString(); } @@ -99,21 +507,64 @@ export function createSettlementGuard(clock: Clock = systemClock): SettlementGua return entries.get(roundId)!; } + function canSettle( + roundId: bigint, + ): { allowed: true } | { allowed: false; event: DuplicateSkipEvent } { + const entry = getOrCreate(roundId); + if (entry.status === "pending") { + return { allowed: true }; + } + return { + allowed: false, + event: { + event: "settlement_skipped_duplicate", + roundId: roundId.toString(), + skippedDuplicateReason: entry.status, + lastReason: entry.reason, + }, + }; + } + + function check(action: SettlementAction, view: RoundSettlementView): SettlementCheck { + const roundId = BigInt(view.roundId); + const entry = getOrCreate(roundId); + + // Duplicate suppression first: a round already in flight or already done + // is refused before any contract rule is evaluated. + const duplicate = canSettle(roundId); + if (!duplicate.allowed) return duplicate; + + const decision = action === "settle" ? evaluateSettle(view) : evaluateVoid(view); + if (decision.allowed) { + entry.skip = undefined; + return decision; + } + entry.skip = { + action, + reason: decision.event.reason, + detail: decision.event.detail, + at: now(clock), + }; + entry.updatedAt = now(clock); + entry.reason = `${action} refused: ${decision.event.reason}`; + // A refusal that says the round is already settled or already voided is + // also a statement that the round is done — record it as terminal so the + // keeper stops scheduling work for it, while `skip` keeps the typed reason. + if (decision.event.reason === "already_settled" || decision.event.reason === "round_voided") { + entry.status = "terminal"; + } + return decision; + } + return { - canSettle(roundId) { - const entry = getOrCreate(roundId); - if (entry.status === "pending") { - return { allowed: true }; - } - return { - allowed: false, - event: { - event: "settlement_skipped_duplicate", - roundId: roundId.toString(), - skippedDuplicateReason: entry.status, - lastReason: entry.reason, - }, - }; + canSettle, + + checkSettle(view) { + return check("settle", view); + }, + + checkVoid(view) { + return check("void", view); }, markSubmitted(roundId) { @@ -121,6 +572,7 @@ export function createSettlementGuard(clock: Clock = systemClock): SettlementGua entry.status = "submitted"; entry.updatedAt = now(clock); entry.reason = "settle tx dispatched"; + entry.skip = undefined; }, markTerminal(roundId, reason) { @@ -128,6 +580,8 @@ export function createSettlementGuard(clock: Clock = systemClock): SettlementGua entry.status = "terminal"; entry.updatedAt = now(clock); entry.reason = reason; + // `skip` is kept: it is the last contract-rule refusal for this round, + // which is exactly what the status endpoint should keep showing. }, markRetryable(roundId, reason) { @@ -147,4 +601,4 @@ export function createSettlementGuard(clock: Clock = systemClock): SettlementGua return [...entries.values()]; }, }; -} \ No newline at end of file +} diff --git a/services/keeper/src/status-server.ts b/services/keeper/src/status-server.ts index ca80a97f..a66fbf62 100644 --- a/services/keeper/src/status-server.ts +++ b/services/keeper/src/status-server.ts @@ -20,6 +20,8 @@ export interface StatusServerConfig { drand: DrandClient; storeRounds: () => import("./store.js").WatchedRound[]; settleIndicator?: (roundId: bigint) => import("./status.js").SettlementIndicator; + /** Typed settlement-guard refusal for a round, if the guard held it back. */ + guardSkip?: (roundId: bigint) => import("./settlement-guard.js").GuardSkipRecord | null; epochMs?: number; } @@ -60,6 +62,7 @@ function makeRoutes(src: BuildStatusSource): Route[] { network: src.network, epochMs: src.epochMs, settleIndicator: src.settleIndicator, + guardSkip: src.guardSkip, }); return [ @@ -170,6 +173,7 @@ export function createStatusServer(config: StatusServerConfig): http.Server { contractId: config.contractId, network: config.network, settleIndicator: config.settleIndicator, + guardSkip: config.guardSkip, epochMs: config.epochMs ?? systemClock.nowMs(), }; diff --git a/services/keeper/src/status.test.ts b/services/keeper/src/status.test.ts index 5de9c9dd..21105e1c 100644 --- a/services/keeper/src/status.test.ts +++ b/services/keeper/src/status.test.ts @@ -9,6 +9,7 @@ import { checkHealth, type BuildStatusSource, } from "./status.js"; +import type { GuardSkipRecord } from "./settlement-guard.js"; import type { WatchedRound } from "./store.js"; const TEST_NOW_SECONDS = createFakeTime(1_700_000_000_000).clock.nowSeconds(); @@ -264,6 +265,59 @@ describe("buildRoundStatus — settled round", () => { }); }); +// --------------------------------------------------------------------------- +// Settlement guard refusal (Issue #385) +// --------------------------------------------------------------------------- + +describe("buildRoundStatus — settlement guard refusal", () => { + it("surfaces the typed reason the guard refused to submit", async () => { + const now = TEST_NOW_SECONDS; + const skip: GuardSkipRecord = { + action: "settle", + reason: "refund_missing", + detail: "escrow for GBBB is unreadable; its refund cannot be verified", + at: "2026-09-30T00:00:00.000Z", + }; + const source = makeSource({ + reader: readerOk({ + status: "Cleared", + revealRound: 1, + commitDeadline: now - 7200, + revealDeadline: now - 3600, + bidders: ["GAAA", "GBBB"], + winner: "GAAA", + winningBid: 700n, + }), + storeRounds: () => [ + { roundId: "4", lastStatus: "Cleared", retryCount: 0 }, + ] as WatchedRound[], + settleIndicator: () => "pending", + guardSkip: (roundId) => (roundId === 4n ? skip : null), + }); + + const res = await buildKeeperStatus(source); + const r = res.rounds[0]; + assert.deepEqual(r.guardSkip, skip, "the full refusal record is served"); + assert.equal( + r.guardSkipIndicator, + "settle refused: refund_missing", + "the compact indicator names the action and the typed reason", + ); + }); + + it("reports no refusal when the guard let the submission through", async () => { + const source = makeSource({ + storeRounds: () => [ + { roundId: "5", lastStatus: "Cleared", retryCount: 0 }, + ] as WatchedRound[], + guardSkip: () => null, + }); + const res = await buildKeeperStatus(source); + assert.equal(res.rounds[0].guardSkip, null); + assert.equal(res.rounds[0].guardSkipIndicator, null); + }); +}); + // --------------------------------------------------------------------------- // Upstream failure states // --------------------------------------------------------------------------- diff --git a/services/keeper/src/status.ts b/services/keeper/src/status.ts index bcd1651d..6a030b01 100644 --- a/services/keeper/src/status.ts +++ b/services/keeper/src/status.ts @@ -13,6 +13,7 @@ import { } from "@sub-rosa/time"; import { decideKeeperDryRunAction, type KeeperDryRunPhase } from "./dry-run.js"; +import { VOID_GRACE_SECONDS, type GuardSkipRecord } from "./settlement-guard.js"; import type { WatchedRound } from "./store.js"; export type RoundStatus = @@ -26,6 +27,12 @@ export type RoundStatus = export type SettlementIndicator = "pending" | "submitted" | "terminal" | "none"; +/** One-line rendering of a guard refusal, e.g. `settle refused: refund_missing`. */ +export function guardSkipIndicator(skip: GuardSkipRecord | null): string | null { + if (!skip) return null; + return `${skip.action} refused: ${skip.reason}`; +} + export interface RoundStatusView { roundId: string; status: RoundStatus; @@ -44,6 +51,13 @@ export interface RoundStatusView { winningValue: string | null; clearingRule: "HighestBid" | "LowestBid" | null; settlement: SettlementIndicator; + /** + * The last contract rule the settlement guard refused, if any: a round held + * back because submitting it would have been rejected on-chain. + */ + guardSkip: GuardSkipRecord | null; + /** {@link guardSkipIndicator} for `guardSkip` — compact, log-friendly. */ + guardSkipIndicator: string | null; lastKeeperAction: string | null; lastError: string | null; retryCount: number; @@ -76,6 +90,7 @@ export interface BuildRoundStatusArgs { clock?: Clock; settlement?: SettlementIndicator; watched?: WatchedRound; + guardSkip?: GuardSkipRecord | null; } export interface BuildStatusSource { @@ -88,12 +103,12 @@ export interface BuildStatusSource { epochMs?: number; nowSeconds?: number; settleIndicator?: (roundId: bigint) => SettlementIndicator; + /** Typed reason the settlement guard last refused, for each round. */ + guardSkip?: (roundId: bigint) => GuardSkipRecord | null; /** Injectable wall clock. Default: systemClock. */ time?: PartialTimeContext; } -const VOID_GRACE_SECONDS = 3600; - async function countRevealed( reader: StatusReader, roundId: bigint, @@ -116,6 +131,7 @@ export async function buildRoundStatus( const clock = args.clock ?? systemClock; const nowSeconds = args.nowSeconds ?? clock.nowSeconds(); const ridStr = roundId.toString(); + const guardSkip = args.guardSkip ?? null; let round; try { @@ -141,6 +157,8 @@ export async function buildRoundStatus( winningValue: null, clearingRule: null, settlement, + guardSkip, + guardSkipIndicator: guardSkipIndicator(guardSkip), lastKeeperAction: watched?.lastAction ?? null, lastError: watched?.lastError ? publicErrorMessage(watched.lastError) : null, retryCount: watched?.retryCount ?? 0, @@ -198,6 +216,8 @@ export async function buildRoundStatus( winningValue: round.winning_bid == null ? null : round.winning_bid.toString(), clearingRule: round.clearing_rule?.tag ?? null, settlement: settlementIndicator, + guardSkip, + guardSkipIndicator: guardSkipIndicator(guardSkip), lastKeeperAction: watched?.lastAction ?? null, lastError: watched?.lastError ? publicErrorMessage(watched.lastError) : null, retryCount: watched?.retryCount ?? 0, @@ -225,6 +245,7 @@ export async function buildKeeperStatus(source: BuildStatusSource): Promise = { + GAAA: { escrow: 700n, revealed_value: 700n }, + GBBB: { escrow: 500n, revealed_value: 500n }, + }; const sdk = { async getRound(id: bigint) { if (id !== 1n) { @@ -81,7 +90,25 @@ function createSdk(chain: FakeChain, label: string, options: FakeSdkOptions = {} status: { tag: chain.status }, reveal_round: "1", reveal_deadline: "0", - winner: null, + commit_deadline: "0", + bidders, + winner: "GAAA", + winning_bid: 700n, + clearing_rule: { tag: "HighestBid" }, + }; + }, + async getBiddersPage(_id: bigint, _cursor: number, _limit: number) { + return { data: bidders, next_cursor: 0, total: bidders.length }; + }, + async getBidState(_id: bigint, bidder: string) { + const s = state[bidder]; + if (!s) throw new Error(`HostError: BidNotFound(${bidder})`); + return { + escrow: s.escrow, + revealed_value: s.revealed_value, + revealed_nonce: 1n, + settled: false, + valid: true, }; }, async settle(_id: bigint) { @@ -102,9 +129,6 @@ function createSdk(chain: FakeChain, label: string, options: FakeSdkOptions = {} async bidders() { throw new Error("bidders must not run for a Cleared round"); }, - async getBidState() { - throw new Error("getBidState must not run for a Cleared round"); - }, async getSeal() { return null; }, diff --git a/services/keeper/src/watch-loop.ts b/services/keeper/src/watch-loop.ts index 1823b289..600772f3 100644 --- a/services/keeper/src/watch-loop.ts +++ b/services/keeper/src/watch-loop.ts @@ -122,7 +122,7 @@ export async function runWatchLoop(params: RunWatchLoopParams): Promise { const resolvedTime = resolveTimeContext(systemTime, time); const { clock, scheduler } = resolvedTime; - const deps: KeeperDeps = { sdk, drand, log, time: resolvedTime }; + const deps: KeeperDeps = { sdk, drand, log, time: resolvedTime, settlementGuard }; const owner = explicitOwner?.trim() || generateLeaseOwner(); while (!isStopping()) { @@ -167,12 +167,6 @@ export async function runWatchLoop(params: RunWatchLoopParams): Promise { continue; } try { - const canSettleCheck = settlementGuard.canSettle(roundId); - if (!canSettleCheck.allowed) { - // Settlement already in-flight or terminal; skip the close phase. - // The keep phase may still open/reveal; we let watchRound proceed but - // settle manipulation is avoided by the guard's skip marker. - } const tick = await watchRound(deps, roundId); const active = tick.finalStatus !== "Settled" && tick.finalStatus !== "Voided"; @@ -189,6 +183,16 @@ export async function runWatchLoop(params: RunWatchLoopParams): Promise { settlementGuard.markTerminal(roundId, "voided on-chain"); } + // The guard refused a submission the contract would have rejected. + // Logged even though nothing was submitted (so `acted` stays false). + const refusal = tick.close?.guardSkip ?? tick.void?.guardSkip; + if (refusal) { + log( + `[round ${roundId}] settlement_skipped_contract ${refusal.action}: ` + + `${refusal.reason} — ${refusal.detail}`, + ); + } + store.updateRound(roundId, { lastStatus: tick.finalStatus, retryCount: 0,