Skip to content

Fix transfer reports - #2006

Merged
HenriqueNogara merged 2 commits into
developfrom
fix-transfer-reports
Sep 15, 2026
Merged

HenriqueNogara merged 2 commits into
developfrom
fix-transfer-reports

Conversation

@HenriqueNogara

Copy link
Copy Markdown
Contributor

changelog

other

  • Add freezing errors to transfer_reports;
  • Return error when locking an NFT from a frozen portfolio;

Copilot AI 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.

🟡 Changes recommended

Critical weight and NFT report-coverage issues remain unresolved, along with documentation and test gaps.

Get a fresh assessment by requesting another Copilot review.

Pull request overview

Updates transfer reporting for frozen holdings and prevents NFT locking from frozen portfolios.

Changes:

  • Adds frozen-holder and frozen-balance validation to transfer reports.
  • Rejects NFT locks from frozen holders.
  • Updates settlement regression expectations.
File summaries
File Changes and review findings
pallets/runtime/tests/src/settlement_pallet/transfer_funds.rs Updates the expected frozen-portfolio transfer error.
pallets/nft/src/lib.rs Adds frozen-holder reporting and blocks NFT locking from frozen holders. Critical (2 votes): add report-level coverage for InvalidTransferSenderIsFrozen.
pallets/asset/src/lib.rs Adds frozen-holder and frozen-balance checks. Critical (1 vote): regenerate report weights for the added storage reads. Nits (2 votes each): update documented skip_locked_check semantics and add report-level coverage for full/partial freezes.
Review details

Suppressed comments (2)

pallets/asset/src/lib.rs:3745

  • When skip_locked_check is false, ensure_sufficient_balance(..., false) below already calls ensure_holder_is_not_frozen and returns the same error. This new check therefore appends InvalidTransferSenderIsFrozen twice for a frozen sender in the normal transfer report (the precompile uses this mode), making the report contain duplicate errors. Restrict the explicit check to the skip_locked_check branch, where the balance path intentionally bypasses it.
        if let Err(e) = Self::ensure_holder_is_not_frozen(sender, asset_id) {
            asset_transfer_errors.push(e);
        }

pallets/nft/src/lib.rs:1480

  • lock_nft is called once per NFT by settlement's sender-affirmation paths, so this check adds one FrozenAccounts/FrozenPortfolios read per NFT. The generated weights for those paths (affirm_instruction, affirm_with_receipts, and add_and_affirm_with_mediators) contain no holder-freeze storage reads and still use the old per-NFT counts, allowing an affirmation to exceed its declared weight. Regenerate the affected settlement weights after adding this check.
        pallet_asset::Pallet::<T>::ensure_holder_is_not_frozen(&asset_holder, &asset_id)?;
  • Files reviewed: 3/3 changed files
  • Comments generated: 4
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread pallets/asset/src/lib.rs
Comment on lines +3743 to +3745
if let Err(e) = Self::ensure_holder_is_not_frozen(sender, asset_id) {
asset_transfer_errors.push(e);
}
Comment thread pallets/nft/src/lib.rs
Comment on lines +1232 to +1236
if let Err(e) =
pallet_asset::Pallet::<T>::ensure_holder_is_not_frozen(sender, nfts.asset_id())
{
nft_transfer_errors.push(e);
}
Comment thread pallets/asset/src/lib.rs
Comment on lines +3748 to +3751
let frozen_balance = Self::get_holders_frozen_balance(sender, asset_id);
let current_balance = Self::get_holders_balance(sender, asset_id);

if current_balance.saturating_sub(frozen_balance) < transfer_value {
Comment thread pallets/asset/src/lib.rs
Comment on lines 3747 to 3752
if skip_locked_check {
if Self::get_holders_balance(sender, asset_id) < transfer_value {
let frozen_balance = Self::get_holders_frozen_balance(sender, asset_id);
let current_balance = Self::get_holders_balance(sender, asset_id);

if current_balance.saturating_sub(frozen_balance) < transfer_value {
asset_transfer_errors.push(Error::<T>::InsufficientBalance.into());
@HenriqueNogara
HenriqueNogara marked this pull request as ready for review September 15, 2026 11:51
Comment thread pallets/asset/src/lib.rs
@HenriqueNogara
HenriqueNogara merged commit 622a6ed into develop Sep 15, 2026
20 checks passed
@HenriqueNogara
HenriqueNogara deleted the fix-transfer-reports branch September 15, 2026 12:11
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.

3 participants