Skip to content

Treasury Value Mismatch#1025

Open
yHSJ wants to merge 7 commits into
mainfrom
josh/treasury-value-mismatch
Open

Treasury Value Mismatch#1025
yHSJ wants to merge 7 commits into
mainfrom
josh/treasury-value-mismatch

Conversation

@yHSJ

@yHSJ yHSJ commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

This PR introduces the TreasuryValueMismatch predicate, which needs the current epoch's treasury value at validation time. The treasury only changes at the epoch boundary but during the window in which an epoch transition is not yet stable, the stable store still holds the closing epoch's value. So the net boundary treasury delta is computed at the epoch transition and stashed on the overlay, letting reads resolve the new epoch's treasury before the flush.

Summary by CodeRabbit

  • New Features
    • Phase-one validation now verifies that a transaction’s provided current treasury value matches the ledger treasury, returning an explicit treasury-mismatch result when it differs.
  • Bug Fixes
    • Improved epoch transitions to correctly carry pending treasury adjustments across the epoch-straddle window.
  • Tests
    • Updated conformance fixtures and the phase-one initial-state schema to include pots (treasury/reserves), and added new treasury match/mismatch coverage.
  • Documentation
    • Updated the changelog with the new treasury mismatch validation entry.

@yHSJ
yHSJ requested a review from KtorZ July 9, 2026 22:05
@coderabbitai

coderabbitai Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

Too many files!

This PR contains 107 files, which is 7 over the limit of 100.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2c75b814-be98-4f3b-b2a0-d1c38d8a571e

📥 Commits

Reviewing files that changed from the base of the PR and between 96fc13e and d2fa152.

📒 Files selected for processing (107)
  • CHANGELOG.md
  • crates/amaru-ledger/src/context.rs
  • crates/amaru-ledger/src/context/assert.rs
  • crates/amaru-ledger/src/context/default/preparation.rs
  • crates/amaru-ledger/src/context/default/validation.rs
  • crates/amaru-ledger/src/rules/transaction/phase_one/fixture.rs
  • crates/amaru-ledger/src/rules/transaction/phase_one/mod.rs
  • crates/amaru-ledger/src/state.rs
  • crates/amaru-ledger/src/state/volatile.rs
  • crates/amaru-ledger/src/state/volatile/db.rs
  • crates/amaru-ledger/src/state/volatile/overlay.rs
  • crates/amaru-ledger/tests/data/phase-one/fail/BabbageNonDisjointRefInputs/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/BabbageOutputTooSmallUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/BadInputsUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/BadInputsUTxO/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/BadInputsUTxO/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ConflictingMetadataHash/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ConwayTreasuryValueMismatch/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ConwayTxRefScriptsSizeTooBig/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ConwayTxRefScriptsSizeTooBig/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ConwayTxRefScriptsSizeTooBig/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DRepAlreadyRegistered/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DRepAlreadyRegistered/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DelegateeDRepNotRegistered/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DelegateeDRepNotRegistered/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DelegateeDRepNotRegistered/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DelegateeDRepNotRegistered/3.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DelegateeStakePoolNotRegistered/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DelegateeStakePoolNotRegistered/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DelegateeStakePoolNotRegistered/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DelegateeStakePoolNotRegistered/3.json
  • crates/amaru-ledger/tests/data/phase-one/fail/FeeTooSmallUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/FeeTooSmallUTxO/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/FeeTooSmallUTxO/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/IncorrectDepositDELEG/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InputSetEmptyUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InsufficientCollateral/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/3.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/4.json
  • crates/amaru-ledger/tests/data/phase-one/fail/MaxTxSizeUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/MissingTxBodyMetadataHash/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/MissingTxMetadata/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/MissingVKeyWitnessesUTXOW/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/MissingVKeyWitnessesUTXOW/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/MissingVKeyWitnessesUTXOW/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/OutputTooBigUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/OutsideForecast/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/OutsideValidityIntervalUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/OutsideValidityIntervalUTxO/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/OutsideValidityIntervalUTxO/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeCredentialInvalidPoolDelegation/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeCredentialInvalidPoolDelegation/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeCredentialInvalidPoolDelegation/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeCredentialInvalidPoolDelegation/3.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeKeyHasNonZeroAccountBalance/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeKeyHasNonZeroAccountBalance/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeKeyRegistered/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeKeyRegistered/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeKeyRegistered/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeKeyRegistered/3.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ValueNotConservedUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ValueNotConservedUTxO/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ValueNotConservedUTxO/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ValueNotConservedUTxO/3.json
  • crates/amaru-ledger/tests/data/phase-one/fail/WrongNetworkInTxBody/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/WrongNetworkInTxOutput/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/WrongNetworkWithdrawal/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/tx-size-just-above-limit.json
  • crates/amaru-ledger/tests/data/phase-one/pass/auxiliary-data-raw-hash.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/drep-registration-script.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/drep-registration.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-delegation.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-dereg-rereg-deleg.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-deregistration.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-reg-deleg.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-unregistration.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-vote-deleg-registered-drep.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-vote-deleg.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-vote-reg-deleg-registered-drep.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-vote-reg-deleg.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/vote-deleg-registered-drep.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/vote-reg-deleg-registered-drep.json
  • crates/amaru-ledger/tests/data/phase-one/pass/invalid-tx-collateral.json
  • crates/amaru-ledger/tests/data/phase-one/pass/min-fee-at-minimum.json
  • crates/amaru-ledger/tests/data/phase-one/pass/min-fee-with-plutus-script.json
  • crates/amaru-ledger/tests/data/phase-one/pass/min-fee-with-ref-script.json
  • crates/amaru-ledger/tests/data/phase-one/pass/mint.json
  • crates/amaru-ledger/tests/data/phase-one/pass/native-script-input.json
  • crates/amaru-ledger/tests/data/phase-one/pass/reference-input.json
  • crates/amaru-ledger/tests/data/phase-one/pass/reference-script-input.json
  • crates/amaru-ledger/tests/data/phase-one/pass/reference-script-size-at-limit.json
  • crates/amaru-ledger/tests/data/phase-one/pass/script-integrity-hash/0.json
  • crates/amaru-ledger/tests/data/phase-one/pass/simple-transfer.json
  • crates/amaru-ledger/tests/data/phase-one/pass/stake-registration.json
  • crates/amaru-ledger/tests/data/phase-one/pass/treasury-value-match.json
  • crates/amaru-ledger/tests/data/phase-one/pass/tx-size-at-limit.json
  • crates/amaru-ledger/tests/data/phase-one/pass/validity-interval-both-bounds.json
  • crates/amaru-ledger/tests/data/phase-one/pass/validity-interval-end-only.json
  • crates/amaru-ledger/tests/data/phase-one/pass/validity-interval-start-only.json
  • crates/amaru-ledger/tests/data/phase-one/pass/with-metadata.json
  • crates/amaru-ledger/tests/data/phase-one/pass/withdrawal.json
  • crates/amaru-ledger/tests/data/phase-one/schema.json
  • crates/amaru-ledger/tests/data/rules-conformance.failures.toml
  • crates/amaru-ledger/tests/evaluate_ledger_states.rs

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Review on demand using usage pricing

Walkthrough

Treasury values now flow through validation contexts and epoch transitions. Phase one validates transaction treasury values, volatile state tracks pending treasury deltas across epoch boundaries, and conformance fixtures and ledger-state decoding provide the required pot data.

Changes

Treasury accounting

Layer / File(s) Summary
Treasury context plumbing
crates/amaru-ledger/src/context*.rs
Validation contexts expose treasury values, hydrate them from volatile state, and represent pot-resolution failures.
Phase-one treasury validation
crates/amaru-ledger/src/rules/transaction/phase_one/*
Phase one compares transaction treasury values with context treasury and maps mismatches to a Conway predicate.
Epoch treasury transition
crates/amaru-ledger/src/state*.rs
Epoch transitions calculate treasury deltas, carry them through volatile overlays, and handle apply, rollback, and straddle resolution.
Conformance fixtures and decoding
crates/amaru-ledger/tests/data/phase-one/*, crates/amaru-ledger/tests/evaluate_ledger_states.rs
Schemas and vectors include pot values, while decoded ledger state supplies treasury to validation contexts.
Release documentation
CHANGELOG.md
The unreleased changelog records treasury-value validation and adds related references.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant TransactionBody
  participant PhaseOneExecute
  participant ValidationContext
  participant VolatileState
  TransactionBody->>PhaseOneExecute: provide treasury_value
  PhaseOneExecute->>ValidationContext: read treasury()
  ValidationContext->>VolatileState: resolve treasury
  VolatileState-->>ValidationContext: current treasury
  ValidationContext-->>PhaseOneExecute: expected value
  PhaseOneExecute-->>TransactionBody: pass or TreasuryValueMismatch
Loading

Possibly related issues

Suggested labels: TOPIC.Ledger

Suggested reviewers: ktorz, jeluard

Poem

Treasury rolls through epoch’s gate,
Overlays hold the pending weight.
A mismatch calls, “Not quite, mate!”
Then flushes clean—ledger state. 🎮

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title matches the main change: adding treasury value mismatch validation and related test coverage.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch josh/treasury-value-mismatch

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@yHSJ yHSJ linked an issue Jul 9, 2026 that may be closed by this pull request
5 tasks
@codecov

codecov Bot commented Jul 9, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 73.19588% with 26 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
crates/amaru-ledger/src/state.rs 0.00% 17 Missing ⚠️
crates/amaru-ledger/src/context/assert.rs 25.00% 3 Missing ⚠️
crates/amaru-ledger/src/state/volatile.rs 0.00% 3 Missing ⚠️
...es/amaru-ledger/src/context/default/preparation.rs 0.00% 2 Missing ⚠️
crates/amaru-ledger/src/state/volatile/overlay.rs 87.50% 1 Missing ⚠️
Files with missing lines Coverage Δ
crates/amaru-ledger/src/context.rs 77.08% <ø> (ø)
...tes/amaru-ledger/src/context/default/validation.rs 94.32% <100.00%> (+0.07%) ⬆️
...-ledger/src/rules/transaction/phase_one/fixture.rs 93.10% <100.00%> (+0.08%) ⬆️
...maru-ledger/src/rules/transaction/phase_one/mod.rs 94.89% <100.00%> (+0.18%) ⬆️
crates/amaru-ledger/src/state/volatile/db.rs 81.14% <100.00%> (+1.95%) ⬆️
crates/amaru-ledger/src/state/volatile/overlay.rs 42.85% <87.50%> (+11.48%) ⬆️
...es/amaru-ledger/src/context/default/preparation.rs 0.00% <0.00%> (ø)
crates/amaru-ledger/src/context/assert.rs 42.26% <25.00%> (-0.43%) ⬇️
crates/amaru-ledger/src/state/volatile.rs 89.65% <0.00%> (-10.35%) ⬇️
crates/amaru-ledger/src/state.rs 28.94% <0.00%> (-0.90%) ⬇️

... and 5 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/amaru-ledger/tests/data/phase-one/pass/treasury-value-match.json`:
- Around line 11-25: Update the initialState fixture in
treasury-value-match.json to include the required pools, accounts, and dreps
fields, each initialized as an empty array, matching the structure used by the
other fixtures.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: b47eb9f9-2f12-46de-a116-84f1836e072b

📥 Commits

Reviewing files that changed from the base of the PR and between c79ef1f and a10bb35.

📒 Files selected for processing (100)
  • CHANGELOG.md
  • crates/amaru-ledger/src/context.rs
  • crates/amaru-ledger/src/context/assert.rs
  • crates/amaru-ledger/src/context/default/preparation.rs
  • crates/amaru-ledger/src/context/default/validation.rs
  • crates/amaru-ledger/src/rules/transaction/phase_one/fixture.rs
  • crates/amaru-ledger/src/rules/transaction/phase_one/mod.rs
  • crates/amaru-ledger/src/state.rs
  • crates/amaru-ledger/src/state/volatile.rs
  • crates/amaru-ledger/src/state/volatile/db.rs
  • crates/amaru-ledger/src/state/volatile/overlay.rs
  • crates/amaru-ledger/tests/data/phase-one/fail/BabbageNonDisjointRefInputs/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/BabbageOutputTooSmallUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/BadInputsUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/BadInputsUTxO/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/BadInputsUTxO/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ConflictingMetadataHash/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ConwayTreasuryValueMismatch/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ConwayTxRefScriptsSizeTooBig/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ConwayTxRefScriptsSizeTooBig/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ConwayTxRefScriptsSizeTooBig/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DRepAlreadyRegistered/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DRepAlreadyRegistered/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DelegateeDRepNotRegistered/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DelegateeDRepNotRegistered/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DelegateeDRepNotRegistered/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DelegateeDRepNotRegistered/3.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DelegateeStakePoolNotRegistered/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DelegateeStakePoolNotRegistered/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DelegateeStakePoolNotRegistered/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/DelegateeStakePoolNotRegistered/3.json
  • crates/amaru-ledger/tests/data/phase-one/fail/FeeTooSmallUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/FeeTooSmallUTxO/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/FeeTooSmallUTxO/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InputSetEmptyUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InsufficientCollateral/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/3.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/4.json
  • crates/amaru-ledger/tests/data/phase-one/fail/MaxTxSizeUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/MissingTxBodyMetadataHash/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/MissingTxMetadata/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/MissingVKeyWitnessesUTXOW/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/MissingVKeyWitnessesUTXOW/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/MissingVKeyWitnessesUTXOW/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/OutputTooBigUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/OutsideForecast/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/OutsideValidityIntervalUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/OutsideValidityIntervalUTxO/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/OutsideValidityIntervalUTxO/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeCredentialInvalidPoolDelegation/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeCredentialInvalidPoolDelegation/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeCredentialInvalidPoolDelegation/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeCredentialInvalidPoolDelegation/3.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeKeyRegistered/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeKeyRegistered/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeKeyRegistered/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/StakeKeyRegistered/3.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ValueNotConservedUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ValueNotConservedUTxO/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ValueNotConservedUTxO/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ValueNotConservedUTxO/3.json
  • crates/amaru-ledger/tests/data/phase-one/fail/WrongNetworkInTxBody/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/WrongNetworkInTxOutput/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/WrongNetworkWithdrawal/0.json
  • crates/amaru-ledger/tests/data/phase-one/pass/auxiliary-data-raw-hash.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/drep-registration-script.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/drep-registration.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-delegation.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-dereg-rereg-deleg.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-reg-deleg.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-vote-deleg-registered-drep.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-vote-deleg.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-vote-reg-deleg-registered-drep.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-vote-reg-deleg.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/vote-deleg-registered-drep.json
  • crates/amaru-ledger/tests/data/phase-one/pass/certificate/vote-reg-deleg-registered-drep.json
  • crates/amaru-ledger/tests/data/phase-one/pass/invalid-tx-collateral.json
  • crates/amaru-ledger/tests/data/phase-one/pass/min-fee-at-minimum.json
  • crates/amaru-ledger/tests/data/phase-one/pass/min-fee-with-plutus-script.json
  • crates/amaru-ledger/tests/data/phase-one/pass/min-fee-with-ref-script.json
  • crates/amaru-ledger/tests/data/phase-one/pass/mint.json
  • crates/amaru-ledger/tests/data/phase-one/pass/native-script-input.json
  • crates/amaru-ledger/tests/data/phase-one/pass/reference-input.json
  • crates/amaru-ledger/tests/data/phase-one/pass/reference-script-input.json
  • crates/amaru-ledger/tests/data/phase-one/pass/reference-script-size-at-limit.json
  • crates/amaru-ledger/tests/data/phase-one/pass/script-integrity-hash/0.json
  • crates/amaru-ledger/tests/data/phase-one/pass/simple-transfer.json
  • crates/amaru-ledger/tests/data/phase-one/pass/stake-registration.json
  • crates/amaru-ledger/tests/data/phase-one/pass/treasury-value-match.json
  • crates/amaru-ledger/tests/data/phase-one/pass/validity-interval-both-bounds.json
  • crates/amaru-ledger/tests/data/phase-one/pass/validity-interval-end-only.json
  • crates/amaru-ledger/tests/data/phase-one/pass/validity-interval-start-only.json
  • crates/amaru-ledger/tests/data/phase-one/pass/with-metadata.json
  • crates/amaru-ledger/tests/data/phase-one/pass/withdrawal.json
  • crates/amaru-ledger/tests/data/phase-one/schema.json
  • crates/amaru-ledger/tests/data/rules-conformance.failures.toml
  • crates/amaru-ledger/tests/evaluate_ledger_states.rs
💤 Files with no reviewable changes (1)
  • crates/amaru-ledger/tests/data/rules-conformance.failures.toml
🚧 Files skipped from review as they are similar to previous changes (47)
  • crates/amaru-ledger/tests/data/phase-one/fail/BadInputsUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/MissingVKeyWitnessesUTXOW/0.json
  • crates/amaru-ledger/tests/data/phase-one/pass/native-script-input.json
  • crates/amaru-ledger/tests/data/phase-one/fail/WrongNetworkInTxOutput/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ConwayTreasuryValueMismatch/0.json
  • crates/amaru-ledger/tests/data/phase-one/pass/mint.json
  • crates/amaru-ledger/tests/data/phase-one/fail/ConflictingMetadataHash/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/MissingVKeyWitnessesUTXOW/2.json
  • crates/amaru-ledger/tests/data/phase-one/fail/BabbageOutputTooSmallUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/WrongNetworkWithdrawal/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/OutputTooBigUTxO/0.json
  • crates/amaru-ledger/src/context.rs
  • crates/amaru-ledger/tests/data/phase-one/fail/MissingTxBodyMetadataHash/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/MaxTxSizeUTxO/0.json
  • crates/amaru-ledger/src/context/default/preparation.rs
  • crates/amaru-ledger/tests/data/phase-one/fail/MissingTxMetadata/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/3.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/4.json
  • crates/amaru-ledger/tests/data/phase-one/pass/validity-interval-start-only.json
  • crates/amaru-ledger/tests/data/phase-one/pass/withdrawal.json
  • crates/amaru-ledger/tests/data/phase-one/fail/WrongNetworkInTxBody/0.json
  • crates/amaru-ledger/tests/data/phase-one/pass/script-integrity-hash/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InputSetEmptyUTxO/0.json
  • crates/amaru-ledger/tests/data/phase-one/fail/BadInputsUTxO/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/1.json
  • crates/amaru-ledger/tests/data/phase-one/fail/OutsideValidityIntervalUTxO/1.json
  • crates/amaru-ledger/tests/data/phase-one/pass/auxiliary-data-raw-hash.json
  • crates/amaru-ledger/tests/data/phase-one/pass/validity-interval-both-bounds.json
  • crates/amaru-ledger/tests/data/phase-one/pass/reference-input.json
  • crates/amaru-ledger/src/state/volatile.rs
  • crates/amaru-ledger/tests/data/phase-one/fail/MissingVKeyWitnessesUTXOW/1.json
  • crates/amaru-ledger/tests/data/phase-one/pass/stake-registration.json
  • crates/amaru-ledger/tests/data/phase-one/pass/validity-interval-end-only.json
  • crates/amaru-ledger/tests/data/phase-one/fail/BabbageNonDisjointRefInputs/0.json
  • crates/amaru-ledger/tests/data/phase-one/pass/with-metadata.json
  • crates/amaru-ledger/src/context/default/validation.rs
  • crates/amaru-ledger/tests/data/phase-one/fail/OutsideForecast/0.json
  • crates/amaru-ledger/tests/data/phase-one/pass/simple-transfer.json
  • crates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/2.json
  • crates/amaru-ledger/src/rules/transaction/phase_one/mod.rs
  • crates/amaru-ledger/src/state/volatile/overlay.rs
  • crates/amaru-ledger/src/state.rs
  • crates/amaru-ledger/src/context/assert.rs
  • crates/amaru-ledger/src/rules/transaction/phase_one/fixture.rs
  • crates/amaru-ledger/tests/evaluate_ledger_states.rs
  • crates/amaru-ledger/src/state/volatile/db.rs

@KtorZ

KtorZ commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

@yHSJ It required some changes to the overlay; notably the unclaimed rewards (and gov proposals, etc.) were only calculated at apply

This is not right? The overlay is calculated at the epoch transition, not during apply 🤔

@yHSJ yHSJ self-assigned this Jul 13, 2026
@yHSJ

yHSJ commented Jul 13, 2026

Copy link
Copy Markdown
Contributor Author

This is not right? The overlay is calculated at the epoch transition, not during apply 🤔

Poorly phrased, updated the wording in the PR description.

The overlay only contains the rewards.delta_treasury, which doesn't include donations, and pool/withdrawal missing account refunds requires a DB read. Computing and storing the value here is duplicated work, but is lower risk (without a significant added cost) than reworking the epoch transition logic in my opinion.

yHSJ added 6 commits July 16, 2026 15:10
Signed-off-by: yHSJ <josh@securitybot.info>
Notably, this is not a fully conformant implementation. We are only reading the treasury value in the DB, which misses the case when there is a different treasury value in our most recently overlay. This commit is a single unit of work, and the follow up to complete it is coming after.

Signed-off-by: yHSJ <josh@securitybot.info>
This is currently duplicated work; the overlay only calculates the leftovers at application, not at creation. Instead of deduplicating, I introduced duplicate work to complete the implementation and verify correctness. Deduplicating this logic should be a future step.

Signed-off-by: yHSJ <josh@securitybot.info>
Signed-off-by: yHSJ <josh@securitybot.info>
Signed-off-by: yHSJ <josh@securitybot.info>
@yHSJ
yHSJ force-pushed the josh/treasury-value-mismatch branch from 96fc13e to 0b17529 Compare July 16, 2026 20:39
Signed-off-by: yHSJ <josh@securitybot.info>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Ledger predicate: ConwayTreasuryValueMismatch

2 participants