Treasury Value Mismatch#1025
Conversation
|
Important Review skippedToo many files! This PR contains 107 files, which is 7 over the limit of 100. To get a review, narrow the scope: Upgrade to a paid plan to raise the limit. ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (107)
You can disable this status message by setting the Use the checkbox below for a quick retry:
WalkthroughTreasury 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. ChangesTreasury accounting
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
Possibly related issues
Suggested labels: Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
df61e89 to
a10bb35
Compare
There was a problem hiding this comment.
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
📒 Files selected for processing (100)
CHANGELOG.mdcrates/amaru-ledger/src/context.rscrates/amaru-ledger/src/context/assert.rscrates/amaru-ledger/src/context/default/preparation.rscrates/amaru-ledger/src/context/default/validation.rscrates/amaru-ledger/src/rules/transaction/phase_one/fixture.rscrates/amaru-ledger/src/rules/transaction/phase_one/mod.rscrates/amaru-ledger/src/state.rscrates/amaru-ledger/src/state/volatile.rscrates/amaru-ledger/src/state/volatile/db.rscrates/amaru-ledger/src/state/volatile/overlay.rscrates/amaru-ledger/tests/data/phase-one/fail/BabbageNonDisjointRefInputs/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/BabbageOutputTooSmallUTxO/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/BadInputsUTxO/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/BadInputsUTxO/1.jsoncrates/amaru-ledger/tests/data/phase-one/fail/BadInputsUTxO/2.jsoncrates/amaru-ledger/tests/data/phase-one/fail/ConflictingMetadataHash/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/ConwayTreasuryValueMismatch/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/ConwayTxRefScriptsSizeTooBig/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/ConwayTxRefScriptsSizeTooBig/1.jsoncrates/amaru-ledger/tests/data/phase-one/fail/ConwayTxRefScriptsSizeTooBig/2.jsoncrates/amaru-ledger/tests/data/phase-one/fail/DRepAlreadyRegistered/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/DRepAlreadyRegistered/1.jsoncrates/amaru-ledger/tests/data/phase-one/fail/DelegateeDRepNotRegistered/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/DelegateeDRepNotRegistered/1.jsoncrates/amaru-ledger/tests/data/phase-one/fail/DelegateeDRepNotRegistered/2.jsoncrates/amaru-ledger/tests/data/phase-one/fail/DelegateeDRepNotRegistered/3.jsoncrates/amaru-ledger/tests/data/phase-one/fail/DelegateeStakePoolNotRegistered/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/DelegateeStakePoolNotRegistered/1.jsoncrates/amaru-ledger/tests/data/phase-one/fail/DelegateeStakePoolNotRegistered/2.jsoncrates/amaru-ledger/tests/data/phase-one/fail/DelegateeStakePoolNotRegistered/3.jsoncrates/amaru-ledger/tests/data/phase-one/fail/FeeTooSmallUTxO/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/FeeTooSmallUTxO/1.jsoncrates/amaru-ledger/tests/data/phase-one/fail/FeeTooSmallUTxO/2.jsoncrates/amaru-ledger/tests/data/phase-one/fail/InputSetEmptyUTxO/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/InsufficientCollateral/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/1.jsoncrates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/2.jsoncrates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/3.jsoncrates/amaru-ledger/tests/data/phase-one/fail/InvalidWitnessesUTXOW/4.jsoncrates/amaru-ledger/tests/data/phase-one/fail/MaxTxSizeUTxO/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/MissingTxBodyMetadataHash/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/MissingTxMetadata/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/MissingVKeyWitnessesUTXOW/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/MissingVKeyWitnessesUTXOW/1.jsoncrates/amaru-ledger/tests/data/phase-one/fail/MissingVKeyWitnessesUTXOW/2.jsoncrates/amaru-ledger/tests/data/phase-one/fail/OutputTooBigUTxO/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/OutsideForecast/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/OutsideValidityIntervalUTxO/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/OutsideValidityIntervalUTxO/1.jsoncrates/amaru-ledger/tests/data/phase-one/fail/OutsideValidityIntervalUTxO/2.jsoncrates/amaru-ledger/tests/data/phase-one/fail/StakeCredentialInvalidPoolDelegation/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/StakeCredentialInvalidPoolDelegation/1.jsoncrates/amaru-ledger/tests/data/phase-one/fail/StakeCredentialInvalidPoolDelegation/2.jsoncrates/amaru-ledger/tests/data/phase-one/fail/StakeCredentialInvalidPoolDelegation/3.jsoncrates/amaru-ledger/tests/data/phase-one/fail/StakeKeyRegistered/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/StakeKeyRegistered/1.jsoncrates/amaru-ledger/tests/data/phase-one/fail/StakeKeyRegistered/2.jsoncrates/amaru-ledger/tests/data/phase-one/fail/StakeKeyRegistered/3.jsoncrates/amaru-ledger/tests/data/phase-one/fail/ValueNotConservedUTxO/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/ValueNotConservedUTxO/1.jsoncrates/amaru-ledger/tests/data/phase-one/fail/ValueNotConservedUTxO/2.jsoncrates/amaru-ledger/tests/data/phase-one/fail/ValueNotConservedUTxO/3.jsoncrates/amaru-ledger/tests/data/phase-one/fail/WrongNetworkInTxBody/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/WrongNetworkInTxOutput/0.jsoncrates/amaru-ledger/tests/data/phase-one/fail/WrongNetworkWithdrawal/0.jsoncrates/amaru-ledger/tests/data/phase-one/pass/auxiliary-data-raw-hash.jsoncrates/amaru-ledger/tests/data/phase-one/pass/certificate/drep-registration-script.jsoncrates/amaru-ledger/tests/data/phase-one/pass/certificate/drep-registration.jsoncrates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-delegation.jsoncrates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-dereg-rereg-deleg.jsoncrates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-reg-deleg.jsoncrates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-vote-deleg-registered-drep.jsoncrates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-vote-deleg.jsoncrates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-vote-reg-deleg-registered-drep.jsoncrates/amaru-ledger/tests/data/phase-one/pass/certificate/stake-vote-reg-deleg.jsoncrates/amaru-ledger/tests/data/phase-one/pass/certificate/vote-deleg-registered-drep.jsoncrates/amaru-ledger/tests/data/phase-one/pass/certificate/vote-reg-deleg-registered-drep.jsoncrates/amaru-ledger/tests/data/phase-one/pass/invalid-tx-collateral.jsoncrates/amaru-ledger/tests/data/phase-one/pass/min-fee-at-minimum.jsoncrates/amaru-ledger/tests/data/phase-one/pass/min-fee-with-plutus-script.jsoncrates/amaru-ledger/tests/data/phase-one/pass/min-fee-with-ref-script.jsoncrates/amaru-ledger/tests/data/phase-one/pass/mint.jsoncrates/amaru-ledger/tests/data/phase-one/pass/native-script-input.jsoncrates/amaru-ledger/tests/data/phase-one/pass/reference-input.jsoncrates/amaru-ledger/tests/data/phase-one/pass/reference-script-input.jsoncrates/amaru-ledger/tests/data/phase-one/pass/reference-script-size-at-limit.jsoncrates/amaru-ledger/tests/data/phase-one/pass/script-integrity-hash/0.jsoncrates/amaru-ledger/tests/data/phase-one/pass/simple-transfer.jsoncrates/amaru-ledger/tests/data/phase-one/pass/stake-registration.jsoncrates/amaru-ledger/tests/data/phase-one/pass/treasury-value-match.jsoncrates/amaru-ledger/tests/data/phase-one/pass/validity-interval-both-bounds.jsoncrates/amaru-ledger/tests/data/phase-one/pass/validity-interval-end-only.jsoncrates/amaru-ledger/tests/data/phase-one/pass/validity-interval-start-only.jsoncrates/amaru-ledger/tests/data/phase-one/pass/with-metadata.jsoncrates/amaru-ledger/tests/data/phase-one/pass/withdrawal.jsoncrates/amaru-ledger/tests/data/phase-one/schema.jsoncrates/amaru-ledger/tests/data/rules-conformance.failures.tomlcrates/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
This is not right? The overlay is calculated at the epoch transition, not during |
Poorly phrased, updated the wording in the PR description. The overlay only contains the |
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>
Signed-off-by: yHSJ <josh@securitybot.info>
96fc13e to
0b17529
Compare
Signed-off-by: yHSJ <josh@securitybot.info>
This PR introduces the
TreasuryValueMismatchpredicate, 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
pots(treasury/reserves), and added new treasury match/mismatch coverage.