diff --git a/contracts/tholos/src/lib.rs b/contracts/tholos/src/lib.rs index 07f6171..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 @@ -259,6 +260,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 = 28, } const DAY_IN_LEDGERS: u32 = 17280; @@ -970,6 +973,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)?; @@ -999,14 +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)?; - 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)?; + + // 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, @@ -1070,11 +1117,14 @@ 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); + 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); @@ -1115,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 }; @@ -1132,6 +1187,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 escrow > contract_balance { + return Err(Error::TokenTransferMismatch); + } if reward > 0 { // Pay the caller their reward first, then pay the asserter the @@ -1140,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, @@ -1220,7 +1280,19 @@ 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 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 { assertion.asserter.clone() } else { @@ -1243,12 +1315,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( - &env.current_contract_address(), - &winner, - &payout, - ); + token_client.transfer(&env.current_contract_address(), &winner, &payout); Resolved { id, outcome: final_outcome, @@ -1283,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 diff --git a/contracts/tholos/src/test.rs b/contracts/tholos/src/test.rs index 65cbc79..425aaeb 100644 --- a/contracts/tholos/src/test.rs +++ b/contracts/tholos/src/test.rs @@ -2122,6 +2122,184 @@ 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 admin = Address::generate(env); + let contract_id = env.register(Tholos, (admin,)); + let client = TholosClient::new(env, &contract_id); + + client.initialize( + &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 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 new file mode 100644 index 0000000..4623746 --- /dev/null +++ b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_dispute_uses_actual_deposit.1.json @@ -0,0 +1,618 @@ +{ + "generators": { + "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": { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + "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": { + "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": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "171" + } + } + }, + "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": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "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": 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": { + "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..90987be --- /dev/null +++ b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_records_actual_bond.1.json @@ -0,0 +1,528 @@ +{ + "generators": { + "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": [] + } + ] + ], + [], + [], + [] + ], + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + "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": { + "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": { + "vec": [ + { + "symbol": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "90" + } + } + }, + "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": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "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": 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_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..cbcfaed --- /dev/null +++ b/contracts/tholos/test_snapshots/test/test_fee_on_transfer_resolve_uses_available_balance.1.json @@ -0,0 +1,717 @@ +{ + "generators": { + "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": { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + "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": "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, + "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": { + "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": "AssertionEscrow" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "171" + } + } + }, + "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": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "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": 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": { + "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_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/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 diff --git a/packages/tholos-sdk/src/index.ts b/packages/tholos-sdk/src/index.ts index 05322e6..18a34fc 100644 --- a/packages/tholos-sdk/src/index.ts +++ b/packages/tholos-sdk/src/index.ts @@ -91,12 +91,16 @@ 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}; -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]}; @@ -436,9 +440,9 @@ export class Client extends ContractClient { } constructor(public readonly options: ContractClientOptions) { super( - new ContractSpec([ "AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAGwAAAAAAAAASQWxyZWFkeUluaXRpYWxpemVkAAAAAAABAAAAAAAAAA5Ob3RJbml0aWFsaXplZAAAAAAAAgAAAAAAAAAUSW52YWxpZFJlc29sdmVyQ291bnQAAAADAAAAAAAAABFBc3NlcnRpb25Ob3RGb3VuZAAAAAAAAAQAAAAAAAAACk5vdFBlbmRpbmcAAAAAAAUAAAAAAAAAC05vdERpc3B1dGVkAAAAAAYAAAAAAAAAFUNoYWxsZW5nZVdpbmRvd0Nsb3NlZAAAAAAAAAcAAAAAAAAAE0NoYWxsZW5nZVdpbmRvd09wZW4AAAAACAAAAAAAAAAMTm90QVJlc29sdmVyAAAACQAAAAAAAAAMQWxyZWFkeVZvdGVkAAAACgAAAAAAAAAGUGF1c2VkAAAAAAALAAAAPmBib25kX2Ftb3VudGAgd2FzIG5vdCBwb3NpdGl2ZSwgb3IgZXhjZWVkZWQgYE1BWF9CT05EX0FNT1VOVGAuAAAAAAARSW52YWxpZEJvbmRBbW91bnQAAAAAAAAMAAAAAAAAABZJbnZhbGlkQ2hhbGxlbmdlV2luZG93AAAAAAANAAAAAAAAABBUb29NYW55UmVzb2x2ZXJzAAAADgAAAEhgZmluYWxpemVfcmV3YXJkX2Jwc2Agd2FzIGdyZWF0ZXIgdGhhbiBgTUFYX0ZJTkFMSVpFX1JFV0FSRF9CUFNgICgxMDAwKS4AAAAVSW52YWxpZEZpbmFsaXplUmV3YXJkAAAAAAAADwAAAAAAAAASRHVwbGljYXRlUmVzb2x2ZXJzAAAAAAAQAAAAAAAAABJSb3RhdGlvbkluUHJvZ3Jlc3MAAAAAABEAAAAAAAAAEk5vUm90YXRpb25Qcm9wb3NhbAAAAAAAEgAAAAAAAAAWUmVzb2x2ZXJOb3RJbkNvbW1pdHRlZQAAAAAAEwAAAAAAAAAdUm90YXRpb25UYXJnZXRBbHJlYWR5UmVzb2x2ZXIAAAAAAAAUAAAAAAAAAAtOb3RQcm9wb3NlcgAAAAAVAAABGFRoZSBjYWxsZXIgaXMgdGhlIGFzc2VydGVyIG9mIHRoZSBhc3NlcnRpb24gdGhleSBhcmUgdHJ5aW5nIHRvIGRpc3B1dGUuCkFuIGFzc2VydGVyIGRpc3B1dGluZyB0aGVpciBvd24gYXNzZXJ0aW9uIHdvdWxkIGNvbnN1bWUgdGhlIG9uZSBkaXNwdXRlCnNsb3Qgd2l0aG91dCBhbnkgZWNvbm9taWMgcmlzayAodGhleSByZWNlaXZlIGJvdGggYm9uZHMgYmFjayByZWdhcmRsZXNzCm9mIHRoZSByZXNvbHZlciB2b3RlKSwgbnVsbGlmeWluZyB0aGUgYm9uZC1mb3JmZWl0dXJlIGRldGVycmVudC4AAAALU2VsZkRpc3B1dGUAAAAAFgAAAAAAAAAXTm9BZG1pblJvdGF0aW9uUHJvcG9zYWwAAAAAFwAAAMlgcmVjbGFpbV9zdGFsbGVkX2Rpc3B1dGVgIHdhcyBjYWxsZWQgb24gYW4gYXNzZXJ0aW9uIHdob3NlIGRpc3B1dGUKb3BlbmVkIHdpdGhvdXQgYSBzdGFsbCB0aW1lb3V0IGNvbmZpZ3VyZWQgKDAgPSBmYWxsYmFjayBkaXNhYmxlZCksIG9yCndob3NlIGRpc3B1dGVkX2F0IHByZWRhdGVzIHRoaXMgdXBncmFkZSBhbmQgY2Fubm90IGJlIHRpbWVkIG91dC4AAAAAAAAZU3RhbGxUaW1lb3V0Tm90Q29uZmlndXJlZAAAAAAAABgAAACsYHJlY2xhaW1fc3RhbGxlZF9kaXNwdXRlYCB3YXMgY2FsbGVkIGJlZm9yZSB0aGUgc3RhbGwgdGltZW91dCBlbGFwc2VkCnNpbmNlIHRoZSBkaXNwdXRlIG9wZW5lZC4gVGhlIGFzc2VydGlvbiBzdGlsbCByZXF1aXJlcyBub3JtYWwKcmVzb2x1dGlvbiBieSB0aGUgc25hcHNob3R0ZWQgY29tbWl0dGVlLgAAABFEaXNwdXRlTm90U3RhbGxlZAAAAAAAABkAAABSYHNldF9zdGFsbF90aW1lb3V0YCB3YXMgY2FsbGVkIHdpdGggYSB2YWx1ZSBncmVhdGVyIHRoYW4KYE1BWF9TVEFMTF9USU1FT1VUX1NFQ1NgLgAAAAAAE0ludmFsaWRTdGFsbFRpbWVvdXQAAAAAGgAAAMNUaGUgY2FsbGVyIGlzIG9uIHRoZSBzbmFwc2hvdHRlZCByZXNvbHZlciBjb21taXR0ZWUgYW5kIGlzIGFsc28gdGhlCmFzc2VydGlvbidzIGFzc2VydGVyIG9yIGRpc3B1dGVyLiBBIHBhcnR5IHZvdGluZyBvbiB0aGVpciBvd24gY2FzZQpiaWFzZXMgKGFuZCwgb24gYSBzaXplLTEgY29tbWl0dGVlLCBkZXRlcm1pbmVzKSB0aGUgb3V0Y29tZS4AAAAACFNlbGZWb3RlAAAAGw==", + new ContractSpec([ "AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAHAAAAAAAAAASQWxyZWFkeUluaXRpYWxpemVkAAAAAAABAAAAAAAAAA5Ob3RJbml0aWFsaXplZAAAAAAAAgAAAAAAAAAUSW52YWxpZFJlc29sdmVyQ291bnQAAAADAAAAAAAAABFBc3NlcnRpb25Ob3RGb3VuZAAAAAAAAAQAAAAAAAAACk5vdFBlbmRpbmcAAAAAAAUAAAAAAAAAC05vdERpc3B1dGVkAAAAAAYAAAAAAAAAFUNoYWxsZW5nZVdpbmRvd0Nsb3NlZAAAAAAAAAcAAAAAAAAAE0NoYWxsZW5nZVdpbmRvd09wZW4AAAAACAAAAAAAAAAMTm90QVJlc29sdmVyAAAACQAAAAAAAAAMQWxyZWFkeVZvdGVkAAAACgAAAAAAAAAGUGF1c2VkAAAAAAALAAAAPmBib25kX2Ftb3VudGAgd2FzIG5vdCBwb3NpdGl2ZSwgb3IgZXhjZWVkZWQgYE1BWF9CT05EX0FNT1VOVGAuAAAAAAARSW52YWxpZEJvbmRBbW91bnQAAAAAAAAMAAAAAAAAABZJbnZhbGlkQ2hhbGxlbmdlV2luZG93AAAAAAANAAAAAAAAABBUb29NYW55UmVzb2x2ZXJzAAAADgAAAEhgZmluYWxpemVfcmV3YXJkX2Jwc2Agd2FzIGdyZWF0ZXIgdGhhbiBgTUFYX0ZJTkFMSVpFX1JFV0FSRF9CUFNgICgxMDAwKS4AAAAVSW52YWxpZEZpbmFsaXplUmV3YXJkAAAAAAAADwAAAAAAAAASRHVwbGljYXRlUmVzb2x2ZXJzAAAAAAAQAAAAAAAAABJSb3RhdGlvbkluUHJvZ3Jlc3MAAAAAABEAAAAAAAAAEk5vUm90YXRpb25Qcm9wb3NhbAAAAAAAEgAAAAAAAAAWUmVzb2x2ZXJOb3RJbkNvbW1pdHRlZQAAAAAAEwAAAAAAAAAdUm90YXRpb25UYXJnZXRBbHJlYWR5UmVzb2x2ZXIAAAAAAAAUAAAAAAAAAAtOb3RQcm9wb3NlcgAAAAAVAAABGFRoZSBjYWxsZXIgaXMgdGhlIGFzc2VydGVyIG9mIHRoZSBhc3NlcnRpb24gdGhleSBhcmUgdHJ5aW5nIHRvIGRpc3B1dGUuCkFuIGFzc2VydGVyIGRpc3B1dGluZyB0aGVpciBvd24gYXNzZXJ0aW9uIHdvdWxkIGNvbnN1bWUgdGhlIG9uZSBkaXNwdXRlCnNsb3Qgd2l0aG91dCBhbnkgZWNvbm9taWMgcmlzayAodGhleSByZWNlaXZlIGJvdGggYm9uZHMgYmFjayByZWdhcmRsZXNzCm9mIHRoZSByZXNvbHZlciB2b3RlKSwgbnVsbGlmeWluZyB0aGUgYm9uZC1mb3JmZWl0dXJlIGRldGVycmVudC4AAAALU2VsZkRpc3B1dGUAAAAAFgAAAAAAAAAXTm9BZG1pblJvdGF0aW9uUHJvcG9zYWwAAAAAFwAAAMlgcmVjbGFpbV9zdGFsbGVkX2Rpc3B1dGVgIHdhcyBjYWxsZWQgb24gYW4gYXNzZXJ0aW9uIHdob3NlIGRpc3B1dGUKb3BlbmVkIHdpdGhvdXQgYSBzdGFsbCB0aW1lb3V0IGNvbmZpZ3VyZWQgKDAgPSBmYWxsYmFjayBkaXNhYmxlZCksIG9yCndob3NlIGRpc3B1dGVkX2F0IHByZWRhdGVzIHRoaXMgdXBncmFkZSBhbmQgY2Fubm90IGJlIHRpbWVkIG91dC4AAAAAAAAZU3RhbGxUaW1lb3V0Tm90Q29uZmlndXJlZAAAAAAAABgAAACsYHJlY2xhaW1fc3RhbGxlZF9kaXNwdXRlYCB3YXMgY2FsbGVkIGJlZm9yZSB0aGUgc3RhbGwgdGltZW91dCBlbGFwc2VkCnNpbmNlIHRoZSBkaXNwdXRlIG9wZW5lZC4gVGhlIGFzc2VydGlvbiBzdGlsbCByZXF1aXJlcyBub3JtYWwKcmVzb2x1dGlvbiBieSB0aGUgc25hcHNob3R0ZWQgY29tbWl0dGVlLgAAABFEaXNwdXRlTm90U3RhbGxlZAAAAAAAABkAAABSYHNldF9zdGFsbF90aW1lb3V0YCB3YXMgY2FsbGVkIHdpdGggYSB2YWx1ZSBncmVhdGVyIHRoYW4KYE1BWF9TVEFMTF9USU1FT1VUX1NFQ1NgLgAAAAAAE0ludmFsaWRTdGFsbFRpbWVvdXQAAAAAGgAAAMNUaGUgY2FsbGVyIGlzIG9uIHRoZSBzbmFwc2hvdHRlZCByZXNvbHZlciBjb21taXR0ZWUgYW5kIGlzIGFsc28gdGhlCmFzc2VydGlvbidzIGFzc2VydGVyIG9yIGRpc3B1dGVyLiBBIHBhcnR5IHZvdGluZyBvbiB0aGVpciBvd24gY2FzZQpiaWFzZXMgKGFuZCwgb24gYSBzaXplLTEgY29tbWl0dGVlLCBkZXRlcm1pbmVzKSB0aGUgb3V0Y29tZS4AAAAACFNlbGZWb3RlAAAAGwAAAEFUaGUgdG9rZW4gdHJhbnNmZXIgZGlkIG5vdCByZXN1bHQgaW4gdGhlIGV4cGVjdGVkIGJhbGFuY2UgY2hhbmdlLgAAAAAAABVUb2tlblRyYW5zZmVyTWlzbWF0Y2gAAAAAAAAc", "AAAAAgAAAAAAAAAAAAAABlN0YXR1cwAAAAAAAwAAAAAAAAAAAAAAB1BlbmRpbmcAAAAAAAAAAAAAAAAIRGlzcHV0ZWQAAAAAAAAAAAAAAAhSZXNvbHZlZA==", - "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAADQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAAAAAAAAAAAFVG9rZW4AAAAAAAAAAAAAAAAAAApCb25kQW1vdW50AAAAAAAAAAAAAAAAAA9DaGFsbGVuZ2VXaW5kb3cAAAAAAAAAAAAAAAAJUmVzb2x2ZXJzAAAAAAAAAQAAAAAAAAAJQXNzZXJ0aW9uAAAAAAAAAQAAAAYAAAAAAAAAAAAAAAZOZXh0SWQAAAAAAAAAAAAAAAAABlBhdXNlZAAAAAAAAAAAAMhCYXNpcyBwb2ludHMgKDDigJMxMDAwKSBvZiB0aGUgYm9uZCBwYWlkIHRvIHdob2V2ZXIgY2FsbHMgYGZpbmFsaXplYCBhcwphbiBpbmNlbnRpdmUgZm9yIHByb21wdCBmaW5hbGl6YXRpb24uIDAgbWVhbnMgbm8gcmV3YXJkIGlzIHRha2VuOyB0aGUKZnVsbCBib25kIGlzIHJldHVybmVkIHRvIHRoZSBhc3NlcnRlciAob3JpZ2luYWwgYmVoYXZpb3IpLgAAABFGaW5hbGl6ZVJld2FyZEJwcwAAAAAAAAAAAAAAAAAAEFJvdGF0aW9uUHJvcG9zYWwAAAAAAAAAAAAAABVBZG1pblJvdGF0aW9uUHJvcG9zYWwAAAAAAAAAAAABR1NlY29uZHMgYWZ0ZXIgYGRpc3B1dGVgIG9wZW5zIGR1cmluZyB3aGljaCBgcmVzb2x2ZWAgbXVzdCByZWFjaCBhCnN0cmljdCBtYWpvcml0eSBiZWZvcmUgYHJlY2xhaW1fc3RhbGxlZF9kaXNwdXRlYCBiZWNvbWVzIGNhbGxhYmxlLgpVbnNldCBtZWFucyAwOiB0aGUgc3RhbGxlZC1kaXNwdXRlIGZhbGxiYWNrIGlzIGRpc2FibGVkIGVudGlyZWx5LCBubwpwZXJtaXNzaW9ubGVzcyByZWNvdmVyeSBwYXRoIGV4aXN0cyBhbmQgYm9uZHMgY2FuIHJlbWFpbiBmcm96ZW4KaW5kZWZpbml0ZWx5LCB0aGUgcHJlLSMxNjYgYmVoYXZpb3IuIFNlZSBgc2V0X3N0YWxsX3RpbWVvdXRgLgAAAAAQU3RhbGxUaW1lb3V0U2VjcwAAAAEAAAFRV2hlbiBgZGlzcHV0ZWAgd2FzIGNhbGxlZCBmb3IgYXNzZXJ0aW9uIGB1NjRgLiBLZXB0IGFzIGEgc2VwYXJhdGUKc3RvcmFnZSBrZXkgcmF0aGVyIHRoYW4gYSBmaWVsZCBvbiBgQXNzZXJ0aW9uYCBzbyBhZGRpbmcgaXQgZG9lcyBub3QKYnJlYWsgZGVjb2Rpbmcgb2YgYXNzZXJ0aW9ucyBhbHJlYWR5IHBlcnNpc3RlZCBiZWZvcmUgdGhpcyB1cGdyYWRlCigjMTg0KS4gYE5vbmVgIG1lYW5zIHRoZSBhc3NlcnRpb24gd2FzIGRpc3B1dGVkIGJlZm9yZSB0aGlzIHVwZ3JhZGUKb3IgaXMgc3RpbGwgcGVuZGluZzsgYFNvbWUodHMpYCBpcyB0aGUgbGVkZ2VyIHRpbWVzdGFtcCBhdCBkaXNwdXRlLgAAAAAAAApEaXNwdXRlZEF0AAAAAAABAAAABg==", + "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAADgAAAAAAAAAAAAAABUFkbWluAAAAAAAAAAAAAAAAAAAFVG9rZW4AAAAAAAAAAAAAAAAAAApCb25kQW1vdW50AAAAAAAAAAAAAAAAAA9DaGFsbGVuZ2VXaW5kb3cAAAAAAAAAAAAAAAAJUmVzb2x2ZXJzAAAAAAAAAQAAAAAAAAAJQXNzZXJ0aW9uAAAAAAAAAQAAAAYAAAABAAAAAAAAAA9Bc3NlcnRpb25Fc2Nyb3cAAAAAAQAAAAYAAAAAAAAAAAAAAAZOZXh0SWQAAAAAAAAAAAAAAAAABlBhdXNlZAAAAAAAAAAAAMhCYXNpcyBwb2ludHMgKDDigJMxMDAwKSBvZiB0aGUgYm9uZCBwYWlkIHRvIHdob2V2ZXIgY2FsbHMgYGZpbmFsaXplYCBhcwphbiBpbmNlbnRpdmUgZm9yIHByb21wdCBmaW5hbGl6YXRpb24uIDAgbWVhbnMgbm8gcmV3YXJkIGlzIHRha2VuOyB0aGUKZnVsbCBib25kIGlzIHJldHVybmVkIHRvIHRoZSBhc3NlcnRlciAob3JpZ2luYWwgYmVoYXZpb3IpLgAAABFGaW5hbGl6ZVJld2FyZEJwcwAAAAAAAAAAAAAAAAAAEFJvdGF0aW9uUHJvcG9zYWwAAAAAAAAAAAAAABVBZG1pblJvdGF0aW9uUHJvcG9zYWwAAAAAAAAAAAABR1NlY29uZHMgYWZ0ZXIgYGRpc3B1dGVgIG9wZW5zIGR1cmluZyB3aGljaCBgcmVzb2x2ZWAgbXVzdCByZWFjaCBhCnN0cmljdCBtYWpvcml0eSBiZWZvcmUgYHJlY2xhaW1fc3RhbGxlZF9kaXNwdXRlYCBiZWNvbWVzIGNhbGxhYmxlLgpVbnNldCBtZWFucyAwOiB0aGUgc3RhbGxlZC1kaXNwdXRlIGZhbGxiYWNrIGlzIGRpc2FibGVkIGVudGlyZWx5LCBubwpwZXJtaXNzaW9ubGVzcyByZWNvdmVyeSBwYXRoIGV4aXN0cyBhbmQgYm9uZHMgY2FuIHJlbWFpbiBmcm96ZW4KaW5kZWZpbml0ZWx5LCB0aGUgcHJlLSMxNjYgYmVoYXZpb3IuIFNlZSBgc2V0X3N0YWxsX3RpbWVvdXRgLgAAAAAQU3RhbGxUaW1lb3V0U2VjcwAAAAEAAAFRV2hlbiBgZGlzcHV0ZWAgd2FzIGNhbGxlZCBmb3IgYXNzZXJ0aW9uIGB1NjRgLiBLZXB0IGFzIGEgc2VwYXJhdGUKc3RvcmFnZSBrZXkgcmF0aGVyIHRoYW4gYSBmaWVsZCBvbiBgQXNzZXJ0aW9uYCBzbyBhZGRpbmcgaXQgZG9lcyBub3QKYnJlYWsgZGVjb2Rpbmcgb2YgYXNzZXJ0aW9ucyBhbHJlYWR5IHBlcnNpc3RlZCBiZWZvcmUgdGhpcyB1cGdyYWRlCigjMTg0KS4gYE5vbmVgIG1lYW5zIHRoZSBhc3NlcnRpb24gd2FzIGRpc3B1dGVkIGJlZm9yZSB0aGlzIHVwZ3JhZGUKb3IgaXMgc3RpbGwgcGVuZGluZzsgYFNvbWUodHMpYCBpcyB0aGUgbGVkZ2VyIHRpbWVzdGFtcCBhdCBkaXNwdXRlLgAAAAAAAApEaXNwdXRlZEF0AAAAAAABAAAABg==", "AAAAAAAAAE5EaXNwdXRlcyBhIHBlbmRpbmcgYXNzZXJ0aW9uIHdpdGhpbiB0aGUgY2hhbGxlbmdlIHdpbmRvdyBieSBtYXRjaGluZyBpdHMgYm9uZC4AAAAAAAdkaXNwdXRlAAAAAAIAAAAAAAAACGRpc3B1dGVyAAAAEwAAAAAAAAACaWQAAAAAAAYAAAABAAAD6QAAAAIAAAAD", "AAAAAAAAAN9BIHJlc29sdmVyIHZvdGVzIG9uIGEgZGlzcHV0ZWQgYXNzZXJ0aW9uLiBPbmNlIGEgc3RyaWN0IG1ham9yaXR5IG9mCnRoZSByZXNvbHZlciBjb21taXR0ZWUgYWdyZWVzLCB0aGUgYXNzZXJ0aW9uIGZpbmFsaXplczogdGhlIHdpbm5pbmcKc2lkZSAoYXNzZXJ0ZXIgaWYgdGhlIG9yaWdpbmFsIG91dGNvbWUgc3RhbmRzLCBkaXNwdXRlciBvdGhlcndpc2UpCnJlY2VpdmVzIGJvdGggYm9uZHMuAAAAAAdyZXNvbHZlAAAAAAMAAAAAAAAACHJlc29sdmVyAAAAEwAAAAAAAAACaWQAAAAAAAYAAAAAAAAAFGFncmVlc193aXRoX2Fzc2VydGVyAAAAAQAAAAEAAAPpAAAD6AAAAAEAAAAD", "AAAAAAAAA1hGaW5hbGl6ZXMgYSBwZW5kaW5nIGFzc2VydGlvbiBvbmNlIGl0cyBjaGFsbGVuZ2Ugd2luZG93IGhhcyBlbGFwc2VkCndpdGggbm8gZGlzcHV0ZS4gRmFpbHMgd2l0aCBgUGF1c2VkYCBpZiBwYXVzZWQ6IGEgcGF1c2VkIGFzc2VydGlvbiBtYXkKaGF2ZSBoYWQgbm8gcmVhbCBvcHBvcnR1bml0eSB0byBiZSBkaXNwdXRlZCBkdXJpbmcgaXRzIGNoYWxsZW5nZQp3aW5kb3cgKHNpbmNlIGBkaXNwdXRlYCBpcyBhbHNvIGJsb2NrZWQgd2hpbGUgcGF1c2VkKSwgc28gaXQgbXVzdCBub3QKYmUgYWJsZSB0byBmaW5hbGl6ZSB1bmNvbnRlc3RlZCB1bnRpbCB1bnBhdXNlZC4gYGNhbGxlcmAgbXVzdAphdXRob3JpemUgdGhlIGNhbGwgdW5jb25kaXRpb25hbGx5IOKAlCByZWdhcmRsZXNzIG9mIHdoZXRoZXIKYGZpbmFsaXplX3Jld2FyZF9icHNgIGlzIHplcm8g4oCUIHNvIHRoZSBhZGRyZXNzIHJlY29yZGVkIGluCmBBc3NlcnRpb24uZmluYWxpemVyYCBhbmQgdGhlIGBGaW5hbGl6ZWRgIGV2ZW50IGlzIGFsd2F5cyBhIHZlcmlmaWVkCmNhbGxlciBhbmQgY2Fubm90IGJlIHNwb29mZWQuIFdoZW4gYGZpbmFsaXplX3Jld2FyZF9icHNgIGlzIG5vbi16ZXJvLApgY2FsbGVyYCBhbHNvIHJlY2VpdmVzIGBib25kICogZmluYWxpemVfcmV3YXJkX2JwcyAvIDEwXzAwMGAgdG9rZW5zIGFzCmFuIGluY2VudGl2ZSBmb3IgcHJvbXB0IGZpbmFsaXphdGlvbiBhbmQgdGhlIGFzc2VydGVyIHJlY2VpdmVzIHRoZQpyZW1haW5kZXI7IHdoZW4gaXQgaXMgemVybyB0aGUgZnVsbCBib25kIGlzIHJldHVybmVkIHRvIHRoZSBhc3NlcnRlcgphbmQgbm8gcmV3YXJkIGlzIHBhaWQuIFJldHVybnMgdGhlIGFzc2VydGVkIG91dGNvbWUuAAAACGZpbmFsaXplAAAAAgAAAAAAAAAGY2FsbGVyAAAAAAATAAAAAAAAAAJpZAAAAAAABgAAAAEAAAPpAAAAAQAAAAM=",