diff --git a/src/attestation/inclusion_tracker.rs b/src/attestation/inclusion_tracker.rs new file mode 100644 index 0000000..ed7f8cb --- /dev/null +++ b/src/attestation/inclusion_tracker.rs @@ -0,0 +1,54 @@ +//! Attestation inclusion-delay accounting. +//! +//! Inclusion delay is measured in wall-clock slots: the difference between the +//! slot an attestation was assigned to and the slot of the beacon block that +//! includes it. Skipped slots still count toward this delay even though no block +//! exists for those slots. + +/// Consensus slot number. +pub type Slot = u64; + +/// Minimum valid attestation inclusion delay, in slots. +pub const MIN_ATTESTATION_INCLUSION_DELAY: u64 = 1; + +/// Delay at which the inclusion-delay reward reaches zero. +pub const MAX_ATTESTATION_INCLUSION_DELAY: u64 = 32; + +/// Return the number of wall-clock slots from `start` to `end`. +/// +/// This intentionally does not inspect produced blocks. A skipped slot advances +/// wall-clock time and therefore increases attestation inclusion delay. +pub fn wall_slots_between(start: Slot, end: Slot) -> u64 { + end.saturating_sub(start) +} + +/// Compute the inclusion delay for an attestation assigned to +/// `attestation_slot` and included in a block at `block_slot`. +pub fn compute_inclusion_delay(attestation_slot: Slot, block_slot: Slot) -> u64 { + wall_slots_between(attestation_slot, block_slot) +} + +/// Compute the inclusion-delay reward for `delay` from `max_reward`. +/// +/// Rewards are maximal at delay 1 and linearly decrease to zero at delay 32. +pub fn update_delay_rewards(delay: u64, max_reward: u64) -> u64 { + if delay < MIN_ATTESTATION_INCLUSION_DELAY { + return 0; + } + + if delay >= MAX_ATTESTATION_INCLUSION_DELAY { + return 0; + } + + let remaining = MAX_ATTESTATION_INCLUSION_DELAY - delay; + let reward_span = MAX_ATTESTATION_INCLUSION_DELAY - MIN_ATTESTATION_INCLUSION_DELAY; + max_reward.saturating_mul(remaining) / reward_span +} + +/// Convenience helper for callers that have attestation and inclusion slots. +pub fn delay_reward(attestation_slot: Slot, block_slot: Slot, max_reward: u64) -> u64 { + update_delay_rewards( + compute_inclusion_delay(attestation_slot, block_slot), + max_reward, + ) +} diff --git a/src/attestation/mod.rs b/src/attestation/mod.rs index 3361476..4427f61 100644 --- a/src/attestation/mod.rs +++ b/src/attestation/mod.rs @@ -2,5 +2,6 @@ pub mod bitfield; pub mod bls_aggregator; +pub mod inclusion_tracker; pub mod key_registry; pub mod verifier; diff --git a/src/consensus/fork_choice.rs b/src/consensus/fork_choice.rs new file mode 100644 index 0000000..4026971 --- /dev/null +++ b/src/consensus/fork_choice.rs @@ -0,0 +1,31 @@ +//! Fork-choice branch weighting. + +use crate::attestation::inclusion_tracker::{delay_reward, Slot}; + +/// Attestation data needed to weight a branch. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub struct IncludedAttestation { + /// Slot the attestation was assigned to. + pub attestation_slot: Slot, + /// Slot of the block that included the attestation. + pub inclusion_slot: Slot, + /// Validator or aggregate vote weight before inclusion-delay adjustment. + pub validator_weight: u64, +} + +/// Compute a branch's total attestation weight after inclusion-delay rewards. +/// +/// The calculation depends only on wall-clock attestation/inclusion slots, so +/// skipped-slot placement between them cannot make a branch appear heavier. +pub fn branch_weighting(attestations: &[IncludedAttestation], max_delay_reward: u64) -> u64 { + attestations + .iter() + .map(|attestation| { + attestation.validator_weight.saturating_add(delay_reward( + attestation.attestation_slot, + attestation.inclusion_slot, + max_delay_reward, + )) + }) + .sum() +} diff --git a/src/consensus/mod.rs b/src/consensus/mod.rs new file mode 100644 index 0000000..2f42e47 --- /dev/null +++ b/src/consensus/mod.rs @@ -0,0 +1,3 @@ +//! Consensus helpers. + +pub mod fork_choice; diff --git a/src/lib.rs b/src/lib.rs index 1c40987..181b1bc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,6 +16,7 @@ pub mod slashing_core; // signatures cannot be replayed across consensus domains. pub mod attestation; pub mod crypto; +pub mod consensus; // Validator lifecycle and state transition. // `validator` provides a deterministic exit queue ordered strictly by diff --git a/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_event_store_unique_constraint.1.json b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_event_store_unique_constraint.1.json new file mode 100644 index 0000000..ba2f75a --- /dev/null +++ b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_event_store_unique_constraint.1.json @@ -0,0 +1,158 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "Event" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 1 + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 100 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "penalty_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "reasons" + }, + "val": { + "vec": [ + { + "vec": [ + { + "symbol": "DoubleSigning" + } + ] + } + ] + } + }, + { + "key": { + "symbol": "scan_epoch" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_executor_idempotency_already_slashed.1.json b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_executor_idempotency_already_slashed.1.json new file mode 100644 index 0000000..e20a200 --- /dev/null +++ b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_executor_idempotency_already_slashed.1.json @@ -0,0 +1,265 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 1000000, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "BondPool" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 1 + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "penalty_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "reasons" + }, + "val": { + "vec": [ + { + "vec": [ + { + "symbol": "DoubleSigning" + } + ] + } + ] + } + }, + { + "key": { + "symbol": "scan_epoch" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Rejected" + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Node" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "bond_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "double_sign_detected" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "fraud_proof_submitted" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "is_active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "last_activity_time" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "last_slash_time" + }, + "val": "void" + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "slashed" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "slashing_in_progress" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_executor_insufficient_pool_balance.1.json b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_executor_insufficient_pool_balance.1.json new file mode 100644 index 0000000..b9aa248 --- /dev/null +++ b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_executor_insufficient_pool_balance.1.json @@ -0,0 +1,265 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 1000000, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "BondPool" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 1 + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "penalty_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "reasons" + }, + "val": { + "vec": [ + { + "vec": [ + { + "symbol": "DoubleSigning" + } + ] + } + ] + } + }, + { + "key": { + "symbol": "scan_epoch" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Failed" + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Node" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "bond_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "double_sign_detected" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "fraud_proof_submitted" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "is_active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "last_activity_time" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "last_slash_time" + }, + "val": "void" + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "slashed" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "slashing_in_progress" + }, + "val": { + "bool": false + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_multi_condition_creates_single_event_with_all_reasons.1.json b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_multi_condition_creates_single_event_with_all_reasons.1.json new file mode 100644 index 0000000..1b98ea9 --- /dev/null +++ b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_multi_condition_creates_single_event_with_all_reasons.1.json @@ -0,0 +1,314 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 1000000, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "BondPool" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 1 + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "penalty_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "reasons" + }, + "val": { + "vec": [ + { + "vec": [ + { + "symbol": "DoubleSigning" + } + ] + }, + { + "vec": [ + { + "symbol": "ExtendedDowntime" + } + ] + } + ] + } + }, + { + "key": { + "symbol": "scan_epoch" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Executed" + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "LastScanTime" + } + ] + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Node" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "bond_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "double_sign_detected" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "fraud_proof_submitted" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "is_active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "last_activity_time" + }, + "val": { + "u64": 740800 + } + }, + { + "key": { + "symbol": "last_slash_time" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "slashed" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "slashing_in_progress" + }, + "val": { + "bool": false + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "ScanEpoch" + } + ] + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "SlashingLock" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_multiple_nodes_independent_events.1.json b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_multiple_nodes_independent_events.1.json new file mode 100644 index 0000000..aa901ea --- /dev/null +++ b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_multiple_nodes_independent_events.1.json @@ -0,0 +1,629 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 1000000, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "BondPool" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "BondPool" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "BondPool" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 1 + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "penalty_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "reasons" + }, + "val": { + "vec": [ + { + "vec": [ + { + "symbol": "DoubleSigning" + } + ] + }, + { + "vec": [ + { + "symbol": "ExtendedDowntime" + } + ] + } + ] + } + }, + { + "key": { + "symbol": "scan_epoch" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Executed" + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": 1 + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "penalty_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "reasons" + }, + "val": { + "vec": [ + { + "vec": [ + { + "symbol": "FraudProof" + } + ] + } + ] + } + }, + { + "key": { + "symbol": "scan_epoch" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Executed" + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "LastScanTime" + } + ] + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Node" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "bond_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "double_sign_detected" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "fraud_proof_submitted" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "is_active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "last_activity_time" + }, + "val": { + "u64": 740800 + } + }, + { + "key": { + "symbol": "last_slash_time" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "slashed" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "slashing_in_progress" + }, + "val": { + "bool": false + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Node" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "bond_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "double_sign_detected" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "fraud_proof_submitted" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "is_active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "last_activity_time" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "last_slash_time" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "slashed" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "slashing_in_progress" + }, + "val": { + "bool": false + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Node" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "bond_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "double_sign_detected" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "fraud_proof_submitted" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "is_active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "last_activity_time" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "last_slash_time" + }, + "val": "void" + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "slashed" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "slashing_in_progress" + }, + "val": { + "bool": false + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "ScanEpoch" + } + ] + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "SlashingLock" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "SlashingLock" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_no_conditions_triggered_no_event.1.json b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_no_conditions_triggered_no_event.1.json new file mode 100644 index 0000000..4bc5595 --- /dev/null +++ b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_no_conditions_triggered_no_event.1.json @@ -0,0 +1,208 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 1000000, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "BondPool" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "LastScanTime" + } + ] + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Node" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "bond_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "double_sign_detected" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "fraud_proof_submitted" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "is_active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "last_activity_time" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "last_slash_time" + }, + "val": "void" + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "slashed" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "slashing_in_progress" + }, + "val": { + "bool": false + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "ScanEpoch" + } + ] + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_node_can_be_slashed_again_after_interval.1.json b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_node_can_be_slashed_again_after_interval.1.json new file mode 100644 index 0000000..ece759c --- /dev/null +++ b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_node_can_be_slashed_again_after_interval.1.json @@ -0,0 +1,390 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 1021601, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "BondPool" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 1 + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "penalty_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "reasons" + }, + "val": { + "vec": [ + { + "vec": [ + { + "symbol": "DoubleSigning" + } + ] + } + ] + } + }, + { + "key": { + "symbol": "scan_epoch" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Executed" + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 2 + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 1021601 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "penalty_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "reasons" + }, + "val": { + "vec": [ + { + "vec": [ + { + "symbol": "DoubleSigning" + } + ] + } + ] + } + }, + { + "key": { + "symbol": "scan_epoch" + }, + "val": { + "u64": 2 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Executed" + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "LastScanTime" + } + ] + }, + "val": { + "u64": 1021601 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Node" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "bond_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "double_sign_detected" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "fraud_proof_submitted" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "is_active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "last_activity_time" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "last_slash_time" + }, + "val": { + "u64": 1021601 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "slashed" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "slashing_in_progress" + }, + "val": { + "bool": false + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "ScanEpoch" + } + ] + }, + "val": { + "u64": 2 + } + }, + { + "key": { + "vec": [ + { + "symbol": "SlashingLock" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_pre_check_gate_skips_recently_slashed_node.1.json b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_pre_check_gate_skips_recently_slashed_node.1.json new file mode 100644 index 0000000..e072cc2 --- /dev/null +++ b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_pre_check_gate_skips_recently_slashed_node.1.json @@ -0,0 +1,307 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 1000000, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "BondPool" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 1 + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "penalty_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "reasons" + }, + "val": { + "vec": [ + { + "vec": [ + { + "symbol": "DoubleSigning" + } + ] + } + ] + } + }, + { + "key": { + "symbol": "scan_epoch" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Executed" + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "LastScanTime" + } + ] + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Node" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "bond_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "double_sign_detected" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "fraud_proof_submitted" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "is_active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "last_activity_time" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "last_slash_time" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "slashed" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "slashing_in_progress" + }, + "val": { + "bool": false + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "ScanEpoch" + } + ] + }, + "val": { + "u64": 2 + } + }, + { + "key": { + "vec": [ + { + "symbol": "SlashingLock" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_single_double_signing_condition.1.json b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_single_double_signing_condition.1.json new file mode 100644 index 0000000..09a0391 --- /dev/null +++ b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_single_double_signing_condition.1.json @@ -0,0 +1,307 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 1000000, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "BondPool" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 1 + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "penalty_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "reasons" + }, + "val": { + "vec": [ + { + "vec": [ + { + "symbol": "DoubleSigning" + } + ] + } + ] + } + }, + { + "key": { + "symbol": "scan_epoch" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Executed" + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "LastScanTime" + } + ] + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Node" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "bond_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "double_sign_detected" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "fraud_proof_submitted" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "is_active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "last_activity_time" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "last_slash_time" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "slashed" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "slashing_in_progress" + }, + "val": { + "bool": false + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "ScanEpoch" + } + ] + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "SlashingLock" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_single_extended_downtime_condition.1.json b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_single_extended_downtime_condition.1.json new file mode 100644 index 0000000..a60cc82 --- /dev/null +++ b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_single_extended_downtime_condition.1.json @@ -0,0 +1,307 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 1000000, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "BondPool" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 1 + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "penalty_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "reasons" + }, + "val": { + "vec": [ + { + "vec": [ + { + "symbol": "ExtendedDowntime" + } + ] + } + ] + } + }, + { + "key": { + "symbol": "scan_epoch" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Executed" + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "LastScanTime" + } + ] + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Node" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "bond_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "double_sign_detected" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "fraud_proof_submitted" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "is_active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "last_activity_time" + }, + "val": { + "u64": 740800 + } + }, + { + "key": { + "symbol": "last_slash_time" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "slashed" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "slashing_in_progress" + }, + "val": { + "bool": false + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "ScanEpoch" + } + ] + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "SlashingLock" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_triple_condition_creates_single_event.1.json b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_triple_condition_creates_single_event.1.json new file mode 100644 index 0000000..021a67c --- /dev/null +++ b/test_snapshots/slashing_core/slashing/tests/monitor_tests/test_triple_condition_creates_single_event.1.json @@ -0,0 +1,321 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 1000000, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "BondPool" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Event" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 1 + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "penalty_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "reasons" + }, + "val": { + "vec": [ + { + "vec": [ + { + "symbol": "DoubleSigning" + } + ] + }, + { + "vec": [ + { + "symbol": "ExtendedDowntime" + } + ] + }, + { + "vec": [ + { + "symbol": "FraudProof" + } + ] + } + ] + } + }, + { + "key": { + "symbol": "scan_epoch" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Executed" + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "LastScanTime" + } + ] + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Node" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "bond_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "double_sign_detected" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "fraud_proof_submitted" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "is_active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "last_activity_time" + }, + "val": { + "u64": 740800 + } + }, + { + "key": { + "symbol": "last_slash_time" + }, + "val": { + "u64": 1000000 + } + }, + { + "key": { + "symbol": "node_id" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "slashed" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "slashing_in_progress" + }, + "val": { + "bool": false + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "ScanEpoch" + } + ] + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "SlashingLock" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/test_snapshots/slashing_core/slashing/tests/pool_tests/create_pool_is_idempotent.1.json b/test_snapshots/slashing_core/slashing/tests/pool_tests/create_pool_is_idempotent.1.json new file mode 100644 index 0000000..2d127a2 --- /dev/null +++ b/test_snapshots/slashing_core/slashing/tests/pool_tests/create_pool_is_idempotent.1.json @@ -0,0 +1,178 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "PoolClaimedCount" + }, + { + "u64": 5 + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 5 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 5 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporterCount" + }, + { + "u64": 5 + } + ] + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardPerValidator" + }, + { + "u64": 5 + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardPool" + }, + { + "u64": 5 + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/test_snapshots/slashing_core/slashing/tests/pool_tests/fixed_reward_debits_pool_by_exact_share.1.json b/test_snapshots/slashing_core/slashing/tests/pool_tests/fixed_reward_debits_pool_by_exact_share.1.json new file mode 100644 index 0000000..ba36277 --- /dev/null +++ b/test_snapshots/slashing_core/slashing/tests/pool_tests/fixed_reward_debits_pool_by_exact_share.1.json @@ -0,0 +1,322 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "PoolClaimed" + }, + { + "u64": 7 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimed" + }, + { + "u64": 7 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimed" + }, + { + "u64": 7 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimed" + }, + { + "u64": 7 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimed" + }, + { + "u64": 7 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimedCount" + }, + { + "u64": 7 + } + ] + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 7 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 7 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 7 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 7 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 7 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporterCount" + }, + { + "u64": 7 + } + ] + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardPerValidator" + }, + { + "u64": 7 + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 200 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardPool" + }, + { + "u64": 7 + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/test_snapshots/slashing_core/slashing/tests/pool_tests/indivisible_pool_remainder_goes_to_final_claimant.1.json b/test_snapshots/slashing_core/slashing/tests/pool_tests/indivisible_pool_remainder_goes_to_final_claimant.1.json new file mode 100644 index 0000000..c751aed --- /dev/null +++ b/test_snapshots/slashing_core/slashing/tests/pool_tests/indivisible_pool_remainder_goes_to_final_claimant.1.json @@ -0,0 +1,250 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "PoolClaimed" + }, + { + "u64": 9 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimed" + }, + { + "u64": 9 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimed" + }, + { + "u64": 9 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimedCount" + }, + { + "u64": 9 + } + ] + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 9 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 9 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 9 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporterCount" + }, + { + "u64": 9 + } + ] + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardPerValidator" + }, + { + "u64": 9 + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 333 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardPool" + }, + { + "u64": 9 + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/test_snapshots/slashing_core/slashing/tests/pool_tests/non_reporter_cannot_claim.1.json b/test_snapshots/slashing_core/slashing/tests/pool_tests/non_reporter_cannot_claim.1.json new file mode 100644 index 0000000..5cc57c4 --- /dev/null +++ b/test_snapshots/slashing_core/slashing/tests/pool_tests/non_reporter_cannot_claim.1.json @@ -0,0 +1,214 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "PoolClaimedCount" + }, + { + "u64": 3 + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 3 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 3 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 3 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 3 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporterCount" + }, + { + "u64": 3 + } + ] + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardPerValidator" + }, + { + "u64": 3 + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 250 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardPool" + }, + { + "u64": 3 + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/test_snapshots/slashing_core/slashing/tests/pool_tests/ten_validators_fully_distribute_pool_without_double_claim.1.json b/test_snapshots/slashing_core/slashing/tests/pool_tests/ten_validators_fully_distribute_pool_without_double_claim.1.json new file mode 100644 index 0000000..4dac1f6 --- /dev/null +++ b/test_snapshots/slashing_core/slashing/tests/pool_tests/ten_validators_fully_distribute_pool_without_double_claim.1.json @@ -0,0 +1,502 @@ +{ + "generators": { + "address": 11, + "nonce": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "PoolClaimed" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimed" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimed" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimed" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimed" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimed" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimed" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimed" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimed" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimed" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolClaimedCount" + }, + { + "u64": 1 + } + ] + }, + "val": { + "u32": 10 + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporter" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PoolReporterCount" + }, + { + "u64": 1 + } + ] + }, + "val": { + "u32": 10 + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardPerValidator" + }, + { + "u64": 1 + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardPool" + }, + { + "u64": 1 + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/inclusion_delay_test.rs b/tests/inclusion_delay_test.rs new file mode 100644 index 0000000..7b229dd --- /dev/null +++ b/tests/inclusion_delay_test.rs @@ -0,0 +1,57 @@ +use sorosusu_contracts::attestation::inclusion_tracker::{ + compute_inclusion_delay, delay_reward, update_delay_rewards, wall_slots_between, +}; +use sorosusu_contracts::consensus::fork_choice::{branch_weighting, IncludedAttestation}; + +#[test] +fn inclusion_delay_counts_wall_clock_slots_across_skips() { + // Slot 10 attestation is included at slot 15. Slots 12, 13, and 14 were + // skipped, but they still count as elapsed wall-clock slots. + assert_eq!(wall_slots_between(10, 15), 5); + assert_eq!(compute_inclusion_delay(10, 15), 5); +} + +#[test] +fn delay_reward_uses_wall_clock_delay() { + let max_reward = 31; + + assert_eq!(delay_reward(10, 11, max_reward), max_reward); + assert_eq!( + delay_reward(10, 15, max_reward), + update_delay_rewards(5, max_reward) + ); + assert_eq!(delay_reward(10, 42, max_reward), 0); +} + +#[test] +fn fork_choice_weight_is_independent_of_skipped_slot_distribution() { + let first_branch = [ + IncludedAttestation { + attestation_slot: 10, + inclusion_slot: 15, + validator_weight: 2, + }, + IncludedAttestation { + attestation_slot: 11, + inclusion_slot: 15, + validator_weight: 3, + }, + ]; + let same_wall_clock_delays_with_different_skipped_slots = [ + IncludedAttestation { + attestation_slot: 20, + inclusion_slot: 25, + validator_weight: 2, + }, + IncludedAttestation { + attestation_slot: 21, + inclusion_slot: 25, + validator_weight: 3, + }, + ]; + + assert_eq!( + branch_weighting(&first_branch, 31), + branch_weighting(&same_wall_clock_delays_with_different_skipped_slots, 31) + ); +}