Skip to content

refactor(platform): price storage refunds from the block's fee schedule and drop the fee history from Drive - #5798

Open
QuantumExplorer wants to merge 1 commit into
v5.1-devfrom
claude/drop-fee-history-map
Open

QuantumExplorer wants to merge 1 commit into
v5.1-devfrom
claude/drop-fee-history-map

Conversation

@QuantumExplorer

@QuantumExplorer QuantumExplorer commented Nov 7, 2026 •

Copy link
Copy Markdown
Member

Basic explanation

What this does: when stored data is deleted, its owner gets part of the storage fee back. To work out that refund, the code passes around a map saying which fee schedule each past epoch used. No block on any network reads that map, because every fee schedule has the same number and the same storage price, and the refund code skips the map for that number. This PR removes the map from the fee code. Refunds now read the storage price from the current block's fee schedule.

Value: about 1,200 fewer lines, and one less argument on 45 functions and about 860 calls. A caller can no longer forget the map or pass the wrong one, so there is nothing left for a "fee history is required" rule to check. The saved map also can't make nodes disagree any more (#4647), since block execution no longer reads it.

Risks: Low. No fee or refund changes at any protocol version, for the reason given under "In-place changes to shipped generations" below, and a new test checks this at every protocol version. Two things to watch:

  • A future storage price change. Such a change needs more work, because refunds would then have to use the price from when the bytes were stored. A new test fails if a schedule changes the price, so this can't be missed.
  • Merge conflicts. This touches over 300 files by one argument, so open PRs that call these functions will conflict. See "Open PRs affected" below.

Issue being fixed or feature implemented

Drive::calculate_fee and everything above it took previous_fee_versions, a map from epoch to fee schedule that platform state keeps. Its only reader was the refund branch of LowLevelDriveOperation::consume_to_fees_v0, and that branch never read it in production:

  • every shipped schedule (FEE_VERSION1 to FEE_VERSION4) has fee_version_number: 1;
  • for number 1, consume_to_fees_v0 priced refunds against an empty map instead of the one it was given;
  • every shipped schedule has the same storage rate (FEE_STORAGE_VERSION1, 27,000 credits per byte).

So the argument was threaded through 45 functions without affecting any result.

What was done?

Refund pricing. FeeRefunds::from_storage_removal takes the block's &FeeVersion instead of the map and reads storage.storage_disk_usage_credit_per_byte from it. consume_to_fees_v0 loses its fee_version_number == 1 branch.

Before:

if fee_version.fee_version_number == 1 {
    FeeRefunds::from_storage_removal(removal, epoch.index, epochs_per_era, &BTreeMap::default())?
} else {
    let previous_fee_versions = previous_fee_versions.ok_or(/* CorruptedCodeExecution */)?;
    FeeRefunds::from_storage_removal(removal, epoch.index, epochs_per_era, previous_fee_versions)?
}

After:

FeeRefunds::from_storage_removal(removal, epoch.index, epochs_per_era, fee_version)?

For 1,000 bytes stored in epoch 12 and removed in epoch 15, the refund is the same amount before and after, at every protocol version.

The parameter. Removed from Drive::calculate_fee, apply_drive_operations, update_contract, the document, identity and token balance methods that forwarded it, and execute_event, validate_fees_of_event and process_validation_result in drive-abci. check_tx, process_raw_state_transitions, process_block_fees_and_validate_sum_trees and update_masternode_identities stop reading it from platform state.

Before:

Drive::calculate_fee(
    None,
    Some(cost_operations),
    &block_info.epoch,
    self.config.epochs_per_era,
    platform_version,
    previous_fee_versions,
)

After:

Drive::calculate_fee(
    None,
    Some(cost_operations),
    &block_info.epoch,
    self.config.epochs_per_era,
    platform_version,
)

The read helpers. dpp::fee::default_costs::{KnownCostItem, EpochCosts} existed only to look prices up through the map, and after this change only tests used them, so they are gone. Those tests read the rate from FeeVersion::first(), the schedule their one-entry maps resolved to.

Platform state is unchanged. It still records the map at each protocol upgrade and saves it in the same format, so saved states load as before. It is now history that nothing in block execution reads, and it is what a future storage price change could build on.

Book. Signatures and code samples updated in drive/cost-tracking.md, drive/batch-operations.md, drive/finalize-tasks.md, state-transitions/drive-operations.md, versioning/versioned-dispatch.md and data-model/key-limits.md. fees/overview.md and contributing/coding-conventions.md now state the refund pricing rule, and the conventions chapter no longer lists this parameter as the exception to "platform_version is the last parameter".

A renamed test. test_document_refund_after_10_epochs_on_different_fee_version_increasing_fees used an unchanged copy of the latest version, so it never had different fees. Its map entry is gone and it is now test_document_refund_after_10_epochs, with the same assertions.

If the storage price ever changes

A refund is priced at the rate of the block that removes the bytes, while the owner paid the rate of the epoch that stored them. That is correct only while the rate never changes, which is true today. should_keep_one_storage_rate_on_every_protocol_version fails on a schedule that changes the rate, so that change has to come with a refund lookup by storing epoch. This is not a new limit: the removed code also looked up the removal epoch, not the storing epoch.

Open PRs affected

  • #4706: its required-history rule, calculate_fee v1 and its price-before-commit generations have no purpose after this. Its recorded-owner refund credits are unaffected but will conflict.
  • #4704: records the genesis fee generation in the map and tests refunds across a fee-version boundary with a mock doubled-storage schedule. With nothing reading the map, those tests no longer exercise it, and its check that a missing history is rejected no longer applies.
  • #4648: saves the map in its reduced state. That still works, but no block execution reads the result.
  • #5736: its description explains the schedule's number through KnownCostItem, which this removes. Mechanical conflicts only.

How Has This Been Tested?

New tests:

  • should_price_a_refund_the_same_at_every_protocol_version (rs-drive, fees/calculate_fee): runs a removal with owner and system bytes through Drive::calculate_fee at every entry of PLATFORM_VERSIONS, and compares it with the amount computed from FeeVersion::first(), the schedule the old code always used.
  • should_keep_one_storage_rate_on_every_protocol_version (rs-platform-version, fee/mod.rs): fails if any protocol version changes the storage rate.
  • should_price_refunds_at_the_storage_rate_of_the_given_schedule (rs-dpp, fee_result/refunds.rs): a doubled-rate schedule gives the refund for the doubled rate.

Local checks, all passing:

  • cargo fmt --all, cargo clippy -p platform-version -p dpp -p drive -p drive-abci --all-targets -- -D warnings, cargo check --workspace --all-targets and cargo check -p drive --no-default-features --features verify.
  • Targeted tests: platform-version fee (6), dpp fee (71), drive fees, document insert, update and delete, and moderation (307), drive-abci block end events, fee validation, event execution, masternode identity updates, shielded identity creation and protocol upgrade (127).

The drive integration tests and the strategy tests were only compiled locally, so CI is their first run.

Existing tests with hard-coded fee and refund amounts (document insert, update and delete, the refund and clawback tests in block_processing_end_events) were changed only to drop the argument, so any changed amount would fail them.

In-place changes to shipped generations

All edits are in place and none changes an output:

Generation Selected by Why consensus cannot change
LowLevelDriveOperation::consume_to_fees_v0, Drive::calculate_fee_v0, and FeeRefunds::from_storage_removal (unversioned) every protocol version The old code priced a refund at FeeVersion::first()'s rate because every shipped schedule has number 1. The new code reads the block schedule's rate. All four schedules use FEE_STORAGE_VERSION1, so it is the same number. The else branch and its CorruptedCodeExecution needed a number other than 1, so they were unreachable.
apply_drive_operations v0, v1, v2; update_contract v0, v1, v2 the protocol versions that select each Only the parameter they forwarded is removed.
v0 of add_document_for_contract, update_document_for_contract, update_document_for_contract_id, update_document_with_serialization_for_contract, delete_document_for_contract, delete_document_for_contract_id, delete_index_only_document_for_contract, remove_from_identity_balance, update_identity_revision, remove_from_identity_token_balance, add_to_identity_token_balance the protocol versions that select each Only the parameter they forwarded is removed.
execute_event v0, v1; validate_fees_of_event v0, v1; process_validation_result v0, v1; update_masternode_identities v0, v1; process_block_fees_and_validate_sum_trees v0; process_raw_state_transitions v0; check_tx v0 the protocol versions that select each They stop reading the map from platform state and stop forwarding it. Nothing they do depends on it.

Every other edited generation only stops passing the argument at a call site.

from_storage_removal also loses Epoch::new(current_epoch_index)?. That can only fail above MAX_EPOCH (65,279), and the index it receives comes from an existing Epoch.

Breaking Changes

None for the protocol, the saved platform state or any client. Rust API only: the signatures above change, and dpp::fee::default_costs::{KnownCostItem, EpochCosts} are removed. No other crate in this workspace uses them.

Checklist:

  • I have performed a self-review of my own code
  • My Rust, FFI, WASM, Swift or Kotlin changes follow the coding conventions
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated relevant unit/integration/functional/e2e tests
  • I have added "!" to the title and described breaking changes in the corresponding section if my code contains any
  • I have made corresponding changes to the documentation if needed
  • If I added or changed GroveDB structure, I described it in the area's structure.rs, regenerated grovedb-structure.json, and checked the structure viewer link posted on this pull request
  • If I added or changed a system contract's document schemas, I checked the contract viewer link posted on this pull request

For repository code-owners and collaborators only

  • I have assigned this pull request to a milestone

🤖 Generated with Claude Code

PR Hygiene · 3e41c7f

  • Bots — thepastaclaw ✓
  • Self-review — post /self-reviewed
  • Build green
  • Approvals — you own every area touched; none needed

When every merge requirement is met, the PR Hygiene check passes. Reviewer limits do not block merging; other required GitHub checks and protections still apply.

…le and drop the fee history from Drive

Drive::calculate_fee and everything above it took previous_fee_versions, a
map from epoch to fee schedule. Its only reader was the refund branch of
consume_to_fees_v0, which ignored it for fee_version_number 1, the number
of every shipped schedule. Every shipped schedule also has the same storage
rate, so no block on any network reads the map.

FeeRefunds::from_storage_removal now takes the block's FeeVersion and the
parameter is gone from 45 functions and about 860 calls, along with
KnownCostItem and EpochCosts, which only read through the map. Platform
state still records and saves the map in the same format.

No fee or refund changes at any protocol version.
should_price_a_refund_the_same_at_every_protocol_version checks that, and
should_keep_one_storage_rate_on_every_protocol_version fails on a schedule
that changes the rate, since refunds would then need the rate of the epoch
that stored the bytes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added this to the v5.1.0 milestone Nov 7, 2026
@coderabbitai

coderabbitai Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 336 files, which is 236 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

Usage-priced reviews support at most 300 files.

Run configuration

Commits

Reviewing files that changed from the base of the PR and between f73f1b6 and 3e41c7f.

Files selected for processing: 336

  • book/src/contributing/coding-conventions.md
  • book/src/data-model/key-limits.md
  • book/src/drive/batch-operations.md
  • book/src/drive/cost-tracking.md
  • book/src/drive/finalize-tasks.md
  • book/src/fees/overview.md
  • book/src/state-transitions/drive-operations.md
  • book/src/versioning/versioned-dispatch.md
  • packages/rs-dpp/src/fee/default_costs/mod.rs
  • packages/rs-dpp/src/fee/fee_result/refunds.rs
  • packages/rs-drive-abci/src/abci/handler/finalize_block.rs
  • packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/add_process_epoch_change_operations/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/process_block_fees_and_validate_sum_trees/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/tests.rs
  • packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_masternode_identities/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_masternode_identities/v1/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_masternode_identities/v1/payout_tests.rs
  • packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/fee_pool_inwards_distribution/add_distribute_block_fees_into_pools_operations/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/fee_pool_inwards_distribution/add_distribute_block_fees_into_pools_operations/v1/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/fee_pool_inwards_distribution/add_distribute_storage_fee_to_epochs_operations/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/fee_pool_inwards_distribution/add_distribute_storage_fee_to_epochs_operations/v1/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations/v1/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v1/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/test/addresses.rs
  • packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v1/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/token_history_storage_flags_tests.rs
  • packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v1/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_validation_result/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_validation_result/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_validation_result/v1/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v1/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/voting/award_document_to_winner/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/withdrawals/calculate_core_anchored_withdrawal_limit/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/withdrawals/has_pending_withdrawal_work/v0/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v1/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v1/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v2/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/v0/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/state_v1/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_index_only_delete_transition_action/state_v0/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_shielded_pool_common/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/withdrawals/v0/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/withdrawals/v2/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/state/v0/fetch_contender.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/action_fees.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/commit_reveal_lookup.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/derived_index_values.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/dpns_v3.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/duplicate_keys.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/gas_sponsorship.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/long_string_sizing.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/token_market_orders.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/token/shielded/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/token/shielded/nullifier_batch_guard.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/property_constraint_aggregates.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/contract_fee_claim/tests.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/contract_user_moderation/tests/seated_team.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/contract_user_moderation/tests/seated_team/settled.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create_from_shielded_pool/tests.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer_to_addresses/tests.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/shield_from_asset_lock/tests.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/shield_from_identity/tests.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/shield_from_identity/transform_into_action/v0/mod.rs
  • packages/rs-drive-abci/src/platform_types/platform_state/mod.rs
  • packages/rs-drive-abci/src/query/address_funds/address_info/v0/mod.rs
  • packages/rs-drive-abci/src/query/address_funds/addresses_branch_state/v0/mod.rs
  • packages/rs-drive-abci/src/query/address_funds/addresses_infos/v0/mod.rs
  • packages/rs-drive-abci/src/query/contract_moderation_queries/contract_document_removals/v0/mod.rs
  • packages/rs-drive-abci/src/query/contract_moderation_queries/contract_fee_pots/v0/mod.rs
  • packages/rs-drive-abci/src/query/contract_moderation_queries/contract_moderation_action_counts/v0/mod.rs
  • packages/rs-drive-abci/src/query/contract_moderation_queries/mod.rs
  • packages/rs-drive-abci/src/query/document_history/v0/mod.rs
  • packages/rs-drive-abci/src/query/document_query/v1/dispatch/chained.rs
  • packages/rs-drive-abci/src/query/document_query/v1/tests.rs
  • packages/rs-drive-abci/src/query/mod.rs
  • packages/rs-drive-abci/src/test/helpers/fast_forward_to_block.rs
  • packages/rs-drive-abci/src/test/helpers/fee_pools.rs
  • packages/rs-drive-abci/tests/document_outcome.rs
  • packages/rs-drive-abci/tests/document_query_signature.rs
  • packages/rs-drive-abci/tests/older_node_answers.rs
  • packages/rs-drive-abci/tests/query_request_errors/composite_caps.rs
  • packages/rs-drive-abci/tests/query_request_errors/document_features.rs
  • packages/rs-drive-abci/tests/query_request_errors/offset_controls.rs
  • packages/rs-drive-abci/tests/strategy_tests/test_cases/vote_extension_round_tests.rs
  • packages/rs-drive/benches/document_average_worst_case.rs
  • packages/rs-drive/benches/document_count_worst_case.rs
  • packages/rs-drive/benches/document_sum_worst_case.rs
  • packages/rs-drive/src/drive/address_funds/prove/prove_address_funds_trunk_query/v0/mod.rs
  • packages/rs-drive/src/drive/address_funds/prove/prove_balance_and_nonce/v0/mod.rs
  • packages/rs-drive/src/drive/address_funds/prove/prove_balances_with_nonces/v0/mod.rs
  • packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs
  • packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v1/mod.rs
  • packages/rs-drive/src/drive/contract/fee_pots/fetch_action_fee_multiplier/v0/mod.rs
  • packages/rs-drive/src/drive/contract/fee_pots/fetch_contract_fee_pot/mod.rs
  • packages/rs-drive/src/drive/contract/fee_pots/tests.rs
  • packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs
  • packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/mod.rs
  • packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/v0/mod.rs
  • packages/rs-drive/src/drive/contract/insert/add_contract_to_storage/v1/mod.rs
  • packages/rs-drive/src/drive/contract/insert/add_description/v0/mod.rs
  • packages/rs-drive/src/drive/contract/insert/add_new_keywords/v0/mod.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/tests/batched_group_drain.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/tests/chained_query_e2e_tests.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/tests/composite_query_e2e_tests.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/tests/countable_e2e_tests.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/tests/index_only_array_index_e2e_tests.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/tests/index_only_e2e_tests.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/tests/index_only_scalar_terminal_e2e_tests.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/tests/noncounted_sibling_e2e_tests.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/tests/preallocated_index_e2e_tests.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/tests/prefix_ranked_index_e2e_tests.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/tests/range_countable_index_e2e_tests.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/tests/ranked_index_e2e_tests.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/tests/shared_prefix_aggregation_e2e_tests.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/tests/skip_if_absent_e2e_tests.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/tests/summable_off_count_index_e2e_tests.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v0/tests/typed_array_counter_index_e2e_tests.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v1/mod.rs
  • packages/rs-drive/src/drive/contract/insert/insert_contract/v2/mod.rs
  • packages/rs-drive/src/drive/contract/migration/rekey_unsigned_integer_index_values.rs
  • packages/rs-drive/src/drive/contract/mod.rs
  • packages/rs-drive/src/drive/contract/moderation/action_count_tests.rs
  • packages/rs-drive/src/drive/contract/moderation/add_contract_ban/v0/mod.rs
  • packages/rs-drive/src/drive/contract/moderation/add_contract_suspension/v0/mod.rs
  • packages/rs-drive/src/drive/contract/moderation/add_contract_warning/v0/mod.rs
  • packages/rs-drive/src/drive/contract/moderation/document_removal_tests.rs
  • packages/rs-drive/src/drive/contract/moderation/fetch_contract_document_removals/mod.rs
  • packages/rs-drive/src/drive/contract/moderation/fetch_contract_moderation_action_counts/mod.rs
  • packages/rs-drive/src/drive/contract/moderation/fetch_contract_moderation_status/mod.rs
  • packages/rs-drive/src/drive/contract/moderation/fetch_contract_team_action/mod.rs
  • packages/rs-drive/src/drive/contract/moderation/fetch_contract_team_action_signers/mod.rs
  • packages/rs-drive/src/drive/contract/moderation/remove_contract_ban/v0/mod.rs
  • packages/rs-drive/src/drive/contract/moderation/remove_contract_suspension/v0/mod.rs
  • packages/rs-drive/src/drive/contract/moderation/remove_contract_warnings/v0/mod.rs
  • packages/rs-drive/src/drive/contract/moderation/team_action_tests.rs
  • packages/rs-drive/src/drive/contract/moderation/tests.rs
  • packages/rs-drive/src/drive/contract/update/update_contract/mod.rs
  • packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs
  • packages/rs-drive/src/drive/contract/update/update_contract/v1/mod.rs
  • packages/rs-drive/src/drive/contract/update/update_contract/v2/mod.rs
  • packages/rs-drive/src/drive/contract/update/update_description/v0/mod.rs
  • packages/rs-drive/src/drive/contract/update/update_keywords/v0/mod.rs
  • packages/rs-drive/src/drive/contract_groups/fetch/fetch_contract_group_info/v0/mod.rs
  • packages/rs-drive/src/drive/contract_groups/fetch/fetch_contract_group_memberships_for_contract/v0/mod.rs
  • packages/rs-drive/src/drive/contract_groups/insert/insert_contract_group/v0/mod.rs
  • packages/rs-drive/src/drive/contract_groups/insert/insert_contract_group_memberships/v0/mod.rs
  • packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/add_delete_pending_epoch_refunds_except_specified/v0/mod.rs
  • packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/fetch_and_add_pending_epoch_refunds_to_collection/v0/mod.rs
  • packages/rs-drive/src/drive/document/cost/tests.rs
  • packages/rs-drive/src/drive/document/delete/delete_document_for_contract/mod.rs
  • packages/rs-drive/src/drive/document/delete/delete_document_for_contract/v0/mod.rs
  • packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/mod.rs
  • packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/v0/mod.rs
  • packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/mod.rs
  • packages/rs-drive/src/drive/document/delete/delete_index_only_document_for_contract_operations/mod.rs
  • packages/rs-drive/src/drive/document/delete/delete_index_only_document_for_contract_operations/v0/mod.rs
  • packages/rs-drive/src/drive/document/delete/mod.rs
  • packages/rs-drive/src/drive/document/derived_index_values.rs
  • packages/rs-drive/src/drive/document/expiration/expiration_tests.rs
  • packages/rs-drive/src/drive/document/get_fetch/fetch_document_history/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v2/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/insert/add_document/v0/mod.rs
  • packages/rs-drive/src/drive/document/insert/add_document_for_contract/aggregating_index_fee_estimate_tests.rs
  • packages/rs-drive/src/drive/document/insert/add_document_for_contract/array_index_e2e_tests.rs
  • packages/rs-drive/src/drive/document/insert/add_document_for_contract/integer_range_index_e2e_tests.rs
  • packages/rs-drive/src/drive/document/insert/add_document_for_contract/mod.rs
  • packages/rs-drive/src/drive/document/insert/add_document_for_contract/time_range_index_e2e_tests.rs
  • packages/rs-drive/src/drive/document/insert/add_document_for_contract/v0/mod.rs
  • packages/rs-drive/src/drive/document/insert/add_document_to_primary_storage/v0/mod.rs
  • packages/rs-drive/src/drive/document/insert/mod.rs
  • packages/rs-drive/src/drive/document/insert_contested/add_contested_document/v0/mod.rs
  • packages/rs-drive/src/drive/document/insert_contested/add_contested_document_for_contract/v0/mod.rs
  • packages/rs-drive/src/drive/document/insert_contested/mod.rs
  • packages/rs-drive/src/drive/document/query/mod.rs
  • packages/rs-drive/src/drive/document/query/query_chained_documents/v0/mod.rs
  • packages/rs-drive/src/drive/document/query/query_composite_documents/v0/mod.rs
  • packages/rs-drive/src/drive/document/query/query_contested_documents_storage/v0/mod.rs
  • packages/rs-drive/src/drive/document/query/query_contested_documents_vote_state/v0/mod.rs
  • packages/rs-drive/src/drive/document/query/query_documents/v0/mod.rs
  • packages/rs-drive/src/drive/document/query/query_documents_with_flags/v0/mod.rs
  • packages/rs-drive/src/drive/document/update/mod.rs
  • packages/rs-drive/src/drive/document/update/update_document_for_contract/mod.rs
  • packages/rs-drive/src/drive/document/update/update_document_for_contract/v0/mod.rs
  • packages/rs-drive/src/drive/document/update/update_document_for_contract_id/mod.rs
  • packages/rs-drive/src/drive/document/update/update_document_for_contract_id/v0/mod.rs
  • packages/rs-drive/src/drive/document/update/update_document_with_serialization_for_contract/mod.rs
  • packages/rs-drive/src/drive/document/update/update_document_with_serialization_for_contract/v0/mod.rs
  • packages/rs-drive/src/drive/group/fetch/fetch_action_id_has_signer/v0/mod.rs
  • packages/rs-drive/src/drive/group/insert/add_group_action/v0/mod.rs
  • packages/rs-drive/src/drive/group/insert/add_new_groups/v0/mod.rs
  • packages/rs-drive/src/drive/identity/balance/update.rs
  • packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs
  • packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_balance/v0/mod.rs
  • packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_balance_include_debt/v0/mod.rs
  • packages/rs-drive/src/drive/identity/fetch/full_identity/fetch_full_identity/v0/mod.rs
  • packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/v0/mod.rs
  • packages/rs-drive/src/drive/identity/fetch/revision/fetch_identity_revision/v0/mod.rs
  • packages/rs-drive/src/drive/identity/fetch/revision/mod.rs
  • packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs
  • packages/rs-drive/src/drive/identity/key/budget/mod.rs
  • packages/rs-drive/src/drive/identity/key/fetch/fetch_identity_keys/v0/mod.rs
  • packages/rs-drive/src/drive/identity/update/methods/add_new_non_unique_keys_to_identity/v0/mod.rs
  • packages/rs-drive/src/drive/identity/update/methods/add_new_unique_keys_to_identity/v0/mod.rs
  • packages/rs-drive/src/drive/identity/update/methods/add_to_identity_balance/v0/mod.rs
  • packages/rs-drive/src/drive/identity/update/methods/add_to_identity_balance/v1/mod.rs
  • packages/rs-drive/src/drive/identity/update/methods/disable_identity_keys/v0/mod.rs
  • packages/rs-drive/src/drive/identity/update/methods/disable_identity_keys/v1/mod.rs
  • packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs
  • packages/rs-drive/src/drive/identity/update/methods/remove_from_identity_balance/mod.rs
  • packages/rs-drive/src/drive/identity/update/methods/remove_from_identity_balance/v0/mod.rs
  • packages/rs-drive/src/drive/identity/update/methods/update_identity_key_limits/v0/mod.rs
  • packages/rs-drive/src/drive/identity/update/methods/update_identity_revision/mod.rs
  • packages/rs-drive/src/drive/identity/update/methods/update_identity_revision/v0/mod.rs
  • packages/rs-drive/src/drive/identity/update/mod.rs
  • packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/v1/mod.rs
  • packages/rs-drive/src/drive/identity/withdrawals/fetch_in_flight_withdrawal_amount/v0/mod.rs
  • packages/rs-drive/src/drive/identity/withdrawals/transaction/index/mod.rs
  • packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs
  • packages/rs-drive/src/drive/prefunded_specialized_balances/fetch/single_balance/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/apply_status/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/balance/add_to_previous_token_balance/mod.rs
  • packages/rs-drive/src/drive/tokens/balance/add_to_previous_token_balance/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/balance/fetch_identities_token_balances/mod.rs
  • packages/rs-drive/src/drive/tokens/balance/fetch_identities_token_balances/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balance/mod.rs
  • packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balance/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balances/mod.rs
  • packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balances/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/balance/prove_identities_token_balances/mod.rs
  • packages/rs-drive/src/drive/tokens/balance/prove_identity_token_balances/mod.rs
  • packages/rs-drive/src/drive/tokens/balance/remove_from_identity_token_balance/mod.rs
  • packages/rs-drive/src/drive/tokens/balance/remove_from_identity_token_balance/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/balance/update.rs
  • packages/rs-drive/src/drive/tokens/burn/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/contract_info/fetch_token_contract_info/mod.rs
  • packages/rs-drive/src/drive/tokens/direct_purchase/fetch_token_direct_purchase_price/mod.rs
  • packages/rs-drive/src/drive/tokens/direct_purchase/set_direct_purchase_price/mod.rs
  • packages/rs-drive/src/drive/tokens/distribution/add_pre_programmed_distribution/v1/mod.rs
  • packages/rs-drive/src/drive/tokens/freeze/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/info/fetch_identities_token_infos/mod.rs
  • packages/rs-drive/src/drive/tokens/info/fetch_identity_token_info/mod.rs
  • packages/rs-drive/src/drive/tokens/info/fetch_identity_token_infos/mod.rs
  • packages/rs-drive/src/drive/tokens/info/prove_identities_token_infos/mod.rs
  • packages/rs-drive/src/drive/tokens/info/prove_identity_token_infos/mod.rs
  • packages/rs-drive/src/drive/tokens/mint/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/mint_many/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/order_escrow/mod.rs
  • packages/rs-drive/src/drive/tokens/shielded_pool/mod.rs
  • packages/rs-drive/src/drive/tokens/status/fetch_token_status/mod.rs
  • packages/rs-drive/src/drive/tokens/status/fetch_token_statuses/mod.rs
  • packages/rs-drive/src/drive/tokens/status/prove_token_statuses/mod.rs
  • packages/rs-drive/src/drive/tokens/system/add_to_token_total_supply/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/system/create_token_trees/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/system/fetch_token_total_aggregated_identity_balances/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/system/fetch_token_total_supply/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/system/prove_token_total_supply_and_aggregated_identity_balances/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/system/remove_from_token_total_supply/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/transfer/v0/mod.rs
  • packages/rs-drive/src/drive/tokens/unfreeze/v0/mod.rs
  • packages/rs-drive/src/drive/votes/fetch/fetch_contested_document_vote_poll_contender_count/v0/mod.rs
  • packages/rs-drive/src/drive/votes/fetch/fetch_contested_document_vote_poll_stored_info/v0/mod.rs
  • packages/rs-drive/src/drive/votes/insert/contested_resource/individual_vote/register_contested_resource_identity_vote/v0/mod.rs
  • packages/rs-drive/src/drive/votes/insert/yes_no/register_yes_no_identity_vote/v0/mod.rs
  • packages/rs-drive/src/fees/calculate_fee/mod.rs
  • packages/rs-drive/src/fees/calculate_fee/v0/mod.rs
  • packages/rs-drive/src/fees/op.rs
  • packages/rs-drive/src/query/contested_resource_votes_given_by_identity_query.rs
  • packages/rs-drive/src/query/drive_contested_document_query.rs
  • packages/rs-drive/src/query/drive_document_average_query/drive_dispatcher.rs
  • packages/rs-drive/src/query/drive_document_count_query/tests.rs
  • packages/rs-drive/src/query/drive_document_having_query/tests.rs
  • packages/rs-drive/src/query/drive_document_ranked_query/tests.rs
  • packages/rs-drive/src/query/drive_document_sum_query/tests.rs
  • packages/rs-drive/src/query/mod.rs
  • packages/rs-drive/src/query/unsigned_index_key_order_tests.rs
  • packages/rs-drive/src/query/vote_poll_contestant_votes_query.rs
  • packages/rs-drive/src/query/vote_poll_vote_state_query.rs
  • packages/rs-drive/src/query/vote_polls_by_document_type_query.rs
  • packages/rs-drive/src/query/vote_polls_by_end_date_query.rs
  • packages/rs-drive/src/state_transition_action/action_convert_to_operations/shielded/mod.rs
  • packages/rs-drive/src/state_transition_action/action_convert_to_operations/shielded/shielded_withdrawal_transition.rs
  • packages/rs-drive/src/state_transition_action/action_convert_to_operations/shielded/unshield_transition.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/state_generated_properties.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_from_pool_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_claim_to_pool_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_claim_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_direct_purchase_to_pool_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_direct_purchase_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_to_pool_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_set_price_for_direct_purchase_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_shield_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_shielded_transfer_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unshield_transition_action/v0/transformer.rs
  • packages/rs-drive/src/structure/tests.rs
  • packages/rs-drive/src/util/batch/drive_op_batch/drive_methods/apply_drive_operations/mod.rs
  • packages/rs-drive/src/util/batch/drive_op_batch/drive_methods/apply_drive_operations/v0/mod.rs
  • packages/rs-drive/src/util/batch/drive_op_batch/drive_methods/apply_drive_operations/v1/mod.rs
  • packages/rs-drive/src/util/batch/drive_op_batch/drive_methods/apply_drive_operations/v2/mod.rs
  • packages/rs-drive/src/util/batch/drive_op_batch/mod.rs
  • packages/rs-drive/src/util/test_helpers/setup.rs
  • packages/rs-drive/src/verify/address_funds/verify_address_info/v0/mod.rs
  • packages/rs-drive/src/verify/document/verify_proof/v0/mod.rs
  • packages/rs-drive/src/verify/document/verify_proof_keep_serialized/v0/mod.rs
  • packages/rs-drive/src/verify/document/verify_start_at_document_in_proof/v0/mod.rs
  • packages/rs-drive/src/verify/single_document/verify_proof/v0/mod.rs
  • packages/rs-drive/src/verify/single_document/verify_proof_keep_serialized/v0/mod.rs
  • packages/rs-drive/src/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs
  • packages/rs-drive/tests/compound_cursor_tests.rs
  • packages/rs-drive/tests/query_tests.rs
  • packages/rs-drive/tests/query_tests_history.rs
  • packages/rs-platform-version/src/version/fee/mod.rs

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

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

@github-actions

github-actions Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

📖 Book Preview built successfully.

Download the preview from the workflow artifacts.
To view locally: download the artifact, unzip, and open index.html.

Updated at 2026-11-07T07:29:25.984Z

@github-actions

github-actions Bot commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

Waiting for bot review — thepastaclaw not yet. Wait for the missing reviews, or a writer can post /skip-bots to proceed without them; blocking findings still need addressing.
Full checklist in the description.

@github-actions github-actions Bot added the waiting-bots Waiting for the review bots to report on this head label Nov 7, 2026
@thepastaclaw

thepastaclaw commented Nov 7, 2026 •

Copy link
Copy Markdown
Collaborator

✅ Final review complete — no blockers (commit 3e41c7f) · triage: critical

@thepastaclaw thepastaclaw left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Final validation — Phase 1 + Phase 2

At head 3e41c7f, the refund-pricing refactor preserves results for all configured protocol versions because their storage rates match. One non-blocking regression remains: the public refund helper loses its current-epoch range validation. This was a static review; current CI reports passing code checks, including Rust workspace and wasm32 tests, with PR Hygiene and automated review still pending.

🟡 1 suggestion(s)

1 finding(s) not shown inline (GitHub refused the PR diff as too large)

🟡 Suggestion: Preserve epoch validation in the public refund helper
packages/rs-dpp/src/fee/fee_result/refunds.rs:60-62

Removing Epoch::new(current_epoch_index)? also removes the range validation previously performed by this public, fallible API. EpochIndex is a u16 alias, so callers can supply values above MAX_EPOCH. For example, refunding 100 bytes stored in epoch 1 with current_epoch_index = u16::MAX, epochs_per_era = 20, and the first fee schedule previously returned ProtocolError::Overflow. It now reaches current_epoch_index + 1 in calculate_storage_fee_refund_amount_and_leftovers, which panics with overflow checks enabled or wraps to zero and produces an incorrect positive refund without them. The existing Drive execution path supplies a validated epoch, so this is not a current consensus blocker. Retain the epoch validation independently of the removed history lookup and add a regression test asserting that an invalid current epoch returns an error.

source: gpt-6.1-sol (phase2-reviewer: rust-quality)

Review provenance

Source: reviewer 1: gpt-6.1-sol (agent: phase2-reviewer, role: general); reviewer 2: gpt-6.1-sol (agent: phase2-reviewer, role: architecture-layering); reviewer 3: muse-spark-1.3-contributor (agent: phase1-reviewer, role: general); reviewer 4: gpt-6.1-sol (agent: phase2-reviewer, role: platform-versioning); reviewer 5: gpt-6.1-sol (agent: phase2-reviewer, role: rust-quality); reviewer 6: gpt-6.1-sol (agent: phase2-reviewer, role: security-auditor); reviewer 7: gpt-6.1-sol (agent: phase2-reviewer, role: tenderdash-consensus-security); reviewer 8: muse-spark-1.3-contributor (agent: phase1-reviewer, role: rust-quality); final verifier: gpt-6.1-sol (agent: sol-verifier, role: final-verifier)

  • Triage: critical by gpt-6.1-sol (effort low) — The cross-cutting refactor directly changes funds-refund pricing in FeeRefunds::from_storage_removal and its consensus-execution callers, requiring verification that historical protocol versions retain identical monetary results.
  • Phase 1 reviewers: muse-spark-1.3-contributor — general (completed, effort xhigh); agent phase1-reviewer, muse-spark-1.3-contributor — rust-quality (completed, effort xhigh); agent phase1-reviewer
  • Phase 1 model: muse-spark-1.3-contributor — not quota-gated; passed over gemini-3.8-flash-high (antigravity quota lookup failed), glm-5.3-flash (not used above high effort; tier asks max)
  • Single stage: Phase 1 and Phase 2 reviewed this head side by side, with no blocker gate between them (triage tier)
  • Fresh verifier: gpt-6.1-sol — final-verifier; agent sol-verifier
  • Phase 2 reviewers: gpt-6.1-sol — general (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — architecture-layering (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — platform-versioning (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — rust-quality (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — security-auditor (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — tenderdash-consensus-security (completed, effort xhigh); agent phase2-reviewer
🤖 Prompt for all review comments with AI agents
These findings are from an automated code review. Verify each finding against the current code and only fix it if needed.

In `packages/rs-dpp/src/fee/fee_result/refunds.rs`:
- [SUGGESTION] packages/rs-dpp/src/fee/fee_result/refunds.rs:60-62: Preserve epoch validation in the public refund helper
  Removing `Epoch::new(current_epoch_index)?` also removes the range validation previously performed by this public, fallible API. `EpochIndex` is a `u16` alias, so callers can supply values above `MAX_EPOCH`. For example, refunding 100 bytes stored in epoch 1 with `current_epoch_index = u16::MAX`, `epochs_per_era = 20`, and the first fee schedule previously returned `ProtocolError::Overflow`. It now reaches `current_epoch_index + 1` in `calculate_storage_fee_refund_amount_and_leftovers`, which panics with overflow checks enabled or wraps to zero and produces an incorrect positive refund without them. The existing Drive execution path supplies a validated epoch, so this is not a current consensus blocker. Retain the epoch validation independently of the removed history lookup and add a regression test asserting that an invalid current epoch returns an error.

@github-actions

github-actions Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

Bots are done — your move: post /self-reviewed.
Full checklist in the description.

@github-actions github-actions Bot added waiting-self-review Waiting for the author to post /self-reviewed and removed waiting-bots Waiting for the review bots to report on this head labels Nov 7, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

waiting-self-review Waiting for the author to post /self-reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants