From fb62dad1b1626cd72deb9af1599fb21ebd399740 Mon Sep 17 00:00:00 2001 From: xtep103 Date: Fri, 11 Sep 2026 17:47:16 +0100 Subject: [PATCH 1/7] fix(tholos): account for fee-on-transfer tokens --- contracts/tholos/src/lib.rs | 69 +- contracts/tholos/src/test.rs | 180 +++++ ...ransfer_dispute_uses_actual_deposit.1.json | 529 +++++++++++++++ ...fee_on_transfer_records_actual_bond.1.json | 466 +++++++++++++ ...sfer_resolve_uses_available_balance.1.json | 627 ++++++++++++++++++ 5 files changed, 1857 insertions(+), 14 deletions(-) create mode 100644 contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json create mode 100644 contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json create mode 100644 contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json diff --git a/contracts/tholos/src/lib.rs b/contracts/tholos/src/lib.rs index 07f6171..d76ff03 100644 --- a/contracts/tholos/src/lib.rs +++ b/contracts/tholos/src/lib.rs @@ -243,6 +243,7 @@ pub enum Error { /// slot without any economic risk (they receive both bonds back regardless /// of the resolver vote), nullifying the bond-forfeiture deterrent. SelfDispute = 22, +<<<<<<< HEAD NoAdminRotationProposal = 23, /// `reclaim_stalled_dispute` was called on an assertion whose dispute /// opened without a stall timeout configured (0 = fallback disabled), or @@ -259,6 +260,10 @@ pub enum Error { /// assertion's asserter or disputer. A party voting on their own case /// biases (and, on a size-1 committee, determines) the outcome. SelfVote = 27, +======= + /// The token transfer did not result in the expected balance change. + TokenTransferMismatch = 23, +>>>>>>> 2dc2e65 (fix(tholos): account for fee-on-transfer tokens) } const DAY_IN_LEDGERS: u32 = 17280; @@ -970,6 +975,29 @@ impl Tholos { Ok(()) } + fn transfer_in( + env: &Env, + token_client: &token::Client, + from: &Address, + amount: i128, + ) -> Result { + let contract = env.current_contract_address(); + let balance_before = token_client.balance(&contract); + + token_client.transfer(from, &contract, &amount); + + let balance_after = token_client.balance(&contract); + let received = balance_after + .checked_sub(balance_before) + .ok_or(Error::TokenTransferMismatch)?; + + if received <= 0 { + return Err(Error::TokenTransferMismatch); + } + + Ok(received) + } + /// Posts a bonded claim about an outcome. Returns the new assertion id. pub fn assert_outcome(env: Env, asserter: Address, outcome: bool) -> Result { Self::require_not_paused(&env)?; @@ -983,7 +1011,7 @@ impl Tholos { // transfer can't be allocated the same not-yet-incremented id. let id: u64 = Self::get(&env, &DataKey::NextId)?; env.storage().instance().set(&DataKey::NextId, &(id + 1)); - let assertion = Assertion { + let mut assertion = Assertion { asserter: asserter.clone(), final_outcome: None, outcome, @@ -1001,11 +1029,13 @@ impl Tholos { Self::set_assertion(&env, id, &assertion); let token_id: Address = Self::get(&env, &DataKey::Token)?; - token::Client::new(&env, &token_id).transfer( - &asserter, - env.current_contract_address(), - &bond_amount, - ); + let token_client = token::Client::new(&env, &token_id); + let received = Self::transfer_in(&env, &token_client, &asserter, bond_amount)?; + + if received != bond_amount { + assertion.bond = received; + Self::set_assertion(&env, id, &assertion); + } Asserted { id, @@ -1070,11 +1100,8 @@ impl Tholos { Self::set_assertion(&env, id, &assertion); let token_id: Address = Self::get(&env, &DataKey::Token)?; - token::Client::new(&env, &token_id).transfer( - &disputer, - env.current_contract_address(), - &assertion.bond, - ); + let token_client = token::Client::new(&env, &token_id); + Self::transfer_in(&env, &token_client, &disputer, assertion.bond)?; Disputed { id, disputer }.publish(&env); @@ -1122,6 +1149,7 @@ impl Tholos { 0 }; + // State is written before the external token transfers below so that // a reentrant call from a non-standard token sees this assertion as // already resolved, rather than still `Pending`. @@ -1132,6 +1160,11 @@ impl Tholos { let token_id: Address = Self::get(&env, &DataKey::Token)?; let token_client = token::Client::new(&env, &token_id); + let contract_balance = token_client.balance(&env.current_contract_address()); + + if assertion.bond > contract_balance { + return Err(Error::TokenTransferMismatch); + } if reward > 0 { // Pay the caller their reward first, then pay the asserter the @@ -1220,7 +1253,16 @@ impl Tholos { return Ok(None); }; - let payout = assertion.bond * 2; + let token_id: Address = Self::get(&env, &DataKey::Token)?; + let token_client = token::Client::new(&env, &token_id); + let contract_balance = token_client.balance(&env.current_contract_address()); + + let payout = assertion + .bond + .checked_mul(2) + .ok_or(Error::TokenTransferMismatch)? + .min(contract_balance); + let winner = if winner_is_asserter { assertion.asserter.clone() } else { @@ -1243,8 +1285,7 @@ impl Tholos { assertion.final_outcome = Some(final_outcome); Self::set_assertion(&env, id, &assertion); - let token_id: Address = Self::get(&env, &DataKey::Token)?; - token::Client::new(&env, &token_id).transfer( + token_client.transfer( &env.current_contract_address(), &winner, &payout, diff --git a/contracts/tholos/src/test.rs b/contracts/tholos/src/test.rs index 65cbc79..497657d 100644 --- a/contracts/tholos/src/test.rs +++ b/contracts/tholos/src/test.rs @@ -2122,6 +2122,186 @@ fn test_finalize_is_not_reentrant() { assert_eq!(evil_token.balance(&asserter), 1_000); } +// --------------------------------------------------------------------------- +// Fee-on-transfer token tests +// --------------------------------------------------------------------------- + +// --------------------------------------------------------------------------- +// Fee-on-transfer token tests +// --------------------------------------------------------------------------- + +mod fee_token { + use super::*; + use soroban_sdk::Map; + + #[contracttype] + pub enum DataKey { + Balances, + FeeBps, + } + + #[contract] + pub struct FeeToken; + + #[contractimpl] + impl FeeToken { + pub fn set_fee_bps(env: Env, bps: u32) { + env.storage().instance().set(&DataKey::FeeBps, &bps); + } + + pub fn credit(env: Env, addr: Address, amount: i128) { + let mut balances = Self::balances(&env); + let current = balances.get(addr.clone()).unwrap_or(0); + balances.set(addr, current + amount); + env.storage().instance().set(&DataKey::Balances, &balances); + } + + pub fn balance(env: Env, addr: Address) -> i128 { + Self::balances(&env).get(addr).unwrap_or(0) + } + + pub fn transfer(env: Env, from: Address, to: Address, amount: i128) { + let fee_bps: u32 = env + .storage() + .instance() + .get(&DataKey::FeeBps) + .unwrap_or(0); + + let fee = amount * (fee_bps as i128) / 10_000; + let received = amount - fee; + + let mut balances = Self::balances(&env); + let from_balance = balances.get(from.clone()).unwrap_or(0); + assert!(from_balance >= amount, "insufficient balance"); + + let to_balance = balances.get(to.clone()).unwrap_or(0); + + balances.set(from, from_balance - amount); + balances.set(to, to_balance + received); + + env.storage().instance().set(&DataKey::Balances, &balances); + } + + fn balances(env: &Env) -> Map { + env.storage() + .instance() + .get(&DataKey::Balances) + .unwrap_or(Map::new(env)) + } + } +} + + fn fee_fixture( + env: &Env, + fee_bps: u32, + ) -> ( + fee_token::FeeTokenClient<'static>, + TholosClient<'static>, + Address, + Vec
, + ) { + let fee_token_id = env.register(fee_token::FeeToken, ()); + let fee_token = fee_token::FeeTokenClient::new(env, &fee_token_id); + fee_token.set_fee_bps(&fee_bps); + + let resolvers = Vec::from_array( + env, + [ + Address::generate(env), + Address::generate(env), + Address::generate(env), + ], + ); + + let contract_id = env.register(Tholos, ()); + let client = TholosClient::new(env, &contract_id); + + let admin = Address::generate(env); + + client.initialize( + &admin, + &fee_token_id, + &DEFAULT_BOND, + &DEFAULT_WINDOW, + &resolvers, + &0u32, + ); + + (fee_token, client, contract_id, resolvers) + } + + #[test] + fn test_fee_on_transfer_records_actual_bond() { + let env = Env::default(); + env.mock_all_auths(); + + let (fee_token, client, contract_id, _resolvers) = fee_fixture(&env, 1_000); + + let asserter = Address::generate(&env); + fee_token.credit(&asserter, &1_000); + + let id = client.assert_outcome(&asserter, &true); + let assertion = client.get_assertion_state(&id); + assert_eq!(assertion.bond, 90); + + // 100 bond requested -> 90 received after the 10% fee. + assert_eq!(assertion.bond, 90); + assert_eq!(fee_token.balance(&contract_id), 90); + assert_eq!(fee_token.balance(&asserter), 900); + } + #[test] + fn test_fee_on_transfer_dispute_uses_actual_deposit() { + let env = Env::default(); + env.mock_all_auths(); + + let (fee_token, client, contract_id, _resolvers) = fee_fixture(&env, 1_000); + + let asserter = Address::generate(&env); + let disputer = Address::generate(&env); + + fee_token.credit(&asserter, &1_000); + fee_token.credit(&disputer, &1_000); + + let id = client.assert_outcome(&asserter, &true); + + assert_eq!(fee_token.balance(&contract_id), 90); + + client.dispute(&disputer, &id); + // 100 bond -> 90 received. + // 90 dispute deposit -> 81 received. + // Total = 171. + assert_eq!(fee_token.balance(&contract_id), 171); + assert_eq!(fee_token.balance(&disputer), 910); + } + #[test] + fn test_fee_on_transfer_resolve_uses_available_balance() { + let env = Env::default(); + env.mock_all_auths(); + + let (fee_token, client, contract_id, resolvers) = fee_fixture(&env, 1_000); + + let asserter = Address::generate(&env); + let disputer = Address::generate(&env); + + fee_token.credit(&asserter, &1_000); + fee_token.credit(&disputer, &1_000); + + let id = client.assert_outcome(&asserter, &true); + client.dispute(&disputer, &id); + + // The contract has 171 tokens: + // 100 -> 90 received + // 90 -> 81 received + assert_eq!(fee_token.balance(&contract_id), 171); + + // Cast enough resolver votes to reach the majority. + client.resolve(&resolvers.get(0).unwrap(), &id, &true); + client.resolve(&resolvers.get(1).unwrap(), &id, &true); + + + // The resolver payout must not exceed the contract's actual balance. + assert!(fee_token.balance(&contract_id) >= 0); + } // --------------------------------------------------------------------------- // Property-based tests for resolver vote counting and majority logic // --------------------------------------------------------------------------- diff --git a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json new file mode 100644 index 0000000..7109c27 --- /dev/null +++ b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json @@ -0,0 +1,529 @@ +{ + "generators": { + "address": 8, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "i128": "100" + }, + { + "u64": "3600" + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + { + "u32": 0 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "assert_outcome", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "bool": true + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "dispute", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "u64": "0" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Balances" + } + ] + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + "val": { + "i128": "171" + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + "val": { + "i128": "900" + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + "val": { + "i128": "910" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "FeeBps" + } + ] + }, + "val": { + "u32": 1000 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Assertion" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "asserter" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "bond" + }, + "val": { + "i128": "90" + } + }, + { + "key": { + "symbol": "disputer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "final_outcome" + }, + "val": "void" + }, + { + "key": { + "symbol": "finalizer" + }, + "val": "void" + }, + { + "key": { + "symbol": "opened_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "outcome" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "resolvers" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Disputed" + } + ] + } + }, + { + "key": { + "symbol": "voted" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "votes_against_outcome" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "votes_for_outcome" + }, + "val": { + "u32": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "BondAmount" + } + ] + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ChallengeWindow" + } + ] + }, + "val": { + "u64": "3600" + } + }, + { + "key": { + "vec": [ + { + "symbol": "FinalizeRewardBps" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "NextId" + } + ] + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "Resolvers" + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 518400 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json new file mode 100644 index 0000000..9916138 --- /dev/null +++ b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json @@ -0,0 +1,466 @@ +{ + "generators": { + "address": 7, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "i128": "100" + }, + { + "u64": "3600" + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + { + "u32": 0 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "assert_outcome", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "bool": true + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Balances" + } + ] + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + "val": { + "i128": "90" + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + "val": { + "i128": "900" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "FeeBps" + } + ] + }, + "val": { + "u32": 1000 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Assertion" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "asserter" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "bond" + }, + "val": { + "i128": "90" + } + }, + { + "key": { + "symbol": "disputer" + }, + "val": "void" + }, + { + "key": { + "symbol": "final_outcome" + }, + "val": "void" + }, + { + "key": { + "symbol": "finalizer" + }, + "val": "void" + }, + { + "key": { + "symbol": "opened_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "outcome" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "resolvers" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + }, + { + "key": { + "symbol": "voted" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "votes_against_outcome" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "votes_for_outcome" + }, + "val": { + "u32": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "BondAmount" + } + ] + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ChallengeWindow" + } + ] + }, + "val": { + "u64": "3600" + } + }, + { + "key": { + "vec": [ + { + "symbol": "FinalizeRewardBps" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "NextId" + } + ] + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "Resolvers" + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 518400 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json new file mode 100644 index 0000000..f5b64af --- /dev/null +++ b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json @@ -0,0 +1,627 @@ +{ + "generators": { + "address": 8, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "i128": "100" + }, + { + "u64": "3600" + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + { + "u32": 0 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "assert_outcome", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "bool": true + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "dispute", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "u64": "0" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "resolve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": "0" + }, + { + "bool": true + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "resolve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": "0" + }, + { + "bool": true + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Balances" + } + ] + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + "val": { + "i128": "1054" + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + "val": { + "i128": "910" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "FeeBps" + } + ] + }, + "val": { + "u32": 1000 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Assertion" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "asserter" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "bond" + }, + "val": { + "i128": "90" + } + }, + { + "key": { + "symbol": "disputer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "final_outcome" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "finalizer" + }, + "val": "void" + }, + { + "key": { + "symbol": "opened_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "outcome" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "resolvers" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Resolved" + } + ] + } + }, + { + "key": { + "symbol": "voted" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + { + "key": { + "symbol": "votes_against_outcome" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "votes_for_outcome" + }, + "val": { + "u32": 2 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "BondAmount" + } + ] + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ChallengeWindow" + } + ] + }, + "val": { + "u64": "3600" + } + }, + { + "key": { + "vec": [ + { + "symbol": "FinalizeRewardBps" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "NextId" + } + ] + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "Resolvers" + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 518400 + } + ] + }, + "events": [] +} \ No newline at end of file From 60cff2260352ced3d0ecad4308614a83d977ec3c Mon Sep 17 00:00:00 2001 From: xtep103 Date: Sat, 12 Sep 2026 07:08:44 +0100 Subject: [PATCH 2/7] fix(tholos): sync fee token tests with main --- contracts/tholos/src/lib.rs | 5 +- contracts/tholos/src/test.rs | 2 - ...ransfer_dispute_uses_actual_deposit.1.json | 439 +------------- ...fee_on_transfer_records_actual_bond.1.json | 376 +----------- ...sfer_resolve_uses_available_balance.1.json | 537 +----------------- 5 files changed, 13 insertions(+), 1346 deletions(-) diff --git a/contracts/tholos/src/lib.rs b/contracts/tholos/src/lib.rs index d76ff03..35a8e32 100644 --- a/contracts/tholos/src/lib.rs +++ b/contracts/tholos/src/lib.rs @@ -243,7 +243,6 @@ pub enum Error { /// slot without any economic risk (they receive both bonds back regardless /// of the resolver vote), nullifying the bond-forfeiture deterrent. SelfDispute = 22, -<<<<<<< HEAD NoAdminRotationProposal = 23, /// `reclaim_stalled_dispute` was called on an assertion whose dispute /// opened without a stall timeout configured (0 = fallback disabled), or @@ -260,10 +259,8 @@ pub enum Error { /// assertion's asserter or disputer. A party voting on their own case /// biases (and, on a size-1 committee, determines) the outcome. SelfVote = 27, -======= /// The token transfer did not result in the expected balance change. - TokenTransferMismatch = 23, ->>>>>>> 2dc2e65 (fix(tholos): account for fee-on-transfer tokens) + TokenTransferMismatch = 28, } const DAY_IN_LEDGERS: u32 = 17280; diff --git a/contracts/tholos/src/test.rs b/contracts/tholos/src/test.rs index 497657d..db851cd 100644 --- a/contracts/tholos/src/test.rs +++ b/contracts/tholos/src/test.rs @@ -2216,10 +2216,8 @@ mod fee_token { let contract_id = env.register(Tholos, ()); let client = TholosClient::new(env, &contract_id); - let admin = Address::generate(env); client.initialize( - &admin, &fee_token_id, &DEFAULT_BOND, &DEFAULT_WINDOW, diff --git a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json index 7109c27..a35e288 100644 --- a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json +++ b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json @@ -1,105 +1,12 @@ { "generators": { - "address": 8, + "address": 5, "nonce": 0, "mux_id": 0 }, "auth": [ [], [], - [], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "function_name": "initialize", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "i128": "100" - }, - { - "u64": "3600" - }, - { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] - }, - { - "u32": 0 - } - ] - } - }, - "sub_invocations": [] - } - ] - ], - [], - [], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "function_name": "assert_outcome", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, - { - "bool": true - } - ] - } - }, - "sub_invocations": [] - } - ] - ], - [], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "function_name": "dispute", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" - }, - { - "u64": "0" - } - ] - } - }, - "sub_invocations": [] - } - ] - ], - [], [] ], "ledger": { @@ -127,43 +34,6 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ - { - "key": { - "vec": [ - { - "symbol": "Balances" - } - ] - }, - "val": { - "map": [ - { - "key": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" - }, - "val": { - "i128": "171" - } - }, - { - "key": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, - "val": { - "i128": "900" - } - }, - { - "key": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" - }, - "val": { - "i128": "910" - } - } - ] - } - }, { "key": { "vec": [ @@ -185,140 +55,6 @@ }, "live_until": 4095 }, - { - "entry": { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "key": { - "vec": [ - { - "symbol": "Assertion" - }, - { - "u64": "0" - } - ] - }, - "durability": "persistent", - "val": { - "map": [ - { - "key": { - "symbol": "asserter" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - } - }, - { - "key": { - "symbol": "bond" - }, - "val": { - "i128": "90" - } - }, - { - "key": { - "symbol": "disputer" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" - } - }, - { - "key": { - "symbol": "final_outcome" - }, - "val": "void" - }, - { - "key": { - "symbol": "finalizer" - }, - "val": "void" - }, - { - "key": { - "symbol": "opened_at" - }, - "val": { - "u64": "0" - } - }, - { - "key": { - "symbol": "outcome" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "resolvers" - }, - "val": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Disputed" - } - ] - } - }, - { - "key": { - "symbol": "voted" - }, - "val": { - "vec": [] - } - }, - { - "key": { - "symbol": "votes_against_outcome" - }, - "val": { - "u32": 0 - } - }, - { - "key": { - "symbol": "votes_for_outcome" - }, - "val": { - "u32": 0 - } - } - ] - } - } - }, - "ext": "v0" - }, - "live_until": 518400 - }, { "entry": { "last_modified_ledger_seq": 0, @@ -333,181 +69,14 @@ "executable": { "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, - "storage": [ - { - "key": { - "vec": [ - { - "symbol": "Admin" - } - ] - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" - } - }, - { - "key": { - "vec": [ - { - "symbol": "BondAmount" - } - ] - }, - "val": { - "i128": "100" - } - }, - { - "key": { - "vec": [ - { - "symbol": "ChallengeWindow" - } - ] - }, - "val": { - "u64": "3600" - } - }, - { - "key": { - "vec": [ - { - "symbol": "FinalizeRewardBps" - } - ] - }, - "val": { - "u32": 0 - } - }, - { - "key": { - "vec": [ - { - "symbol": "NextId" - } - ] - }, - "val": { - "u64": "1" - } - }, - { - "key": { - "vec": [ - { - "symbol": "Paused" - } - ] - }, - "val": { - "bool": false - } - }, - { - "key": { - "vec": [ - { - "symbol": "Resolvers" - } - ] - }, - "val": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] - } - }, - { - "key": { - "vec": [ - { - "symbol": "Token" - } - ] - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - } - ] + "storage": null } } } }, "ext": "v0" }, - "live_until": 518400 - }, - { - "entry": { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "key": { - "ledger_key_nonce": { - "nonce": "801925984706572462" - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - "live_until": 6311999 - }, - { - "entry": { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", - "key": { - "ledger_key_nonce": { - "nonce": "5541220902715666415" - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - "live_until": 6311999 - }, - { - "entry": { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", - "key": { - "ledger_key_nonce": { - "nonce": "1033654523790656264" - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - "live_until": 6311999 + "live_until": 4095 }, { "entry": { @@ -521,7 +90,7 @@ }, "ext": "v0" }, - "live_until": 518400 + "live_until": 4095 } ] }, diff --git a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json index 9916138..a35e288 100644 --- a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json +++ b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json @@ -1,80 +1,10 @@ { "generators": { - "address": 7, + "address": 5, "nonce": 0, "mux_id": 0 }, "auth": [ - [], - [], - [], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "function_name": "initialize", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "i128": "100" - }, - { - "u64": "3600" - }, - { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] - }, - { - "u32": 0 - } - ] - } - }, - "sub_invocations": [] - } - ] - ], - [], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "function_name": "assert_outcome", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, - { - "bool": true - } - ] - } - }, - "sub_invocations": [] - } - ] - ], [], [], [] @@ -104,35 +34,6 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ - { - "key": { - "vec": [ - { - "symbol": "Balances" - } - ] - }, - "val": { - "map": [ - { - "key": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" - }, - "val": { - "i128": "90" - } - }, - { - "key": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, - "val": { - "i128": "900" - } - } - ] - } - }, { "key": { "vec": [ @@ -154,128 +55,6 @@ }, "live_until": 4095 }, - { - "entry": { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "key": { - "vec": [ - { - "symbol": "Assertion" - }, - { - "u64": "0" - } - ] - }, - "durability": "persistent", - "val": { - "map": [ - { - "key": { - "symbol": "asserter" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - } - }, - { - "key": { - "symbol": "bond" - }, - "val": { - "i128": "90" - } - }, - { - "key": { - "symbol": "disputer" - }, - "val": "void" - }, - { - "key": { - "symbol": "final_outcome" - }, - "val": "void" - }, - { - "key": { - "symbol": "finalizer" - }, - "val": "void" - }, - { - "key": { - "symbol": "opened_at" - }, - "val": { - "u64": "0" - } - }, - { - "key": { - "symbol": "outcome" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "resolvers" - }, - "val": { - "vec": [] - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - }, - { - "key": { - "symbol": "voted" - }, - "val": { - "vec": [] - } - }, - { - "key": { - "symbol": "votes_against_outcome" - }, - "val": { - "u32": 0 - } - }, - { - "key": { - "symbol": "votes_for_outcome" - }, - "val": { - "u32": 0 - } - } - ] - } - } - }, - "ext": "v0" - }, - "live_until": 518400 - }, { "entry": { "last_modified_ledger_seq": 0, @@ -290,161 +69,14 @@ "executable": { "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, - "storage": [ - { - "key": { - "vec": [ - { - "symbol": "Admin" - } - ] - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" - } - }, - { - "key": { - "vec": [ - { - "symbol": "BondAmount" - } - ] - }, - "val": { - "i128": "100" - } - }, - { - "key": { - "vec": [ - { - "symbol": "ChallengeWindow" - } - ] - }, - "val": { - "u64": "3600" - } - }, - { - "key": { - "vec": [ - { - "symbol": "FinalizeRewardBps" - } - ] - }, - "val": { - "u32": 0 - } - }, - { - "key": { - "vec": [ - { - "symbol": "NextId" - } - ] - }, - "val": { - "u64": "1" - } - }, - { - "key": { - "vec": [ - { - "symbol": "Paused" - } - ] - }, - "val": { - "bool": false - } - }, - { - "key": { - "vec": [ - { - "symbol": "Resolvers" - } - ] - }, - "val": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] - } - }, - { - "key": { - "vec": [ - { - "symbol": "Token" - } - ] - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - } - ] + "storage": null } } } }, "ext": "v0" }, - "live_until": 518400 - }, - { - "entry": { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "key": { - "ledger_key_nonce": { - "nonce": "801925984706572462" - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - "live_until": 6311999 - }, - { - "entry": { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", - "key": { - "ledger_key_nonce": { - "nonce": "5541220902715666415" - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - "live_until": 6311999 + "live_until": 4095 }, { "entry": { @@ -458,7 +90,7 @@ }, "ext": "v0" }, - "live_until": 518400 + "live_until": 4095 } ] }, diff --git a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json index f5b64af..a35e288 100644 --- a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json +++ b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json @@ -1,154 +1,12 @@ { "generators": { - "address": 8, + "address": 5, "nonce": 0, "mux_id": 0 }, "auth": [ [], [], - [], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "function_name": "initialize", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "i128": "100" - }, - { - "u64": "3600" - }, - { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] - }, - { - "u32": 0 - } - ] - } - }, - "sub_invocations": [] - } - ] - ], - [], - [], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "function_name": "assert_outcome", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, - { - "bool": true - } - ] - } - }, - "sub_invocations": [] - } - ] - ], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "function_name": "dispute", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" - }, - { - "u64": "0" - } - ] - } - }, - "sub_invocations": [] - } - ] - ], - [], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "function_name": "resolve", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "u64": "0" - }, - { - "bool": true - } - ] - } - }, - "sub_invocations": [] - } - ] - ], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "function_name": "resolve", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "u64": "0" - }, - { - "bool": true - } - ] - } - }, - "sub_invocations": [] - } - ] - ], [] ], "ledger": { @@ -176,43 +34,6 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ - { - "key": { - "vec": [ - { - "symbol": "Balances" - } - ] - }, - "val": { - "map": [ - { - "key": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" - }, - "val": { - "i128": "0" - } - }, - { - "key": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, - "val": { - "i128": "1054" - } - }, - { - "key": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" - }, - "val": { - "i128": "910" - } - } - ] - } - }, { "key": { "vec": [ @@ -234,189 +55,6 @@ }, "live_until": 4095 }, - { - "entry": { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "key": { - "ledger_key_nonce": { - "nonce": "4837995959683129791" - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - "live_until": 6311999 - }, - { - "entry": { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", - "key": { - "ledger_key_nonce": { - "nonce": "2032731177588607455" - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - "live_until": 6311999 - }, - { - "entry": { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "key": { - "vec": [ - { - "symbol": "Assertion" - }, - { - "u64": "0" - } - ] - }, - "durability": "persistent", - "val": { - "map": [ - { - "key": { - "symbol": "asserter" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - } - }, - { - "key": { - "symbol": "bond" - }, - "val": { - "i128": "90" - } - }, - { - "key": { - "symbol": "disputer" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" - } - }, - { - "key": { - "symbol": "final_outcome" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "finalizer" - }, - "val": "void" - }, - { - "key": { - "symbol": "opened_at" - }, - "val": { - "u64": "0" - } - }, - { - "key": { - "symbol": "outcome" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "resolvers" - }, - "val": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Resolved" - } - ] - } - }, - { - "key": { - "symbol": "voted" - }, - "val": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - } - ] - } - }, - { - "key": { - "symbol": "votes_against_outcome" - }, - "val": { - "u32": 0 - } - }, - { - "key": { - "symbol": "votes_for_outcome" - }, - "val": { - "u32": 2 - } - } - ] - } - } - }, - "ext": "v0" - }, - "live_until": 518400 - }, { "entry": { "last_modified_ledger_seq": 0, @@ -431,181 +69,14 @@ "executable": { "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, - "storage": [ - { - "key": { - "vec": [ - { - "symbol": "Admin" - } - ] - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" - } - }, - { - "key": { - "vec": [ - { - "symbol": "BondAmount" - } - ] - }, - "val": { - "i128": "100" - } - }, - { - "key": { - "vec": [ - { - "symbol": "ChallengeWindow" - } - ] - }, - "val": { - "u64": "3600" - } - }, - { - "key": { - "vec": [ - { - "symbol": "FinalizeRewardBps" - } - ] - }, - "val": { - "u32": 0 - } - }, - { - "key": { - "vec": [ - { - "symbol": "NextId" - } - ] - }, - "val": { - "u64": "1" - } - }, - { - "key": { - "vec": [ - { - "symbol": "Paused" - } - ] - }, - "val": { - "bool": false - } - }, - { - "key": { - "vec": [ - { - "symbol": "Resolvers" - } - ] - }, - "val": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] - } - }, - { - "key": { - "vec": [ - { - "symbol": "Token" - } - ] - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - } - ] + "storage": null } } } }, "ext": "v0" }, - "live_until": 518400 - }, - { - "entry": { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "key": { - "ledger_key_nonce": { - "nonce": "801925984706572462" - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - "live_until": 6311999 - }, - { - "entry": { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", - "key": { - "ledger_key_nonce": { - "nonce": "5541220902715666415" - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - "live_until": 6311999 - }, - { - "entry": { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", - "key": { - "ledger_key_nonce": { - "nonce": "1033654523790656264" - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - "live_until": 6311999 + "live_until": 4095 }, { "entry": { @@ -619,7 +90,7 @@ }, "ext": "v0" }, - "live_until": 518400 + "live_until": 4095 } ] }, From e69c2ed736009db88aad7de0c60f798bfff877f2 Mon Sep 17 00:00:00 2001 From: xtep103 Date: Sat, 12 Sep 2026 07:34:01 +0100 Subject: [PATCH 3/7] fix(tholos): sync fee token tests with main --- contracts/tholos/src/lib.rs | 9 +- contracts/tholos/src/test.rs | 179 +++--- ...ransfer_dispute_uses_actual_deposit.1.json | 501 ++++++++++++++- ...fee_on_transfer_records_actual_bond.1.json | 411 +++++++++++- ...sfer_resolve_uses_available_balance.1.json | 599 +++++++++++++++++- 5 files changed, 1588 insertions(+), 111 deletions(-) diff --git a/contracts/tholos/src/lib.rs b/contracts/tholos/src/lib.rs index 35a8e32..afaecd9 100644 --- a/contracts/tholos/src/lib.rs +++ b/contracts/tholos/src/lib.rs @@ -1146,7 +1146,6 @@ impl Tholos { 0 }; - // State is written before the external token transfers below so that // a reentrant call from a non-standard token sees this assertion as // already resolved, rather than still `Pending`. @@ -1161,7 +1160,7 @@ impl Tholos { if assertion.bond > contract_balance { return Err(Error::TokenTransferMismatch); - } + } if reward > 0 { // Pay the caller their reward first, then pay the asserter the @@ -1282,11 +1281,7 @@ impl Tholos { assertion.final_outcome = Some(final_outcome); Self::set_assertion(&env, id, &assertion); - token_client.transfer( - &env.current_contract_address(), - &winner, - &payout, - ); + token_client.transfer(&env.current_contract_address(), &winner, &payout); Resolved { id, outcome: final_outcome, diff --git a/contracts/tholos/src/test.rs b/contracts/tholos/src/test.rs index db851cd..af42b17 100644 --- a/contracts/tholos/src/test.rs +++ b/contracts/tholos/src/test.rs @@ -2161,11 +2161,7 @@ mod fee_token { } pub fn transfer(env: Env, from: Address, to: Address, amount: i128) { - let fee_bps: u32 = env - .storage() - .instance() - .get(&DataKey::FeeBps) - .unwrap_or(0); + let fee_bps: u32 = env.storage().instance().get(&DataKey::FeeBps).unwrap_or(0); let fee = amount * (fee_bps as i128) / 10_000; let received = amount - fee; @@ -2191,115 +2187,114 @@ mod fee_token { } } - fn fee_fixture( - env: &Env, - fee_bps: u32, - ) -> ( - fee_token::FeeTokenClient<'static>, - TholosClient<'static>, - Address, - Vec
, - ) { - let fee_token_id = env.register(fee_token::FeeToken, ()); - let fee_token = fee_token::FeeTokenClient::new(env, &fee_token_id); - fee_token.set_fee_bps(&fee_bps); - - let resolvers = Vec::from_array( - env, - [ - Address::generate(env), - Address::generate(env), - Address::generate(env), - ], - ); - - let contract_id = env.register(Tholos, ()); - let client = TholosClient::new(env, &contract_id); +fn fee_fixture( + env: &Env, + fee_bps: u32, +) -> ( + fee_token::FeeTokenClient<'static>, + TholosClient<'static>, + Address, + Vec
, +) { + let fee_token_id = env.register(fee_token::FeeToken, ()); + let fee_token = fee_token::FeeTokenClient::new(env, &fee_token_id); + fee_token.set_fee_bps(&fee_bps); + let resolvers = Vec::from_array( + env, + [ + Address::generate(env), + Address::generate(env), + Address::generate(env), + ], + ); - client.initialize( - &fee_token_id, - &DEFAULT_BOND, - &DEFAULT_WINDOW, - &resolvers, - &0u32, - ); + let admin = Address::generate(env); + let contract_id = env.register(Tholos, (admin,)); + let client = TholosClient::new(env, &contract_id); - (fee_token, client, contract_id, resolvers) - } + client.initialize( + &fee_token_id, + &DEFAULT_BOND, + &DEFAULT_WINDOW, + &resolvers, + &0u32, + ); - #[test] - fn test_fee_on_transfer_records_actual_bond() { - let env = Env::default(); - env.mock_all_auths(); + (fee_token, client, contract_id, resolvers) +} - let (fee_token, client, contract_id, _resolvers) = fee_fixture(&env, 1_000); +#[test] +fn test_fee_on_transfer_records_actual_bond() { + let env = Env::default(); + env.mock_all_auths(); - let asserter = Address::generate(&env); - fee_token.credit(&asserter, &1_000); + let (fee_token, client, contract_id, _resolvers) = fee_fixture(&env, 1_000); - let id = client.assert_outcome(&asserter, &true); - let assertion = client.get_assertion_state(&id); - assert_eq!(assertion.bond, 90); + let asserter = Address::generate(&env); + fee_token.credit(&asserter, &1_000); - // 100 bond requested -> 90 received after the 10% fee. - assert_eq!(assertion.bond, 90); - assert_eq!(fee_token.balance(&contract_id), 90); - assert_eq!(fee_token.balance(&asserter), 900); - } - #[test] - fn test_fee_on_transfer_dispute_uses_actual_deposit() { - let env = Env::default(); - env.mock_all_auths(); + let id = client.assert_outcome(&asserter, &true); + let assertion = client.get_assertion_state(&id); + assert_eq!(assertion.bond, 90); - let (fee_token, client, contract_id, _resolvers) = fee_fixture(&env, 1_000); + // 100 bond requested -> 90 received after the 10% fee. + assert_eq!(assertion.bond, 90); + assert_eq!(fee_token.balance(&contract_id), 90); + assert_eq!(fee_token.balance(&asserter), 900); +} +#[test] +fn test_fee_on_transfer_dispute_uses_actual_deposit() { + let env = Env::default(); + env.mock_all_auths(); - let asserter = Address::generate(&env); - let disputer = Address::generate(&env); + let (fee_token, client, contract_id, _resolvers) = fee_fixture(&env, 1_000); - fee_token.credit(&asserter, &1_000); - fee_token.credit(&disputer, &1_000); + let asserter = Address::generate(&env); + let disputer = Address::generate(&env); - let id = client.assert_outcome(&asserter, &true); + fee_token.credit(&asserter, &1_000); + fee_token.credit(&disputer, &1_000); - assert_eq!(fee_token.balance(&contract_id), 90); + let id = client.assert_outcome(&asserter, &true); - client.dispute(&disputer, &id); - // 100 bond -> 90 received. - // 90 dispute deposit -> 81 received. - // Total = 171. - assert_eq!(fee_token.balance(&contract_id), 171); - assert_eq!(fee_token.balance(&disputer), 910); - } - #[test] - fn test_fee_on_transfer_resolve_uses_available_balance() { - let env = Env::default(); - env.mock_all_auths(); + assert_eq!(fee_token.balance(&contract_id), 90); - let (fee_token, client, contract_id, resolvers) = fee_fixture(&env, 1_000); + client.dispute(&disputer, &id); + // 100 bond -> 90 received. + // 90 dispute deposit -> 81 received. + // Total = 171. + assert_eq!(fee_token.balance(&contract_id), 171); + assert_eq!(fee_token.balance(&disputer), 910); +} +#[test] +fn test_fee_on_transfer_resolve_uses_available_balance() { + let env = Env::default(); + env.mock_all_auths(); - let asserter = Address::generate(&env); - let disputer = Address::generate(&env); + let (fee_token, client, contract_id, resolvers) = fee_fixture(&env, 1_000); - fee_token.credit(&asserter, &1_000); - fee_token.credit(&disputer, &1_000); + let asserter = Address::generate(&env); + let disputer = Address::generate(&env); - let id = client.assert_outcome(&asserter, &true); - client.dispute(&disputer, &id); + fee_token.credit(&asserter, &1_000); + fee_token.credit(&disputer, &1_000); - // The contract has 171 tokens: - // 100 -> 90 received - // 90 -> 81 received - assert_eq!(fee_token.balance(&contract_id), 171); + let id = client.assert_outcome(&asserter, &true); + client.dispute(&disputer, &id); - // Cast enough resolver votes to reach the majority. - client.resolve(&resolvers.get(0).unwrap(), &id, &true); - client.resolve(&resolvers.get(1).unwrap(), &id, &true); + // The contract has 171 tokens: + // 100 -> 90 received + // 90 -> 81 received + assert_eq!(fee_token.balance(&contract_id), 171); + // Cast enough resolver votes to reach the majority. + client.resolve(&resolvers.get(0).unwrap(), &id, &true); + client.resolve(&resolvers.get(1).unwrap(), &id, &true); - // The resolver payout must not exceed the contract's actual balance. - assert!(fee_token.balance(&contract_id) >= 0); - } + // The resolver payout must not exceed the contract's actual balance. + assert!(fee_token.balance(&contract_id) >= 0); +} // --------------------------------------------------------------------------- // Property-based tests for resolver vote counting and majority logic // --------------------------------------------------------------------------- diff --git a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json index a35e288..4342ca6 100644 --- a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json +++ b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json @@ -1,12 +1,120 @@ { "generators": { - "address": 5, + "address": 8, "nonce": 0, "mux_id": 0 }, "auth": [ [], [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "i128": "100" + }, + { + "u64": "3600" + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + { + "u32": 0 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "assert_outcome", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "bool": true + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "dispute", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "u64": "0" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], [] ], "ledger": { @@ -34,6 +142,43 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Balances" + } + ] + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + "val": { + "i128": "171" + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + "val": { + "i128": "900" + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + "val": { + "i128": "910" + } + } + ] + } + }, { "key": { "vec": [ @@ -62,6 +207,207 @@ "contract_data": { "ext": "v0", "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Assertion" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "asserter" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "bond" + }, + "val": { + "i128": "90" + } + }, + { + "key": { + "symbol": "disputer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "final_outcome" + }, + "val": "void" + }, + { + "key": { + "symbol": "finalizer" + }, + "val": "void" + }, + { + "key": { + "symbol": "opened_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "outcome" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "resolvers" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Disputed" + } + ] + } + }, + { + "key": { + "symbol": "voted" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "votes_against_outcome" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "votes_for_outcome" + }, + "val": { + "u32": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "DisputedAt" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "0" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": "ledger_key_contract_instance", "durability": "persistent", "val": { @@ -69,14 +415,161 @@ "executable": { "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, - "storage": null + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "BondAmount" + } + ] + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ChallengeWindow" + } + ] + }, + "val": { + "u64": "3600" + } + }, + { + "key": { + "vec": [ + { + "symbol": "FinalizeRewardBps" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "NextId" + } + ] + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "Resolvers" + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] } } } }, "ext": "v0" }, - "live_until": 4095 + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 }, { "entry": { @@ -90,7 +583,7 @@ }, "ext": "v0" }, - "live_until": 4095 + "live_until": 518400 } ] }, diff --git a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json index a35e288..1b17bde 100644 --- a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json +++ b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json @@ -1,10 +1,95 @@ { "generators": { - "address": 5, + "address": 7, "nonce": 0, "mux_id": 0 }, "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "i128": "100" + }, + { + "u64": "3600" + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + { + "u32": 0 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "assert_outcome", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "bool": true + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [], [], [] @@ -34,6 +119,35 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Balances" + } + ] + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + "val": { + "i128": "90" + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + "val": { + "i128": "900" + } + } + ] + } + }, { "key": { "vec": [ @@ -62,6 +176,168 @@ "contract_data": { "ext": "v0", "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Assertion" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "asserter" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "bond" + }, + "val": { + "i128": "90" + } + }, + { + "key": { + "symbol": "disputer" + }, + "val": "void" + }, + { + "key": { + "symbol": "final_outcome" + }, + "val": "void" + }, + { + "key": { + "symbol": "finalizer" + }, + "val": "void" + }, + { + "key": { + "symbol": "opened_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "outcome" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "resolvers" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + }, + { + "key": { + "symbol": "voted" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "votes_against_outcome" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "votes_for_outcome" + }, + "val": { + "u32": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": "ledger_key_contract_instance", "durability": "persistent", "val": { @@ -69,14 +345,141 @@ "executable": { "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, - "storage": null + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "BondAmount" + } + ] + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ChallengeWindow" + } + ] + }, + "val": { + "u64": "3600" + } + }, + { + "key": { + "vec": [ + { + "symbol": "FinalizeRewardBps" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "NextId" + } + ] + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "Resolvers" + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] } } } }, "ext": "v0" }, - "live_until": 4095 + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 }, { "entry": { @@ -90,7 +493,7 @@ }, "ext": "v0" }, - "live_until": 4095 + "live_until": 518400 } ] }, diff --git a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json index a35e288..2f984f6 100644 --- a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json +++ b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json @@ -1,12 +1,169 @@ { "generators": { - "address": 5, + "address": 8, "nonce": 0, "mux_id": 0 }, "auth": [ [], [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "__constructor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "i128": "100" + }, + { + "u64": "3600" + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + { + "u32": 0 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "assert_outcome", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "bool": true + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "dispute", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "u64": "0" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "resolve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": "0" + }, + { + "bool": true + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "resolve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": "0" + }, + { + "bool": true + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [] ], "ledger": { @@ -34,6 +191,43 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Balances" + } + ] + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + "val": { + "i128": "1054" + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + "val": { + "i128": "910" + } + } + ] + } + }, { "key": { "vec": [ @@ -55,6 +249,66 @@ }, "live_until": 4095 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "4270020994084947596" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, @@ -62,6 +316,196 @@ "contract_data": { "ext": "v0", "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Assertion" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "asserter" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "bond" + }, + "val": { + "i128": "90" + } + }, + { + "key": { + "symbol": "disputer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "final_outcome" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "finalizer" + }, + "val": "void" + }, + { + "key": { + "symbol": "opened_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "outcome" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "resolvers" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Resolved" + } + ] + } + }, + { + "key": { + "symbol": "voted" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + { + "key": { + "symbol": "votes_against_outcome" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "votes_for_outcome" + }, + "val": { + "u32": 2 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "DisputedAt" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "0" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": "ledger_key_contract_instance", "durability": "persistent", "val": { @@ -69,14 +513,161 @@ "executable": { "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, - "storage": null + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "BondAmount" + } + ] + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ChallengeWindow" + } + ] + }, + "val": { + "u64": "3600" + } + }, + { + "key": { + "vec": [ + { + "symbol": "FinalizeRewardBps" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "NextId" + } + ] + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "Resolvers" + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] } } } }, "ext": "v0" }, - "live_until": 4095 + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 }, { "entry": { @@ -90,7 +681,7 @@ }, "ext": "v0" }, - "live_until": 4095 + "live_until": 518400 } ] }, From 27ef4c3ff51352a882acc58fa155136884ee9917 Mon Sep 17 00:00:00 2001 From: xtep103 Date: Sat, 12 Sep 2026 21:26:19 +0100 Subject: [PATCH 4/7] chore(tholos-sdk): regenerate bindings --- packages/tholos-sdk/src/index.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/tholos-sdk/src/index.ts b/packages/tholos-sdk/src/index.ts index 05322e6..791ec61 100644 --- a/packages/tholos-sdk/src/index.ts +++ b/packages/tholos-sdk/src/index.ts @@ -91,7 +91,11 @@ export const Errors = { * assertion's asserter or disputer. A party voting on their own case * biases (and, on a size-1 committee, determines) the outcome. */ - 27: {message:"SelfVote"} + 27: {message:"SelfVote"}, + /** + * The token transfer did not result in the expected balance change. + */ + 28: {message:"TokenTransferMismatch"} } export type Status = {tag: "Pending", values: void} | {tag: "Disputed", values: void} | {tag: "Resolved", values: void}; @@ -436,7 +440,7 @@ export class Client extends ContractClient { } constructor(public readonly options: ContractClientOptions) { super( - new ContractSpec([ "AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAGwAAAAAAAAASQWxyZWFkeUluaXRpYWxpemVkAAAAAAABAAAAAAAAAA5Ob3RJbml0aWFsaXplZAAAAAAAAgAAAAAAAAAUSW52YWxpZFJlc29sdmVyQ291bnQAAAADAAAAAAAAABFBc3NlcnRpb25Ob3RGb3VuZAAAAAAAAAQAAAAAAAAACk5vdFBlbmRpbmcAAAAAAAUAAAAAAAAAC05vdERpc3B1dGVkAAAAAAYAAAAAAAAAFUNoYWxsZW5nZVdpbmRvd0Nsb3NlZAAAAAAAAAcAAAAAAAAAE0NoYWxsZW5nZVdpbmRvd09wZW4AAAAACAAAAAAAAAAMTm90QVJlc29sdmVyAAAACQAAAAAAAAAMQWxyZWFkeVZvdGVkAAAACgAAAAAAAAAGUGF1c2VkAAAAAAALAAAAPmBib25kX2Ftb3VudGAgd2FzIG5vdCBwb3NpdGl2ZSwgb3IgZXhjZWVkZWQgYE1BWF9CT05EX0FNT1VOVGAuAAAAAAARSW52YWxpZEJvbmRBbW91bnQAAAAAAAAMAAAAAAAAABZJbnZhbGlkQ2hhbGxlbmdlV2luZG93AAAAAAANAAAAAAAAABBUb29NYW55UmVzb2x2ZXJzAAAADgAAAEhgZmluYWxpemVfcmV3YXJkX2Jwc2Agd2FzIGdyZWF0ZXIgdGhhbiBgTUFYX0ZJTkFMSVpFX1JFV0FSRF9CUFNgICgxMDAwKS4AAAAVSW52YWxpZEZpbmFsaXplUmV3YXJkAAAAAAAADwAAAAAAAAASRHVwbGljYXRlUmVzb2x2ZXJzAAAAAAAQAAAAAAAAABJSb3RhdGlvbkluUHJvZ3Jlc3MAAAAAABEAAAAAAAAAEk5vUm90YXRpb25Qcm9wb3NhbAAAAAAAEgAAAAAAAAAWUmVzb2x2ZXJOb3RJbkNvbW1pdHRlZQAAAAAAEwAAAAAAAAAdUm90YXRpb25UYXJnZXRBbHJlYWR5UmVzb2x2ZXIAAAAAAAAUAAAAAAAAAAtOb3RQcm9wb3NlcgAAAAAVAAABGFRoZSBjYWxsZXIgaXMgdGhlIGFzc2VydGVyIG9mIHRoZSBhc3NlcnRpb24gdGhleSBhcmUgdHJ5aW5nIHRvIGRpc3B1dGUuCkFuIGFzc2VydGVyIGRpc3B1dGluZyB0aGVpciBvd24gYXNzZXJ0aW9uIHdvdWxkIGNvbnN1bWUgdGhlIG9uZSBkaXNwdXRlCnNsb3Qgd2l0aG91dCBhbnkgZWNvbm9taWMgcmlzayAodGhleSByZWNlaXZlIGJvdGggYm9uZHMgYmFjayByZWdhcmRsZXNzCm9mIHRoZSByZXNvbHZlciB2b3RlKSwgbnVsbGlmeWluZyB0aGUgYm9uZC1mb3JmZWl0dXJlIGRldGVycmVudC4AAAALU2VsZkRpc3B1dGUAAAAAFgAAAAAAAAAXTm9BZG1pblJvdGF0aW9uUHJvcG9zYWwAAAAAFwAAAMlgcmVjbGFpbV9zdGFsbGVkX2Rpc3B1dGVgIHdhcyBjYWxsZWQgb24gYW4gYXNzZXJ0aW9uIHdob3NlIGRpc3B1dGUKb3BlbmVkIHdpdGhvdXQgYSBzdGFsbCB0aW1lb3V0IGNvbmZpZ3VyZWQgKDAgPSBmYWxsYmFjayBkaXNhYmxlZCksIG9yCndob3NlIGRpc3B1dGVkX2F0IHByZWRhdGVzIHRoaXMgdXBncmFkZSBhbmQgY2Fubm90IGJlIHRpbWVkIG91dC4AAAAAAAAZU3RhbGxUaW1lb3V0Tm90Q29uZmlndXJlZAAAAAAAABgAAACsYHJlY2xhaW1fc3RhbGxlZF9kaXNwdXRlYCB3YXMgY2FsbGVkIGJlZm9yZSB0aGUgc3RhbGwgdGltZW91dCBlbGFwc2VkCnNpbmNlIHRoZSBkaXNwdXRlIG9wZW5lZC4gVGhlIGFzc2VydGlvbiBzdGlsbCByZXF1aXJlcyBub3JtYWwKcmVzb2x1dGlvbiBieSB0aGUgc25hcHNob3R0ZWQgY29tbWl0dGVlLgAAABFEaXNwdXRlTm90U3RhbGxlZAAAAAAAABkAAABSYHNldF9zdGFsbF90aW1lb3V0YCB3YXMgY2FsbGVkIHdpdGggYSB2YWx1ZSBncmVhdGVyIHRoYW4KYE1BWF9TVEFMTF9USU1FT1VUX1NFQ1NgLgAAAAAAE0ludmFsaWRTdGFsbFRpbWVvdXQAAAAAGgAAAMNUaGUgY2FsbGVyIGlzIG9uIHRoZSBzbmFwc2hvdHRlZCByZXNvbHZlciBjb21taXR0ZWUgYW5kIGlzIGFsc28gdGhlCmFzc2VydGlvbidzIGFzc2VydGVyIG9yIGRpc3B1dGVyLiBBIHBhcnR5IHZvdGluZyBvbiB0aGVpciBvd24gY2FzZQpiaWFzZXMgKGFuZCwgb24gYSBzaXplLTEgY29tbWl0dGVlLCBkZXRlcm1pbmVzKSB0aGUgb3V0Y29tZS4AAAAACFNlbGZWb3RlAAAAGw==", + new ContractSpec([ "AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAHAAAAAAAAAASQWxyZWFkeUluaXRpYWxpemVkAAAAAAABAAAAAAAAAA5Ob3RJbml0aWFsaXplZAAAAAAAAgAAAAAAAAAUSW52YWxpZFJlc29sdmVyQ291bnQAAAADAAAAAAAAABFBc3NlcnRpb25Ob3RGb3VuZAAAAAAAAAQAAAAAAAAACk5vdFBlbmRpbmcAAAAAAAUAAAAAAAAAC05vdERpc3B1dGVkAAAAAAYAAAAAAAAAFUNoYWxsZW5nZVdpbmRvd0Nsb3NlZAAAAAAAAAcAAAAAAAAAE0NoYWxsZW5nZVdpbmRvd09wZW4AAAAACAAAAAAAAAAMTm90QVJlc29sdmVyAAAACQAAAAAAAAAMQWxyZWFkeVZvdGVkAAAACgAAAAAAAAAGUGF1c2VkAAAAAAALAAAAPmBib25kX2Ftb3VudGAgd2FzIG5vdCBwb3NpdGl2ZSwgb3IgZXhjZWVkZWQgYE1BWF9CT05EX0FNT1VOVGAuAAAAAAARSW52YWxpZEJvbmRBbW91bnQAAAAAAAAMAAAAAAAAABZJbnZhbGlkQ2hhbGxlbmdlV2luZG93AAAAAAANAAAAAAAAABBUb29NYW55UmVzb2x2ZXJzAAAADgAAAEhgZmluYWxpemVfcmV3YXJkX2Jwc2Agd2FzIGdyZWF0ZXIgdGhhbiBgTUFYX0ZJTkFMSVpFX1JFV0FSRF9CUFNgICgxMDAwKS4AAAAVSW52YWxpZEZpbmFsaXplUmV3YXJkAAAAAAAADwAAAAAAAAASRHVwbGljYXRlUmVzb2x2ZXJzAAAAAAAQAAAAAAAAABJSb3RhdGlvbkluUHJvZ3Jlc3MAAAAAABEAAAAAAAAAEk5vUm90YXRpb25Qcm9wb3NhbAAAAAAAEgAAAAAAAAAWUmVzb2x2ZXJOb3RJbkNvbW1pdHRlZQAAAAAAEwAAAAAAAAAdUm90YXRpb25UYXJnZXRBbHJlYWR5UmVzb2x2ZXIAAAAAAAAUAAAAAAAAAAtOb3RQcm9wb3NlcgAAAAAVAAABGFRoZSBjYWxsZXIgaXMgdGhlIGFzc2VydGVyIG9mIHRoZSBhc3NlcnRpb24gdGhleSBhcmUgdHJ5aW5nIHRvIGRpc3B1dGUuCkFuIGFzc2VydGVyIGRpc3B1dGluZyB0aGVpciBvd24gYXNzZXJ0aW9uIHdvdWxkIGNvbnN1bWUgdGhlIG9uZSBkaXNwdXRlCnNsb3Qgd2l0aG91dCBhbnkgZWNvbm9taWMgcmlzayAodGhleSByZWNlaXZlIGJvdGggYm9uZHMgYmFjayByZWdhcmRsZXNzCm9mIHRoZSByZXNvbHZlciB2b3RlKSwgbnVsbGlmeWluZyB0aGUgYm9uZC1mb3JmZWl0dXJlIGRldGVycmVudC4AAAALU2VsZkRpc3B1dGUAAAAAFgAAAAAAAAAXTm9BZG1pblJvdGF0aW9uUHJvcG9zYWwAAAAAFwAAAMlgcmVjbGFpbV9zdGFsbGVkX2Rpc3B1dGVgIHdhcyBjYWxsZWQgb24gYW4gYXNzZXJ0aW9uIHdob3NlIGRpc3B1dGUKb3BlbmVkIHdpdGhvdXQgYSBzdGFsbCB0aW1lb3V0IGNvbmZpZ3VyZWQgKDAgPSBmYWxsYmFjayBkaXNhYmxlZCksIG9yCndob3NlIGRpc3B1dGVkX2F0IHByZWRhdGVzIHRoaXMgdXBncmFkZSBhbmQgY2Fubm90IGJlIHRpbWVkIG91dC4AAAAAAAAZU3RhbGxUaW1lb3V0Tm90Q29uZmlndXJlZAAAAAAAABgAAACsYHJlY2xhaW1fc3RhbGxlZF9kaXNwdXRlYCB3YXMgY2FsbGVkIGJlZm9yZSB0aGUgc3RhbGwgdGltZW91dCBlbGFwc2VkCnNpbmNlIHRoZSBkaXNwdXRlIG9wZW5lZC4gVGhlIGFzc2VydGlvbiBzdGlsbCByZXF1aXJlcyBub3JtYWwKcmVzb2x1dGlvbiBieSB0aGUgc25hcHNob3R0ZWQgY29tbWl0dGVlLgAAABFEaXNwdXRlTm90U3RhbGxlZAAAAAAAABkAAABSYHNldF9zdGFsbF90aW1lb3V0YCB3YXMgY2FsbGVkIHdpdGggYSB2YWx1ZSBncmVhdGVyIHRoYW4KYE1BWF9TVEFMTF9USU1FT1VUX1NFQ1NgLgAAAAAAE0ludmFsaWRTdGFsbFRpbWVvdXQAAAAAGgAAAMNUaGUgY2FsbGVyIGlzIG9uIHRoZSBzbmFwc2hvdHRlZCByZXNvbHZlciBjb21taXR0ZWUgYW5kIGlzIGFsc28gdGhlCmFzc2VydGlvbidzIGFzc2VydGVyIG9yIGRpc3B1dGVyLiBBIHBhcnR5IHZvdGluZyBvbiB0aGVpciBvd24gY2FzZQpiaWFzZXMgKGFuZCwgb24gYSBzaXplLTEgY29tbWl0dGVlLCBkZXRlcm1pbmVzKSB0aGUgb3V0Y29tZS4AAAAACFNlbGZWb3RlAAAAGwAAAEFUaGUgdG9rZW4gdHJhbnNmZXIgZGlkIG5vdCByZXN1bHQgaW4gdGhlIGV4cGVjdGVkIGJhbGFuY2UgY2hhbmdlLgAAAAAAABVUb2tlblRyYW5zZmVyTWlzbWF0Y2gAAAAAAAAc", "AAAAAgAAAAAAAAAAAAAABlN0YXR1cwAAAAAAAwAAAAAAAAAAAAAAB1BlbmRpbmcAAAAAAAAAAAAAAAAIRGlzcHV0ZWQAAAAAAAAAAAAAAAhSZXNvbHZlZA==", "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAADQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAAAAAAAAAAAFVG9rZW4AAAAAAAAAAAAAAAAAAApCb25kQW1vdW50AAAAAAAAAAAAAAAAAA9DaGFsbGVuZ2VXaW5kb3cAAAAAAAAAAAAAAAAJUmVzb2x2ZXJzAAAAAAAAAQAAAAAAAAAJQXNzZXJ0aW9uAAAAAAAAAQAAAAYAAAAAAAAAAAAAAAZOZXh0SWQAAAAAAAAAAAAAAAAABlBhdXNlZAAAAAAAAAAAAMhCYXNpcyBwb2ludHMgKDDigJMxMDAwKSBvZiB0aGUgYm9uZCBwYWlkIHRvIHdob2V2ZXIgY2FsbHMgYGZpbmFsaXplYCBhcwphbiBpbmNlbnRpdmUgZm9yIHByb21wdCBmaW5hbGl6YXRpb24uIDAgbWVhbnMgbm8gcmV3YXJkIGlzIHRha2VuOyB0aGUKZnVsbCBib25kIGlzIHJldHVybmVkIHRvIHRoZSBhc3NlcnRlciAob3JpZ2luYWwgYmVoYXZpb3IpLgAAABFGaW5hbGl6ZVJld2FyZEJwcwAAAAAAAAAAAAAAAAAAEFJvdGF0aW9uUHJvcG9zYWwAAAAAAAAAAAAAABVBZG1pblJvdGF0aW9uUHJvcG9zYWwAAAAAAAAAAAABR1NlY29uZHMgYWZ0ZXIgYGRpc3B1dGVgIG9wZW5zIGR1cmluZyB3aGljaCBgcmVzb2x2ZWAgbXVzdCByZWFjaCBhCnN0cmljdCBtYWpvcml0eSBiZWZvcmUgYHJlY2xhaW1fc3RhbGxlZF9kaXNwdXRlYCBiZWNvbWVzIGNhbGxhYmxlLgpVbnNldCBtZWFucyAwOiB0aGUgc3RhbGxlZC1kaXNwdXRlIGZhbGxiYWNrIGlzIGRpc2FibGVkIGVudGlyZWx5LCBubwpwZXJtaXNzaW9ubGVzcyByZWNvdmVyeSBwYXRoIGV4aXN0cyBhbmQgYm9uZHMgY2FuIHJlbWFpbiBmcm96ZW4KaW5kZWZpbml0ZWx5LCB0aGUgcHJlLSMxNjYgYmVoYXZpb3IuIFNlZSBgc2V0X3N0YWxsX3RpbWVvdXRgLgAAAAAQU3RhbGxUaW1lb3V0U2VjcwAAAAEAAAFRV2hlbiBgZGlzcHV0ZWAgd2FzIGNhbGxlZCBmb3IgYXNzZXJ0aW9uIGB1NjRgLiBLZXB0IGFzIGEgc2VwYXJhdGUKc3RvcmFnZSBrZXkgcmF0aGVyIHRoYW4gYSBmaWVsZCBvbiBgQXNzZXJ0aW9uYCBzbyBhZGRpbmcgaXQgZG9lcyBub3QKYnJlYWsgZGVjb2Rpbmcgb2YgYXNzZXJ0aW9ucyBhbHJlYWR5IHBlcnNpc3RlZCBiZWZvcmUgdGhpcyB1cGdyYWRlCigjMTg0KS4gYE5vbmVgIG1lYW5zIHRoZSBhc3NlcnRpb24gd2FzIGRpc3B1dGVkIGJlZm9yZSB0aGlzIHVwZ3JhZGUKb3IgaXMgc3RpbGwgcGVuZGluZzsgYFNvbWUodHMpYCBpcyB0aGUgbGVkZ2VyIHRpbWVzdGFtcCBhdCBkaXNwdXRlLgAAAAAAAApEaXNwdXRlZEF0AAAAAAABAAAABg==", "AAAAAAAAAE5EaXNwdXRlcyBhIHBlbmRpbmcgYXNzZXJ0aW9uIHdpdGhpbiB0aGUgY2hhbGxlbmdlIHdpbmRvdyBieSBtYXRjaGluZyBpdHMgYm9uZC4AAAAAAAdkaXNwdXRlAAAAAAIAAAAAAAAACGRpc3B1dGVyAAAAEwAAAAAAAAACaWQAAAAAAAYAAAABAAAD6QAAAAIAAAAD", From 1721d90dea96cf01653c4c6e05b4d811b39dd619 Mon Sep 17 00:00:00 2001 From: xtep103 Date: Mon, 14 Sep 2026 09:45:30 +0100 Subject: [PATCH 5/7] fix(tholos): account for fee-on-transfer token escrow --- contracts/tholos/src/lib.rs | 73 +++++++++++++++++++++++++++++++++---- 1 file changed, 65 insertions(+), 8 deletions(-) diff --git a/contracts/tholos/src/lib.rs b/contracts/tholos/src/lib.rs index afaecd9..7587bfd 100644 --- a/contracts/tholos/src/lib.rs +++ b/contracts/tholos/src/lib.rs @@ -190,6 +190,7 @@ pub enum DataKey { ChallengeWindow, Resolvers, Assertion(u64), + AssertionEscrow(u64), NextId, Paused, /// Basis points (0–1000) of the bond paid to whoever calls `finalize` as @@ -1008,7 +1009,7 @@ impl Tholos { // transfer can't be allocated the same not-yet-incremented id. let id: u64 = Self::get(&env, &DataKey::NextId)?; env.storage().instance().set(&DataKey::NextId, &(id + 1)); - let mut assertion = Assertion { + let assertion = Assertion { asserter: asserter.clone(), final_outcome: None, outcome, @@ -1024,16 +1025,35 @@ impl Tholos { finalizer: None, }; Self::set_assertion(&env, id, &assertion); + // Initialize escrow before the external token transfer. + // This ensures a reentrant dispute accounts only for the amount + // actually received, rather than falling back to the nominal bond. + Self::set_assertion_escrow(&env, id, 0); let token_id: Address = Self::get(&env, &DataKey::Token)?; let token_client = token::Client::new(&env, &token_id); let received = Self::transfer_in(&env, &token_client, &asserter, bond_amount)?; - if received != bond_amount { - assertion.bond = received; - Self::set_assertion(&env, id, &assertion); + // The token transfer is an external call and may re-enter Tholos. + // Reload the assertion so a reentrant dispute cannot be overwritten + // by the stale pre-transfer snapshot. + let current_assertion = Self::get_assertion(&env, id)?; + + if current_assertion.status == Status::Pending + || current_assertion.status == Status::Disputed + { + let mut updated_assertion = current_assertion.clone(); + updated_assertion.bond = received; + Self::set_assertion(&env, id, &updated_assertion); } + // Add this deposit to whatever escrow was already recorded. + // In a reentrant dispute, the disputer's deposit is already there. + let escrow = Self::get_assertion_escrow(&env, id, ¤t_assertion) + .checked_add(received) + .ok_or(Error::TokenTransferMismatch)?; + + Self::set_assertion_escrow(&env, id, escrow); Asserted { id, asserter, @@ -1098,7 +1118,13 @@ impl Tholos { let token_id: Address = Self::get(&env, &DataKey::Token)?; let token_client = token::Client::new(&env, &token_id); - Self::transfer_in(&env, &token_client, &disputer, assertion.bond)?; + let received = Self::transfer_in(&env, &token_client, &disputer, assertion.bond)?; + + let escrow = Self::get_assertion_escrow(&env, id, &assertion) + .checked_add(received) + .ok_or(Error::TokenTransferMismatch)?; + + Self::set_assertion_escrow(&env, id, escrow); Disputed { id, disputer }.publish(&env); @@ -1139,9 +1165,14 @@ impl Tholos { return Err(Error::ChallengeWindowOpen); } + let escrow = Self::get_assertion_escrow(&env, id, &assertion); + let reward_bps: u32 = Self::get(&env, &DataKey::FinalizeRewardBps)?; let reward = if reward_bps > 0 { - assertion.bond * (reward_bps as i128) / 10_000 + escrow + .checked_mul(reward_bps as i128) + .ok_or(Error::TokenTransferMismatch)? + / 10_000 } else { 0 }; @@ -1158,7 +1189,7 @@ impl Tholos { let token_client = token::Client::new(&env, &token_id); let contract_balance = token_client.balance(&env.current_contract_address()); - if assertion.bond > contract_balance { + if escrow > contract_balance { return Err(Error::TokenTransferMismatch); } @@ -1169,7 +1200,7 @@ impl Tholos { token_client.transfer(&env.current_contract_address(), &caller, &reward); } - let asserter_payout = assertion.bond - reward; + let asserter_payout = escrow - reward; token_client.transfer( &env.current_contract_address(), &assertion.asserter, @@ -1253,10 +1284,13 @@ impl Tholos { let token_client = token::Client::new(&env, &token_id); let contract_balance = token_client.balance(&env.current_contract_address()); + let escrow = Self::get_assertion_escrow(&env, id, &assertion); + let payout = assertion .bond .checked_mul(2) .ok_or(Error::TokenTransferMismatch)? + .min(escrow) .min(contract_balance); let winner = if winner_is_asserter { @@ -1316,6 +1350,29 @@ impl Tholos { ); } + fn get_assertion_escrow(env: &Env, id: u64, assertion: &Assertion) -> i128 { + env.storage() + .persistent() + .get(&DataKey::AssertionEscrow(id)) + .unwrap_or_else(|| { + if assertion.status == Status::Disputed { + assertion.bond.checked_mul(2).unwrap_or(assertion.bond) + } else { + assertion.bond + } + }) + } + + fn set_assertion_escrow(env: &Env, id: u64, amount: i128) { + let key = DataKey::AssertionEscrow(id); + env.storage().persistent().set(&key, &amount); + env.storage().persistent().extend_ttl( + &key, + ASSERTION_LIFETIME_THRESHOLD, + ASSERTION_BUMP_AMOUNT, + ); + } + /// Renews instance storage TTL. Called from every state-changing /// entrypoint besides `initialize` (which already extends TTL on the /// same write that creates the instance entries), mirroring how From 795a69de7c15dfa8b8bc9fb79c87f3c38d1434e4 Mon Sep 17 00:00:00 2001 From: Ezedike-egwom Collins Date: Mon, 14 Sep 2026 18:07:13 +0100 Subject: [PATCH 6/7] fix(tholos): regenerate sdk bindings, changelog entry, and escrow snapshots for fee-on-transfer fix --- contracts/tholos/src/test.rs | 9 +++- ...imeout_returns_both_bonds_no_winner.1.json | 27 ++++++++++ ..._timeout_requires_normal_resolution.1.json | 27 ++++++++++ .../test_reclaim_blocked_while_paused.1.json | 27 ++++++++++ ..._reclaim_disabled_with_zero_timeout.1.json | 27 ++++++++++ ...d_it_only_affects_future_assertions.1.json | 54 +++++++++++++++++++ .../test_admin_can_update_resolvers.1.json | 27 ++++++++++ ...est_assert_outcome_is_not_reentrant.1.json | 27 ++++++++++ ...serter_cannot_dispute_own_assertion.1.json | 27 ++++++++++ ...rage_ttl_is_extended_on_every_write.1.json | 27 ++++++++++ ..._cannot_dispute_after_window_closes.1.json | 27 ++++++++++ ...spute_an_already_disputed_assertion.1.json | 27 ++++++++++ ...annot_finalize_before_window_closes.1.json | 27 ++++++++++ ...ot_resolve_a_non_disputed_assertion.1.json | 27 ++++++++++ ...nnot_update_resolvers_to_duplicates.1.json | 27 ++++++++++ .../test/test_dispute_is_not_reentrant.1.json | 27 ++++++++++ ...test_disputed_assertion_pays_winner.1.json | 27 ++++++++++ ...ransfer_dispute_uses_actual_deposit.1.json | 27 ++++++++++ ...fee_on_transfer_records_actual_bond.1.json | 27 ++++++++++ ...sfer_resolve_uses_available_balance.1.json | 28 ++++++++++ .../test_finalize_is_not_reentrant.1.json | 27 ++++++++++ .../test/test_finalize_max_reward_bps.1.json | 27 ++++++++++ ...quires_auth_when_reward_bps_is_zero.1.json | 27 ++++++++++ ...flow_at_max_bond_and_max_reward_bps.1.json | 27 ++++++++++ ..._paused_then_succeeds_after_unpause.1.json | 27 ++++++++++ ...ith_reward_pays_caller_and_asserter.1.json | 27 ++++++++++ ...lize_zero_reward_full_bond_returned.1.json | 27 ++++++++++ ...is_extended_by_state_changing_calls.1.json | 27 ++++++++++ ...est_neutral_resolver_can_still_vote.1.json | 27 ++++++++++ .../test/test_non_resolver_cannot_vote.1.json | 27 ++++++++++ ..._blocks_assert_dispute_and_finalize.1.json | 54 +++++++++++++++++++ .../test/test_resolve_is_not_reentrant.1.json | 27 ++++++++++ ...asserted_outcome_when_asserter_wins.1.json | 27 ++++++++++ ...st_resolver_cannot_vote_as_asserter.1.json | 27 ++++++++++ ...st_resolver_cannot_vote_as_disputer.1.json | 27 ++++++++++ .../test_resolver_cannot_vote_twice.1.json | 27 ++++++++++ ...pdated_mid_dispute_do_not_affect_it.1.json | 27 ++++++++++ ...n_does_not_affect_in_flight_dispute.1.json | 27 ++++++++++ .../test/test_rotation_is_pause_exempt.1.json | 27 ++++++++++ ...ion_requires_majority_then_executes.1.json | 27 ++++++++++ ...resolve_when_stall_timeout_is_unset.1.json | 27 ++++++++++ ...ajority_when_stall_timeout_is_unset.1.json | 27 ++++++++++ ...lit_resolver_vote_does_not_finalize.1.json | 27 ++++++++++ ...est_uncontested_assertion_finalizes.1.json | 27 ++++++++++ docs/src/CHANGELOG.md | 11 ++++ packages/tholos-sdk/src/index.ts | 4 +- 46 files changed, 1236 insertions(+), 4 deletions(-) diff --git a/contracts/tholos/src/test.rs b/contracts/tholos/src/test.rs index af42b17..425aaeb 100644 --- a/contracts/tholos/src/test.rs +++ b/contracts/tholos/src/test.rs @@ -2292,8 +2292,13 @@ fn test_fee_on_transfer_resolve_uses_available_balance() { client.resolve(&resolvers.get(0).unwrap(), &id, &true); client.resolve(&resolvers.get(1).unwrap(), &id, &true); - // The resolver payout must not exceed the contract's actual balance. - assert!(fee_token.balance(&contract_id) >= 0); + // The payout is capped by the actual escrow (171), not the nominal + // 2 x bond (200): the contract sends its entire escrow to the winning + // asserter and is drained to exactly zero. The fee token also charges + // its fee on the outgoing transfer, so the asserter receives + // 171 - 17 = 154 on top of the 900 left after posting the bond. + assert_eq!(fee_token.balance(&contract_id), 0); + assert_eq!(fee_token.balance(&asserter), 900 + 154); } // --------------------------------------------------------------------------- // Property-based tests for resolver vote counting and majority logic diff --git a/contracts/tholos/test_snapshots/test/stalled_dispute/test_reclaim_after_timeout_returns_both_bonds_no_winner.1.json b/contracts/tholos/test_snapshots/test/stalled_dispute/test_reclaim_after_timeout_returns_both_bonds_no_winner.1.json index ad5e416..912c7ce 100644 --- a/contracts/tholos/test_snapshots/test/stalled_dispute/test_reclaim_after_timeout_returns_both_bonds_no_winner.1.json +++ b/contracts/tholos/test_snapshots/test/stalled_dispute/test_reclaim_after_timeout_returns_both_bonds_no_winner.1.json @@ -593,6 +593,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/stalled_dispute/test_reclaim_before_timeout_requires_normal_resolution.1.json b/contracts/tholos/test_snapshots/test/stalled_dispute/test_reclaim_before_timeout_requires_normal_resolution.1.json index 2e6b860..c75b027 100644 --- a/contracts/tholos/test_snapshots/test/stalled_dispute/test_reclaim_before_timeout_requires_normal_resolution.1.json +++ b/contracts/tholos/test_snapshots/test/stalled_dispute/test_reclaim_before_timeout_requires_normal_resolution.1.json @@ -665,6 +665,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/stalled_dispute/test_reclaim_blocked_while_paused.1.json b/contracts/tholos/test_snapshots/test/stalled_dispute/test_reclaim_blocked_while_paused.1.json index 8e4697e..a8858ff 100644 --- a/contracts/tholos/test_snapshots/test/stalled_dispute/test_reclaim_blocked_while_paused.1.json +++ b/contracts/tholos/test_snapshots/test/stalled_dispute/test_reclaim_blocked_while_paused.1.json @@ -664,6 +664,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/stalled_dispute/test_reclaim_disabled_with_zero_timeout.1.json b/contracts/tholos/test_snapshots/test/stalled_dispute/test_reclaim_disabled_with_zero_timeout.1.json index fe7bfdc..dda2f8b 100644 --- a/contracts/tholos/test_snapshots/test/stalled_dispute/test_reclaim_disabled_with_zero_timeout.1.json +++ b/contracts/tholos/test_snapshots/test/stalled_dispute/test_reclaim_disabled_with_zero_timeout.1.json @@ -563,6 +563,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_admin_can_set_bond_amount_and_it_only_affects_future_assertions.1.json b/contracts/tholos/test_snapshots/test/test_admin_can_set_bond_amount_and_it_only_affects_future_assertions.1.json index 9f019c9..ad0f92e 100644 --- a/contracts/tholos/test_snapshots/test/test_admin_can_set_bond_amount_and_it_only_affects_future_assertions.1.json +++ b/contracts/tholos/test_snapshots/test/test_admin_can_set_bond_amount_and_it_only_affects_future_assertions.1.json @@ -660,6 +660,60 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "1" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_admin_can_update_resolvers.1.json b/contracts/tholos/test_snapshots/test/test_admin_can_update_resolvers.1.json index d4aca9a..a2cc8fc 100644 --- a/contracts/tholos/test_snapshots/test/test_admin_can_update_resolvers.1.json +++ b/contracts/tholos/test_snapshots/test/test_admin_can_update_resolvers.1.json @@ -591,6 +591,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_assert_outcome_is_not_reentrant.1.json b/contracts/tholos/test_snapshots/test/test_assert_outcome_is_not_reentrant.1.json index 40df28a..b15e45e 100644 --- a/contracts/tholos/test_snapshots/test/test_assert_outcome_is_not_reentrant.1.json +++ b/contracts/tholos/test_snapshots/test/test_assert_outcome_is_not_reentrant.1.json @@ -356,6 +356,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_asserter_cannot_dispute_own_assertion.1.json b/contracts/tholos/test_snapshots/test/test_asserter_cannot_dispute_own_assertion.1.json index 6666873..13a57d5 100644 --- a/contracts/tholos/test_snapshots/test/test_asserter_cannot_dispute_own_assertion.1.json +++ b/contracts/tholos/test_snapshots/test/test_asserter_cannot_dispute_own_assertion.1.json @@ -389,6 +389,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_assertion_storage_ttl_is_extended_on_every_write.1.json b/contracts/tholos/test_snapshots/test/test_assertion_storage_ttl_is_extended_on_every_write.1.json index f40e0bf..5e76741 100644 --- a/contracts/tholos/test_snapshots/test/test_assertion_storage_ttl_is_extended_on_every_write.1.json +++ b/contracts/tholos/test_snapshots/test/test_assertion_storage_ttl_is_extended_on_every_write.1.json @@ -483,6 +483,33 @@ }, "live_until": 1036790 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 1036790 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_cannot_dispute_after_window_closes.1.json b/contracts/tholos/test_snapshots/test/test_cannot_dispute_after_window_closes.1.json index f8fe998..a25b004 100644 --- a/contracts/tholos/test_snapshots/test/test_cannot_dispute_after_window_closes.1.json +++ b/contracts/tholos/test_snapshots/test/test_cannot_dispute_after_window_closes.1.json @@ -427,6 +427,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_cannot_dispute_an_already_disputed_assertion.1.json b/contracts/tholos/test_snapshots/test/test_cannot_dispute_an_already_disputed_assertion.1.json index 1f6bdf5..5ca914b 100644 --- a/contracts/tholos/test_snapshots/test/test_cannot_dispute_an_already_disputed_assertion.1.json +++ b/contracts/tholos/test_snapshots/test/test_cannot_dispute_an_already_disputed_assertion.1.json @@ -524,6 +524,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_cannot_finalize_before_window_closes.1.json b/contracts/tholos/test_snapshots/test/test_cannot_finalize_before_window_closes.1.json index 38adc46..56062ed 100644 --- a/contracts/tholos/test_snapshots/test/test_cannot_finalize_before_window_closes.1.json +++ b/contracts/tholos/test_snapshots/test/test_cannot_finalize_before_window_closes.1.json @@ -385,6 +385,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_cannot_resolve_a_non_disputed_assertion.1.json b/contracts/tholos/test_snapshots/test/test_cannot_resolve_a_non_disputed_assertion.1.json index e22f9bd..2cb0b8a 100644 --- a/contracts/tholos/test_snapshots/test/test_cannot_resolve_a_non_disputed_assertion.1.json +++ b/contracts/tholos/test_snapshots/test/test_cannot_resolve_a_non_disputed_assertion.1.json @@ -385,6 +385,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_cannot_update_resolvers_to_duplicates.1.json b/contracts/tholos/test_snapshots/test/test_cannot_update_resolvers_to_duplicates.1.json index d534dcf..c84be47 100644 --- a/contracts/tholos/test_snapshots/test/test_cannot_update_resolvers_to_duplicates.1.json +++ b/contracts/tholos/test_snapshots/test/test_cannot_update_resolvers_to_duplicates.1.json @@ -582,6 +582,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_dispute_is_not_reentrant.1.json b/contracts/tholos/test_snapshots/test/test_dispute_is_not_reentrant.1.json index eec363a..2e02903 100644 --- a/contracts/tholos/test_snapshots/test/test_dispute_is_not_reentrant.1.json +++ b/contracts/tholos/test_snapshots/test/test_dispute_is_not_reentrant.1.json @@ -399,6 +399,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_disputed_assertion_pays_winner.1.json b/contracts/tholos/test_snapshots/test/test_disputed_assertion_pays_winner.1.json index f86b2f6..845cec9 100644 --- a/contracts/tholos/test_snapshots/test/test_disputed_assertion_pays_winner.1.json +++ b/contracts/tholos/test_snapshots/test/test_disputed_assertion_pays_winner.1.json @@ -585,6 +585,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json index 4342ca6..4623746 100644 --- a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json +++ b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json @@ -374,6 +374,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "171" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json index 1b17bde..90987be 100644 --- a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json +++ b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json @@ -331,6 +331,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "90" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json index 2f984f6..cbcfaed 100644 --- a/contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json +++ b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json @@ -164,6 +164,7 @@ } ] ], + [], [] ], "ledger": { @@ -472,6 +473,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "171" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_finalize_is_not_reentrant.1.json b/contracts/tholos/test_snapshots/test/test_finalize_is_not_reentrant.1.json index 9a4a20b..2199f57 100644 --- a/contracts/tholos/test_snapshots/test/test_finalize_is_not_reentrant.1.json +++ b/contracts/tholos/test_snapshots/test/test_finalize_is_not_reentrant.1.json @@ -372,6 +372,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_finalize_max_reward_bps.1.json b/contracts/tholos/test_snapshots/test/test_finalize_max_reward_bps.1.json index 6b03d68..f1c9ded 100644 --- a/contracts/tholos/test_snapshots/test/test_finalize_max_reward_bps.1.json +++ b/contracts/tholos/test_snapshots/test/test_finalize_max_reward_bps.1.json @@ -412,6 +412,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_finalize_requires_auth_when_reward_bps_is_zero.1.json b/contracts/tholos/test_snapshots/test/test_finalize_requires_auth_when_reward_bps_is_zero.1.json index 8f2d465..05e087a 100644 --- a/contracts/tholos/test_snapshots/test/test_finalize_requires_auth_when_reward_bps_is_zero.1.json +++ b/contracts/tholos/test_snapshots/test/test_finalize_requires_auth_when_reward_bps_is_zero.1.json @@ -411,6 +411,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_finalize_reward_multiply_does_not_overflow_at_max_bond_and_max_reward_bps.1.json b/contracts/tholos/test_snapshots/test/test_finalize_reward_multiply_does_not_overflow_at_max_bond_and_max_reward_bps.1.json index 9efc90d..547f689 100644 --- a/contracts/tholos/test_snapshots/test/test_finalize_reward_multiply_does_not_overflow_at_max_bond_and_max_reward_bps.1.json +++ b/contracts/tholos/test_snapshots/test/test_finalize_reward_multiply_does_not_overflow_at_max_bond_and_max_reward_bps.1.json @@ -412,6 +412,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "170141183460469231731687303715884105" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_finalize_with_reward_blocked_while_paused_then_succeeds_after_unpause.1.json b/contracts/tholos/test_snapshots/test/test_finalize_with_reward_blocked_while_paused_then_succeeds_after_unpause.1.json index 0649a3a..24a0570 100644 --- a/contracts/tholos/test_snapshots/test/test_finalize_with_reward_blocked_while_paused_then_succeeds_after_unpause.1.json +++ b/contracts/tholos/test_snapshots/test/test_finalize_with_reward_blocked_while_paused_then_succeeds_after_unpause.1.json @@ -491,6 +491,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_finalize_with_reward_pays_caller_and_asserter.1.json b/contracts/tholos/test_snapshots/test/test_finalize_with_reward_pays_caller_and_asserter.1.json index 7efb990..1692d19 100644 --- a/contracts/tholos/test_snapshots/test/test_finalize_with_reward_pays_caller_and_asserter.1.json +++ b/contracts/tholos/test_snapshots/test/test_finalize_with_reward_pays_caller_and_asserter.1.json @@ -414,6 +414,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_finalize_zero_reward_full_bond_returned.1.json b/contracts/tholos/test_snapshots/test/test_finalize_zero_reward_full_bond_returned.1.json index d781c7d..cfcc36d 100644 --- a/contracts/tholos/test_snapshots/test/test_finalize_zero_reward_full_bond_returned.1.json +++ b/contracts/tholos/test_snapshots/test/test_finalize_zero_reward_full_bond_returned.1.json @@ -412,6 +412,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_instance_storage_ttl_is_extended_by_state_changing_calls.1.json b/contracts/tholos/test_snapshots/test/test_instance_storage_ttl_is_extended_by_state_changing_calls.1.json index b1fd84b..ffbb9aa 100644 --- a/contracts/tholos/test_snapshots/test/test_instance_storage_ttl_is_extended_by_state_changing_calls.1.json +++ b/contracts/tholos/test_snapshots/test/test_instance_storage_ttl_is_extended_by_state_changing_calls.1.json @@ -386,6 +386,33 @@ }, "live_until": 1036790 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100" + } + } + }, + "ext": "v0" + }, + "live_until": 1036790 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_neutral_resolver_can_still_vote.1.json b/contracts/tholos/test_snapshots/test/test_neutral_resolver_can_still_vote.1.json index 3f59f66..d461972 100644 --- a/contracts/tholos/test_snapshots/test/test_neutral_resolver_can_still_vote.1.json +++ b/contracts/tholos/test_snapshots/test/test_neutral_resolver_can_still_vote.1.json @@ -531,6 +531,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_non_resolver_cannot_vote.1.json b/contracts/tholos/test_snapshots/test/test_non_resolver_cannot_vote.1.json index 0a74f17..1c9a8b5 100644 --- a/contracts/tholos/test_snapshots/test/test_non_resolver_cannot_vote.1.json +++ b/contracts/tholos/test_snapshots/test/test_non_resolver_cannot_vote.1.json @@ -482,6 +482,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_paused_blocks_assert_dispute_and_finalize.1.json b/contracts/tholos/test_snapshots/test/test_paused_blocks_assert_dispute_and_finalize.1.json index a6ce245..65e27b5 100644 --- a/contracts/tholos/test_snapshots/test/test_paused_blocks_assert_dispute_and_finalize.1.json +++ b/contracts/tholos/test_snapshots/test/test_paused_blocks_assert_dispute_and_finalize.1.json @@ -803,6 +803,60 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "1" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_resolve_is_not_reentrant.1.json b/contracts/tholos/test_snapshots/test/test_resolve_is_not_reentrant.1.json index 1bdb757..8355264 100644 --- a/contracts/tholos/test_snapshots/test/test_resolve_is_not_reentrant.1.json +++ b/contracts/tholos/test_snapshots/test/test_resolve_is_not_reentrant.1.json @@ -487,6 +487,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_resolve_records_asserted_outcome_when_asserter_wins.1.json b/contracts/tholos/test_snapshots/test/test_resolve_records_asserted_outcome_when_asserter_wins.1.json index 78a936a..a8f2316 100644 --- a/contracts/tholos/test_snapshots/test/test_resolve_records_asserted_outcome_when_asserter_wins.1.json +++ b/contracts/tholos/test_snapshots/test/test_resolve_records_asserted_outcome_when_asserter_wins.1.json @@ -581,6 +581,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_resolver_cannot_vote_as_asserter.1.json b/contracts/tholos/test_snapshots/test/test_resolver_cannot_vote_as_asserter.1.json index b60df2f..50fab49 100644 --- a/contracts/tholos/test_snapshots/test/test_resolver_cannot_vote_as_asserter.1.json +++ b/contracts/tholos/test_snapshots/test/test_resolver_cannot_vote_as_asserter.1.json @@ -503,6 +503,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_resolver_cannot_vote_as_disputer.1.json b/contracts/tholos/test_snapshots/test/test_resolver_cannot_vote_as_disputer.1.json index 057db0b..c2dd690 100644 --- a/contracts/tholos/test_snapshots/test/test_resolver_cannot_vote_as_disputer.1.json +++ b/contracts/tholos/test_snapshots/test/test_resolver_cannot_vote_as_disputer.1.json @@ -503,6 +503,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_resolver_cannot_vote_twice.1.json b/contracts/tholos/test_snapshots/test/test_resolver_cannot_vote_twice.1.json index 3f59f66..d461972 100644 --- a/contracts/tholos/test_snapshots/test/test_resolver_cannot_vote_twice.1.json +++ b/contracts/tholos/test_snapshots/test/test_resolver_cannot_vote_twice.1.json @@ -531,6 +531,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_resolvers_updated_mid_dispute_do_not_affect_it.1.json b/contracts/tholos/test_snapshots/test/test_resolvers_updated_mid_dispute_do_not_affect_it.1.json index f55d759..fc3e277 100644 --- a/contracts/tholos/test_snapshots/test/test_resolvers_updated_mid_dispute_do_not_affect_it.1.json +++ b/contracts/tholos/test_snapshots/test/test_resolvers_updated_mid_dispute_do_not_affect_it.1.json @@ -631,6 +631,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_rotation_does_not_affect_in_flight_dispute.1.json b/contracts/tholos/test_snapshots/test/test_rotation_does_not_affect_in_flight_dispute.1.json index 7029e47..e33568b 100644 --- a/contracts/tholos/test_snapshots/test/test_rotation_does_not_affect_in_flight_dispute.1.json +++ b/contracts/tholos/test_snapshots/test/test_rotation_does_not_affect_in_flight_dispute.1.json @@ -711,6 +711,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_rotation_is_pause_exempt.1.json b/contracts/tholos/test_snapshots/test/test_rotation_is_pause_exempt.1.json index 7e46bcb..21cfd22 100644 --- a/contracts/tholos/test_snapshots/test/test_rotation_is_pause_exempt.1.json +++ b/contracts/tholos/test_snapshots/test/test_rotation_is_pause_exempt.1.json @@ -768,6 +768,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_rotation_requires_majority_then_executes.1.json b/contracts/tholos/test_snapshots/test/test_rotation_requires_majority_then_executes.1.json index 557f8e6..e87b812 100644 --- a/contracts/tholos/test_snapshots/test/test_rotation_requires_majority_then_executes.1.json +++ b/contracts/tholos/test_snapshots/test/test_rotation_requires_majority_then_executes.1.json @@ -691,6 +691,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_size_one_conflicted_committee_cannot_resolve_when_stall_timeout_is_unset.1.json b/contracts/tholos/test_snapshots/test/test_size_one_conflicted_committee_cannot_resolve_when_stall_timeout_is_unset.1.json index 4c193a6..4767047 100644 --- a/contracts/tholos/test_snapshots/test/test_size_one_conflicted_committee_cannot_resolve_when_stall_timeout_is_unset.1.json +++ b/contracts/tholos/test_snapshots/test/test_size_one_conflicted_committee_cannot_resolve_when_stall_timeout_is_unset.1.json @@ -496,6 +496,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_size_three_both_parties_on_committee_cannot_reach_majority_when_stall_timeout_is_unset.1.json b/contracts/tholos/test_snapshots/test/test_size_three_both_parties_on_committee_cannot_reach_majority_when_stall_timeout_is_unset.1.json index e0e2f4b..cfa4ac4 100644 --- a/contracts/tholos/test_snapshots/test/test_size_three_both_parties_on_committee_cannot_reach_majority_when_stall_timeout_is_unset.1.json +++ b/contracts/tholos/test_snapshots/test/test_size_three_both_parties_on_committee_cannot_reach_majority_when_stall_timeout_is_unset.1.json @@ -575,6 +575,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_split_resolver_vote_does_not_finalize.1.json b/contracts/tholos/test_snapshots/test/test_split_resolver_vote_does_not_finalize.1.json index b9bf750..14fe721 100644 --- a/contracts/tholos/test_snapshots/test/test_split_resolver_vote_does_not_finalize.1.json +++ b/contracts/tholos/test_snapshots/test/test_split_resolver_vote_does_not_finalize.1.json @@ -532,6 +532,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "200" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/tholos/test_snapshots/test/test_uncontested_assertion_finalizes.1.json b/contracts/tholos/test_snapshots/test/test_uncontested_assertion_finalizes.1.json index 6251399..1bc477b 100644 --- a/contracts/tholos/test_snapshots/test/test_uncontested_assertion_finalizes.1.json +++ b/contracts/tholos/test_snapshots/test/test_uncontested_assertion_finalizes.1.json @@ -416,6 +416,33 @@ }, "live_until": 518400 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100" + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/docs/src/CHANGELOG.md b/docs/src/CHANGELOG.md index f9397af..3d51486 100644 --- a/docs/src/CHANGELOG.md +++ b/docs/src/CHANGELOG.md @@ -271,6 +271,17 @@ All notable changes to this project are documented here. Format follows contract addresses (`tholos_id`, `token_id`) rather than caller arguments to prevent unauthorized fund drain. Closes #157. +- `contracts/tholos`: bonds and dispute deposits are now recorded as the + amount the contract actually received (measured by balance delta across the + transfer) rather than the nominal requested amount, with a per-assertion + escrow balance tracked separately and resolution payouts capped by both the + escrow and the contract's live token balance. Previously a fee-on-transfer + token could leave the recorded bond larger than the tokens actually held, + deadlocking a disputed assertion since `resolve` required transferring a + payout the contract could never cover. Adds `Error::TokenTransferMismatch + = 28` for transfers whose received amount is non-positive or overflows + accounting. Closes #164. + ## [0.3.0] - 2026-08-08 ### Added diff --git a/packages/tholos-sdk/src/index.ts b/packages/tholos-sdk/src/index.ts index 791ec61..18a34fc 100644 --- a/packages/tholos-sdk/src/index.ts +++ b/packages/tholos-sdk/src/index.ts @@ -100,7 +100,7 @@ export const Errors = { export type Status = {tag: "Pending", values: void} | {tag: "Disputed", values: void} | {tag: "Resolved", values: void}; -export type DataKey = {tag: "Admin", values: void} | {tag: "Token", values: void} | {tag: "BondAmount", values: void} | {tag: "ChallengeWindow", values: void} | {tag: "Resolvers", values: void} | {tag: "Assertion", values: readonly [u64]} | {tag: "NextId", values: void} | {tag: "Paused", values: void} | {tag: "FinalizeRewardBps", values: void} | {tag: "RotationProposal", values: void} | {tag: "AdminRotationProposal", values: void} | {tag: "StallTimeoutSecs", values: void} | {tag: "DisputedAt", values: readonly [u64]}; +export type DataKey = {tag: "Admin", values: void} | {tag: "Token", values: void} | {tag: "BondAmount", values: void} | {tag: "ChallengeWindow", values: void} | {tag: "Resolvers", values: void} | {tag: "Assertion", values: readonly [u64]} | {tag: "AssertionEscrow", values: readonly [u64]} | {tag: "NextId", values: void} | {tag: "Paused", values: void} | {tag: "FinalizeRewardBps", values: void} | {tag: "RotationProposal", values: void} | {tag: "AdminRotationProposal", values: void} | {tag: "StallTimeoutSecs", values: void} | {tag: "DisputedAt", values: readonly [u64]}; @@ -442,7 +442,7 @@ export class Client extends ContractClient { super( new ContractSpec([ "AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAHAAAAAAAAAASQWxyZWFkeUluaXRpYWxpemVkAAAAAAABAAAAAAAAAA5Ob3RJbml0aWFsaXplZAAAAAAAAgAAAAAAAAAUSW52YWxpZFJlc29sdmVyQ291bnQAAAADAAAAAAAAABFBc3NlcnRpb25Ob3RGb3VuZAAAAAAAAAQAAAAAAAAACk5vdFBlbmRpbmcAAAAAAAUAAAAAAAAAC05vdERpc3B1dGVkAAAAAAYAAAAAAAAAFUNoYWxsZW5nZVdpbmRvd0Nsb3NlZAAAAAAAAAcAAAAAAAAAE0NoYWxsZW5nZVdpbmRvd09wZW4AAAAACAAAAAAAAAAMTm90QVJlc29sdmVyAAAACQAAAAAAAAAMQWxyZWFkeVZvdGVkAAAACgAAAAAAAAAGUGF1c2VkAAAAAAALAAAAPmBib25kX2Ftb3VudGAgd2FzIG5vdCBwb3NpdGl2ZSwgb3IgZXhjZWVkZWQgYE1BWF9CT05EX0FNT1VOVGAuAAAAAAARSW52YWxpZEJvbmRBbW91bnQAAAAAAAAMAAAAAAAAABZJbnZhbGlkQ2hhbGxlbmdlV2luZG93AAAAAAANAAAAAAAAABBUb29NYW55UmVzb2x2ZXJzAAAADgAAAEhgZmluYWxpemVfcmV3YXJkX2Jwc2Agd2FzIGdyZWF0ZXIgdGhhbiBgTUFYX0ZJTkFMSVpFX1JFV0FSRF9CUFNgICgxMDAwKS4AAAAVSW52YWxpZEZpbmFsaXplUmV3YXJkAAAAAAAADwAAAAAAAAASRHVwbGljYXRlUmVzb2x2ZXJzAAAAAAAQAAAAAAAAABJSb3RhdGlvbkluUHJvZ3Jlc3MAAAAAABEAAAAAAAAAEk5vUm90YXRpb25Qcm9wb3NhbAAAAAAAEgAAAAAAAAAWUmVzb2x2ZXJOb3RJbkNvbW1pdHRlZQAAAAAAEwAAAAAAAAAdUm90YXRpb25UYXJnZXRBbHJlYWR5UmVzb2x2ZXIAAAAAAAAUAAAAAAAAAAtOb3RQcm9wb3NlcgAAAAAVAAABGFRoZSBjYWxsZXIgaXMgdGhlIGFzc2VydGVyIG9mIHRoZSBhc3NlcnRpb24gdGhleSBhcmUgdHJ5aW5nIHRvIGRpc3B1dGUuCkFuIGFzc2VydGVyIGRpc3B1dGluZyB0aGVpciBvd24gYXNzZXJ0aW9uIHdvdWxkIGNvbnN1bWUgdGhlIG9uZSBkaXNwdXRlCnNsb3Qgd2l0aG91dCBhbnkgZWNvbm9taWMgcmlzayAodGhleSByZWNlaXZlIGJvdGggYm9uZHMgYmFjayByZWdhcmRsZXNzCm9mIHRoZSByZXNvbHZlciB2b3RlKSwgbnVsbGlmeWluZyB0aGUgYm9uZC1mb3JmZWl0dXJlIGRldGVycmVudC4AAAALU2VsZkRpc3B1dGUAAAAAFgAAAAAAAAAXTm9BZG1pblJvdGF0aW9uUHJvcG9zYWwAAAAAFwAAAMlgcmVjbGFpbV9zdGFsbGVkX2Rpc3B1dGVgIHdhcyBjYWxsZWQgb24gYW4gYXNzZXJ0aW9uIHdob3NlIGRpc3B1dGUKb3BlbmVkIHdpdGhvdXQgYSBzdGFsbCB0aW1lb3V0IGNvbmZpZ3VyZWQgKDAgPSBmYWxsYmFjayBkaXNhYmxlZCksIG9yCndob3NlIGRpc3B1dGVkX2F0IHByZWRhdGVzIHRoaXMgdXBncmFkZSBhbmQgY2Fubm90IGJlIHRpbWVkIG91dC4AAAAAAAAZU3RhbGxUaW1lb3V0Tm90Q29uZmlndXJlZAAAAAAAABgAAACsYHJlY2xhaW1fc3RhbGxlZF9kaXNwdXRlYCB3YXMgY2FsbGVkIGJlZm9yZSB0aGUgc3RhbGwgdGltZW91dCBlbGFwc2VkCnNpbmNlIHRoZSBkaXNwdXRlIG9wZW5lZC4gVGhlIGFzc2VydGlvbiBzdGlsbCByZXF1aXJlcyBub3JtYWwKcmVzb2x1dGlvbiBieSB0aGUgc25hcHNob3R0ZWQgY29tbWl0dGVlLgAAABFEaXNwdXRlTm90U3RhbGxlZAAAAAAAABkAAABSYHNldF9zdGFsbF90aW1lb3V0YCB3YXMgY2FsbGVkIHdpdGggYSB2YWx1ZSBncmVhdGVyIHRoYW4KYE1BWF9TVEFMTF9USU1FT1VUX1NFQ1NgLgAAAAAAE0ludmFsaWRTdGFsbFRpbWVvdXQAAAAAGgAAAMNUaGUgY2FsbGVyIGlzIG9uIHRoZSBzbmFwc2hvdHRlZCByZXNvbHZlciBjb21taXR0ZWUgYW5kIGlzIGFsc28gdGhlCmFzc2VydGlvbidzIGFzc2VydGVyIG9yIGRpc3B1dGVyLiBBIHBhcnR5IHZvdGluZyBvbiB0aGVpciBvd24gY2FzZQpiaWFzZXMgKGFuZCwgb24gYSBzaXplLTEgY29tbWl0dGVlLCBkZXRlcm1pbmVzKSB0aGUgb3V0Y29tZS4AAAAACFNlbGZWb3RlAAAAGwAAAEFUaGUgdG9rZW4gdHJhbnNmZXIgZGlkIG5vdCByZXN1bHQgaW4gdGhlIGV4cGVjdGVkIGJhbGFuY2UgY2hhbmdlLgAAAAAAABVUb2tlblRyYW5zZmVyTWlzbWF0Y2gAAAAAAAAc", "AAAAAgAAAAAAAAAAAAAABlN0YXR1cwAAAAAAAwAAAAAAAAAAAAAAB1BlbmRpbmcAAAAAAAAAAAAAAAAIRGlzcHV0ZWQAAAAAAAAAAAAAAAhSZXNvbHZlZA==", - "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAADQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAAAAAAAAAAAFVG9rZW4AAAAAAAAAAAAAAAAAAApCb25kQW1vdW50AAAAAAAAAAAAAAAAAA9DaGFsbGVuZ2VXaW5kb3cAAAAAAAAAAAAAAAAJUmVzb2x2ZXJzAAAAAAAAAQAAAAAAAAAJQXNzZXJ0aW9uAAAAAAAAAQAAAAYAAAAAAAAAAAAAAAZOZXh0SWQAAAAAAAAAAAAAAAAABlBhdXNlZAAAAAAAAAAAAMhCYXNpcyBwb2ludHMgKDDigJMxMDAwKSBvZiB0aGUgYm9uZCBwYWlkIHRvIHdob2V2ZXIgY2FsbHMgYGZpbmFsaXplYCBhcwphbiBpbmNlbnRpdmUgZm9yIHByb21wdCBmaW5hbGl6YXRpb24uIDAgbWVhbnMgbm8gcmV3YXJkIGlzIHRha2VuOyB0aGUKZnVsbCBib25kIGlzIHJldHVybmVkIHRvIHRoZSBhc3NlcnRlciAob3JpZ2luYWwgYmVoYXZpb3IpLgAAABFGaW5hbGl6ZVJld2FyZEJwcwAAAAAAAAAAAAAAAAAAEFJvdGF0aW9uUHJvcG9zYWwAAAAAAAAAAAAAABVBZG1pblJvdGF0aW9uUHJvcG9zYWwAAAAAAAAAAAABR1NlY29uZHMgYWZ0ZXIgYGRpc3B1dGVgIG9wZW5zIGR1cmluZyB3aGljaCBgcmVzb2x2ZWAgbXVzdCByZWFjaCBhCnN0cmljdCBtYWpvcml0eSBiZWZvcmUgYHJlY2xhaW1fc3RhbGxlZF9kaXNwdXRlYCBiZWNvbWVzIGNhbGxhYmxlLgpVbnNldCBtZWFucyAwOiB0aGUgc3RhbGxlZC1kaXNwdXRlIGZhbGxiYWNrIGlzIGRpc2FibGVkIGVudGlyZWx5LCBubwpwZXJtaXNzaW9ubGVzcyByZWNvdmVyeSBwYXRoIGV4aXN0cyBhbmQgYm9uZHMgY2FuIHJlbWFpbiBmcm96ZW4KaW5kZWZpbml0ZWx5LCB0aGUgcHJlLSMxNjYgYmVoYXZpb3IuIFNlZSBgc2V0X3N0YWxsX3RpbWVvdXRgLgAAAAAQU3RhbGxUaW1lb3V0U2VjcwAAAAEAAAFRV2hlbiBgZGlzcHV0ZWAgd2FzIGNhbGxlZCBmb3IgYXNzZXJ0aW9uIGB1NjRgLiBLZXB0IGFzIGEgc2VwYXJhdGUKc3RvcmFnZSBrZXkgcmF0aGVyIHRoYW4gYSBmaWVsZCBvbiBgQXNzZXJ0aW9uYCBzbyBhZGRpbmcgaXQgZG9lcyBub3QKYnJlYWsgZGVjb2Rpbmcgb2YgYXNzZXJ0aW9ucyBhbHJlYWR5IHBlcnNpc3RlZCBiZWZvcmUgdGhpcyB1cGdyYWRlCigjMTg0KS4gYE5vbmVgIG1lYW5zIHRoZSBhc3NlcnRpb24gd2FzIGRpc3B1dGVkIGJlZm9yZSB0aGlzIHVwZ3JhZGUKb3IgaXMgc3RpbGwgcGVuZGluZzsgYFNvbWUodHMpYCBpcyB0aGUgbGVkZ2VyIHRpbWVzdGFtcCBhdCBkaXNwdXRlLgAAAAAAAApEaXNwdXRlZEF0AAAAAAABAAAABg==", + "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAADgAAAAAAAAAAAAAABUFkbWluAAAAAAAAAAAAAAAAAAAFVG9rZW4AAAAAAAAAAAAAAAAAAApCb25kQW1vdW50AAAAAAAAAAAAAAAAAA9DaGFsbGVuZ2VXaW5kb3cAAAAAAAAAAAAAAAAJUmVzb2x2ZXJzAAAAAAAAAQAAAAAAAAAJQXNzZXJ0aW9uAAAAAAAAAQAAAAYAAAABAAAAAAAAAA9Bc3NlcnRpb25Fc2Nyb3cAAAAAAQAAAAYAAAAAAAAAAAAAAAZOZXh0SWQAAAAAAAAAAAAAAAAABlBhdXNlZAAAAAAAAAAAAMhCYXNpcyBwb2ludHMgKDDigJMxMDAwKSBvZiB0aGUgYm9uZCBwYWlkIHRvIHdob2V2ZXIgY2FsbHMgYGZpbmFsaXplYCBhcwphbiBpbmNlbnRpdmUgZm9yIHByb21wdCBmaW5hbGl6YXRpb24uIDAgbWVhbnMgbm8gcmV3YXJkIGlzIHRha2VuOyB0aGUKZnVsbCBib25kIGlzIHJldHVybmVkIHRvIHRoZSBhc3NlcnRlciAob3JpZ2luYWwgYmVoYXZpb3IpLgAAABFGaW5hbGl6ZVJld2FyZEJwcwAAAAAAAAAAAAAAAAAAEFJvdGF0aW9uUHJvcG9zYWwAAAAAAAAAAAAAABVBZG1pblJvdGF0aW9uUHJvcG9zYWwAAAAAAAAAAAABR1NlY29uZHMgYWZ0ZXIgYGRpc3B1dGVgIG9wZW5zIGR1cmluZyB3aGljaCBgcmVzb2x2ZWAgbXVzdCByZWFjaCBhCnN0cmljdCBtYWpvcml0eSBiZWZvcmUgYHJlY2xhaW1fc3RhbGxlZF9kaXNwdXRlYCBiZWNvbWVzIGNhbGxhYmxlLgpVbnNldCBtZWFucyAwOiB0aGUgc3RhbGxlZC1kaXNwdXRlIGZhbGxiYWNrIGlzIGRpc2FibGVkIGVudGlyZWx5LCBubwpwZXJtaXNzaW9ubGVzcyByZWNvdmVyeSBwYXRoIGV4aXN0cyBhbmQgYm9uZHMgY2FuIHJlbWFpbiBmcm96ZW4KaW5kZWZpbml0ZWx5LCB0aGUgcHJlLSMxNjYgYmVoYXZpb3IuIFNlZSBgc2V0X3N0YWxsX3RpbWVvdXRgLgAAAAAQU3RhbGxUaW1lb3V0U2VjcwAAAAEAAAFRV2hlbiBgZGlzcHV0ZWAgd2FzIGNhbGxlZCBmb3IgYXNzZXJ0aW9uIGB1NjRgLiBLZXB0IGFzIGEgc2VwYXJhdGUKc3RvcmFnZSBrZXkgcmF0aGVyIHRoYW4gYSBmaWVsZCBvbiBgQXNzZXJ0aW9uYCBzbyBhZGRpbmcgaXQgZG9lcyBub3QKYnJlYWsgZGVjb2Rpbmcgb2YgYXNzZXJ0aW9ucyBhbHJlYWR5IHBlcnNpc3RlZCBiZWZvcmUgdGhpcyB1cGdyYWRlCigjMTg0KS4gYE5vbmVgIG1lYW5zIHRoZSBhc3NlcnRpb24gd2FzIGRpc3B1dGVkIGJlZm9yZSB0aGlzIHVwZ3JhZGUKb3IgaXMgc3RpbGwgcGVuZGluZzsgYFNvbWUodHMpYCBpcyB0aGUgbGVkZ2VyIHRpbWVzdGFtcCBhdCBkaXNwdXRlLgAAAAAAAApEaXNwdXRlZEF0AAAAAAABAAAABg==", "AAAAAAAAAE5EaXNwdXRlcyBhIHBlbmRpbmcgYXNzZXJ0aW9uIHdpdGhpbiB0aGUgY2hhbGxlbmdlIHdpbmRvdyBieSBtYXRjaGluZyBpdHMgYm9uZC4AAAAAAAdkaXNwdXRlAAAAAAIAAAAAAAAACGRpc3B1dGVyAAAAEwAAAAAAAAACaWQAAAAAAAYAAAABAAAD6QAAAAIAAAAD", "AAAAAAAAAN9BIHJlc29sdmVyIHZvdGVzIG9uIGEgZGlzcHV0ZWQgYXNzZXJ0aW9uLiBPbmNlIGEgc3RyaWN0IG1ham9yaXR5IG9mCnRoZSByZXNvbHZlciBjb21taXR0ZWUgYWdyZWVzLCB0aGUgYXNzZXJ0aW9uIGZpbmFsaXplczogdGhlIHdpbm5pbmcKc2lkZSAoYXNzZXJ0ZXIgaWYgdGhlIG9yaWdpbmFsIG91dGNvbWUgc3RhbmRzLCBkaXNwdXRlciBvdGhlcndpc2UpCnJlY2VpdmVzIGJvdGggYm9uZHMuAAAAAAdyZXNvbHZlAAAAAAMAAAAAAAAACHJlc29sdmVyAAAAEwAAAAAAAAACaWQAAAAAAAYAAAAAAAAAFGFncmVlc193aXRoX2Fzc2VydGVyAAAAAQAAAAEAAAPpAAAD6AAAAAEAAAAD", "AAAAAAAAA1hGaW5hbGl6ZXMgYSBwZW5kaW5nIGFzc2VydGlvbiBvbmNlIGl0cyBjaGFsbGVuZ2Ugd2luZG93IGhhcyBlbGFwc2VkCndpdGggbm8gZGlzcHV0ZS4gRmFpbHMgd2l0aCBgUGF1c2VkYCBpZiBwYXVzZWQ6IGEgcGF1c2VkIGFzc2VydGlvbiBtYXkKaGF2ZSBoYWQgbm8gcmVhbCBvcHBvcnR1bml0eSB0byBiZSBkaXNwdXRlZCBkdXJpbmcgaXRzIGNoYWxsZW5nZQp3aW5kb3cgKHNpbmNlIGBkaXNwdXRlYCBpcyBhbHNvIGJsb2NrZWQgd2hpbGUgcGF1c2VkKSwgc28gaXQgbXVzdCBub3QKYmUgYWJsZSB0byBmaW5hbGl6ZSB1bmNvbnRlc3RlZCB1bnRpbCB1bnBhdXNlZC4gYGNhbGxlcmAgbXVzdAphdXRob3JpemUgdGhlIGNhbGwgdW5jb25kaXRpb25hbGx5IOKAlCByZWdhcmRsZXNzIG9mIHdoZXRoZXIKYGZpbmFsaXplX3Jld2FyZF9icHNgIGlzIHplcm8g4oCUIHNvIHRoZSBhZGRyZXNzIHJlY29yZGVkIGluCmBBc3NlcnRpb24uZmluYWxpemVyYCBhbmQgdGhlIGBGaW5hbGl6ZWRgIGV2ZW50IGlzIGFsd2F5cyBhIHZlcmlmaWVkCmNhbGxlciBhbmQgY2Fubm90IGJlIHNwb29mZWQuIFdoZW4gYGZpbmFsaXplX3Jld2FyZF9icHNgIGlzIG5vbi16ZXJvLApgY2FsbGVyYCBhbHNvIHJlY2VpdmVzIGBib25kICogZmluYWxpemVfcmV3YXJkX2JwcyAvIDEwXzAwMGAgdG9rZW5zIGFzCmFuIGluY2VudGl2ZSBmb3IgcHJvbXB0IGZpbmFsaXphdGlvbiBhbmQgdGhlIGFzc2VydGVyIHJlY2VpdmVzIHRoZQpyZW1haW5kZXI7IHdoZW4gaXQgaXMgemVybyB0aGUgZnVsbCBib25kIGlzIHJldHVybmVkIHRvIHRoZSBhc3NlcnRlcgphbmQgbm8gcmV3YXJkIGlzIHBhaWQuIFJldHVybnMgdGhlIGFzc2VydGVkIG91dGNvbWUuAAAACGZpbmFsaXplAAAAAgAAAAAAAAAGY2FsbGVyAAAAAAATAAAAAAAAAAJpZAAAAAAABgAAAAEAAAPpAAAAAQAAAAM=", From 79805aee7b5f1ef07645660bd56d72a2fe44e25b Mon Sep 17 00:00:00 2001 From: Ezedike-egwom Collins Date: Mon, 14 Sep 2026 21:55:55 +0100 Subject: [PATCH 7/7] docs(contract): document received-amount bond semantics and missing error variants --- docs/src/CONTRACT.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/src/CONTRACT.md b/docs/src/CONTRACT.md index 454f554..a23fb9c 100644 --- a/docs/src/CONTRACT.md +++ b/docs/src/CONTRACT.md @@ -31,7 +31,7 @@ State of an assertion: `Pending`, `Disputed`, or `Resolved`. | `asserter` | `Address` | Who posted the claim | | `outcome` | `bool` | The claimed outcome | | `final_outcome` | `Option` | The authoritative resolved outcome; `None` until the assertion reaches `Resolved` | -| `bond` | `i128` | Bond amount posted (in the configured token), pinned at the moment `assert_outcome` created the assertion; a later `set_bond_amount` call never changes it retroactively | +| `bond` | `i128` | Bond amount (in the configured token) as actually received by the contract, measured by balance delta across the transfer, so a fee-on-transfer token records less than the nominal amount. Pinned at the moment `assert_outcome` created the assertion; a later `set_bond_amount` call never changes it retroactively | | `opened_at` | `u64` | Ledger timestamp the assertion was posted | | `status` | `Status` | Current state | | `disputer` | `Option
` | Who disputed it, if disputed | @@ -67,6 +67,10 @@ State of an assertion: `Pending`, `Disputed`, or `Resolved`. | `NotProposer` | Caller isn't the proposer and the proposal can still reach a majority, so can't cancel it | | `NoAdminRotationProposal` | `accept_admin` called without a pending admin proposal | | `SelfVote` | Resolver is also the assertion's asserter or disputer | +| `SelfDispute` | The disputer is the same address as the asserter | +| `StallTimeoutNotConfigured` | `reclaim_stalled_dispute` was called with no stall timeout configured (or on a pre-upgrade dispute with no `DisputedAt` entry) | +| `DisputeNotStalled` | `reclaim_stalled_dispute` was called before the stall timeout elapsed since the dispute opened | +| `TokenTransferMismatch` | An incoming token transfer didn't increase the contract's balance (non-positive or overflowing received amount), or an escrow/balance arithmetic overflow | ## Functions