Skip to content

fix: rent deficit dedup#2090

Merged
ananas-block merged 2 commits intomainfrom
jorrit/fix-rent-deficit-dedup
Dec 3, 2025
Merged

fix: rent deficit dedup#2090
ananas-block merged 2 commits intomainfrom
jorrit/fix-rent-deficit-dedup

Conversation

@ananas-block
Copy link
Contributor

@ananas-block ananas-block commented Dec 3, 2025

Issue:

  • top up is charged per usage of a ctoken account (eg multiple decompressions or mints to the same ctoken account) instead of once per transaction

Solution:

  • charge top up only once per transaction per ctoken account

Summary by CodeRabbit

  • Bug Fixes

    • Stronger validation for compression transfers, including bounds checks to prevent too-many-transfer errors.
    • Clearer authority and validation error messages for token compression/close flows.
  • Refactor

    • Transfer accumulation and compression processing reorganized for more reliable, consistent handling.
    • Internal orchestration improved to reduce incorrect or duplicated transfer outcomes.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 3, 2025

Walkthrough

Refactors transfer-amount handling: functions that previously returned Option<u64> now accept a &mut u64 to accumulate transfer amounts and return Result<()>. Changes touch mint-to-ctoken, compression orchestration, compress-and-close, and add per-account bounds checks for packed accounts.

Changes

Cohort / File(s) Summary
Mint action transfer refactoring
programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
process_mint_to_ctoken_action signature changed to accept transfer_amount: &mut u64 and return Result<(), ProgramError>. check_authority call updated to include explicit message "mint authority". Calls compress_or_decompress_ctokens with transfer_amount.
Action processing integration
programs/compressed-token/program/src/mint_action/actions/process_actions.rs
Removed local MAX_PACKED_ACCOUNTS const; use crate MAX_PACKED_ACCOUNTS. Added pre-check that account_index < MAX_PACKED_ACCOUNTS for MintToCToken actions and return TooManyCompressionTransfers on violation. Pass &mut transfer_map[account_index] into process_mint_to_ctoken_action (no longer collects Option return).
CToken compression orchestration
programs/compressed-token/program/src/transfer2/compression/mod.rs, programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
Propagate transfer_amount: &mut u64 through process_ctoken_compressions and into compress_or_decompress_ctokens. Use MAX_PACKED_ACCOUNTS for transfer_map sizing and defer aggregation until after processing; build transfers from non-zero entries and call multi-transfer when needed.
Compress/Decompress internals
programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
compress_or_decompress_ctokens and process_compressible_extension signatures updated to accept transfer_amount: &mut u64 and return Result<(), ProgramError>. Early-return behavior added when *transfer_amount != 0; when a compressible extension yields a top-up, set *transfer_amount and return.
Compress-and-close validation
programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
process_compress_and_close signature changed to accept compress_and_close_inputs: Option<CompressAndCloseInputs> and return Result<(), ProgramError>. Introduced validate_compressed_token_account helper to check owner, balance/amount, delegate, and version data. Sets ctoken.amount = 0 and returns unit.
Crate constant / imports
programs/compressed-token/program/src/lib.rs, programs/compressed-token/program/src/transfer2/compression/mod.rs
Added pub(crate) const MAX_PACKED_ACCOUNTS: usize = 40 in lib.rs. compression/mod.rs imports MAX_PACKED_ACCOUNTS and updated logging/err handling for account-index bound checks.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • Review focus:
    • Correct threading of &mut transfer_amount across all call sites and that no callsite assumes an Option<u64> return.
    • Consistency and correctness of MAX_PACKED_ACCOUNTS usage and pre-checks in both process_actions.rs and compression/mod.rs.
    • Correct early-return semantics when *transfer_amount != 0 so processing stops when expected and aggregation still occurs.
    • validate_compressed_token_account correctness: owner, lamport/balance math, delegate handling, and extension/version checks.
    • Ensure no missed callsites or tests relying on former Option<u64> behavior.

Possibly related PRs

Suggested labels

ai-review

Suggested reviewers

  • sergeytimoshin
  • SwenSchaeferjohann

Poem

✨ Mutable amounts now pass the chain,
From mint to compress, no return to gain.
Bounds guard the indices, checks hold fast—
Transfers accumulate, neat and cast. 🚀

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'fix: rent deficit dedup' is concise and relates to the core issue, but is somewhat cryptic and lacks clarity for team members unfamiliar with the specific domain context.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 70.00%.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch jorrit/fix-rent-deficit-dedup

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 and usage tips.

When the same compressible token account is mentioned multiple times
in a transfer/mint instruction, the rent deficit is now only charged
once instead of per-mention. This is achieved by passing a mutable
reference to the transfer_map slot and only setting the top-up amount
if the value is currently 0.
@ananas-block ananas-block force-pushed the jorrit/fix-rent-deficit-dedup branch from a0648c8 to e14031d Compare December 3, 2025 16:14
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 917c43b and e14031d.

⛔ Files ignored due to path filters (1)
  • program-tests/compressed-token-test/tests/transfer2/no_system_program_cpi_failing.rs is excluded by none and included by none
📒 Files selected for processing (6)
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs (2 hunks)
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs (1 hunks)
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs (3 hunks)
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs (6 hunks)
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs (2 hunks)
  • programs/compressed-token/program/src/transfer2/compression/mod.rs (1 hunks)
🧰 Additional context used
📓 Path-based instructions (6)
programs/compressed-token/program/src/**/*.rs

📄 CodeRabbit inference engine (programs/compressed-token/program/CLAUDE.md)

programs/compressed-token/program/src/**/*.rs: Compressed token accounts (ctoken solana accounts) must use the same account layout as SPL tokens with a custom Compressible extension
Compressed mint accounts (cmints) support only one extension: TokenMetadata

Files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
programs/compressed-token/program/src/transfer2/**/*.rs

📄 CodeRabbit inference engine (programs/compressed-token/program/CLAUDE.md)

Transfer2 instruction must support Compress, Decompress, and CompressAndClose operations with multi-mint support and sum checks

Files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
programs/compressed-token/program/src/{claim,transfer2}/**/*.rs

📄 CodeRabbit inference engine (programs/compressed-token/program/CLAUDE.md)

Rent authority can only compress accounts when is_compressible() returns true; lamport distribution on close is: rent → rent_sponsor, unutilized → destination

Files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
**/programs/**/src/**/*.rs

📄 CodeRabbit inference engine (DOCS.md)

For accounts with associated methods, add a Methods section grouping methods by purpose (Validation, Constructors, PDA Derivation, etc.) with concise parameter names in signatures, one-line action-oriented descriptions, and concrete values where helpful (constants, defaults)

Files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
programs/**/*.rs

📄 CodeRabbit inference engine (CLAUDE.md)

Unit tests in programs must not depend on light-test-utils; any test requiring light-test-utils must be in program-tests

Files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
programs/compressed-token/program/src/mint_action/**/*.rs

📄 CodeRabbit inference engine (programs/compressed-token/program/CLAUDE.md)

MintAction instruction must support 9 action types: CreateCompressedMint, MintTo, UpdateMintAuthority, UpdateFreezeAuthority, CreateSplMint, MintToCToken, UpdateMetadataField, UpdateMetadataAuthority, RemoveMetadataKey

Files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
🧠 Learnings (47)
📓 Common learnings
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/SOLANA_RENT.md:0-0
Timestamp: 2025-11-24T18:00:48.449Z
Learning: Use epoch-based accounting (432,000 slots ≈ 2.5 days) instead of continuous time for Light Protocol rent collection
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/SOLANA_RENT.md:0-0
Timestamp: 2025-11-24T18:00:48.449Z
Learning: Applies to program-libs/compressible/docs/**/*.rs : Light Protocol accounts must satisfy both Solana rent exemption and Light Protocol rent requirements, plus an 11,000 lamport compression incentive during creation
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/SOLANA_RENT.md:0-0
Timestamp: 2025-11-24T18:00:48.449Z
Learning: Applies to program-libs/compressible/docs/**/*.rs : Account closure must distribute lamports according to: Solana rent exemption → returned to user, completed epoch rent → rent recipient, partial epoch rent → user, compression incentive → forester node
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_STATE_TREE.md:0-0
Timestamp: 2025-11-24T17:56:50.011Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/initialize_state_tree.rs : Use `check_account_balance_is_rent_exempt` function from `light-account-checks` to verify rent exemption for both queue_account and merkle_tree_account during initialization
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/RENT.md:0-0
Timestamp: 2025-11-24T18:00:36.663Z
Learning: Applies to program-libs/compressible/docs/**/*rent*.rs : Implement `calculate_close_lamports` function to return (u64, u64) tuple splitting lamports between rent recipient and user, with rent recipient receiving completed epochs and user receiving partial epoch remainder.
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/transfer2/**/*.rs : Transfer2 instruction must support Compress, Decompress, and CompressAndClose operations with multi-mint support and sum checks
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/{claim,transfer2}/**/*.rs : Rent authority can only compress accounts when is_compressible() returns true; lamport distribution on close is: rent → rent_sponsor, unutilized → destination
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Use `calculate_close_lamports` function to determine lamport distribution when closing CToken accounts
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Use `calculate_rent_and_balance` function to determine if a CToken account is compressible
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:30.012Z
Learning: Run compressed token core tests using `cargo test-sbf -p compressed-token-test --test ctoken`, `--test v1`, `--test mint`, and `--test transfer2`
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/registry/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:02:15.670Z
Learning: Applies to programs/registry/src/account_compression_cpi/mod.rs : Export new wrapper modules in `account_compression_cpi/mod.rs` using `pub mod new_operation;` and `pub use new_operation::*;`, then import in `lib.rs`
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Calculate claimable rent using `claimable_lamports` function before closing CToken accounts
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/docs/instructions/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:54.689Z
Learning: Applies to programs/compressed-token/program/docs/instructions/instructions/TRANSFER2.md : Transfer2 documentation must cover batch transfer instruction supporting compress/decompress/transfer operations
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-libs/macros/src/compressible/README.md:0-0
Timestamp: 2025-11-24T17:55:17.323Z
Learning: Applies to sdk-libs/macros/src/compressible/**/instructions.rs : Compress/decompress instruction handlers and context struct generation should be implemented in `instructions.rs`, with compress using PDA-only and decompress supporting full PDA + ctoken
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/**/*.rs : Compressed mint accounts (cmints) support only one extension: TokenMetadata
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/transfer2/**/*.rs : Transfer2 instruction must support Compress, Decompress, and CompressAndClose operations with multi-mint support and sum checks

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/{claim,transfer2}/**/*.rs : Rent authority can only compress accounts when is_compressible() returns true; lamport distribution on close is: rent → rent_sponsor, unutilized → destination

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:14.087Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Use `calculate_rent_and_balance` function to determine if a CToken account is compressible

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:14.087Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Use `calculate_close_lamports` function to determine lamport distribution when closing CToken accounts

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T17:55:17.323Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-libs/macros/src/compressible/README.md:0-0
Timestamp: 2025-11-24T17:55:17.323Z
Learning: Applies to sdk-libs/macros/src/compressible/**/decompress_context.rs : Decompression trait implementation (`DecompressContext`) with account accessors, PDA/token separation logic, and token processing delegation should be in `decompress_context.rs`

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/close_token_account.rs : Close Token Account instruction must return rent exemption to rent recipient if compressible, and return remaining lamports to destination account

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/**/*.rs : Compressed token accounts (ctoken solana accounts) must use the same account layout as SPL tokens with a custom Compressible extension

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:54.689Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/docs/instructions/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:54.689Z
Learning: Applies to programs/compressed-token/program/docs/instructions/instructions/DECOMPRESSED_TRANSFER.md : Decompressed Transfer documentation must cover SPL-compatible transfers between decompressed accounts

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:54.689Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/docs/instructions/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:54.689Z
Learning: Applies to programs/compressed-token/program/docs/instructions/instructions/TRANSFER2.md : Transfer2 documentation must cover batch transfer instruction supporting compress/decompress/transfer operations

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:14.087Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Calculate claimable rent using `claimable_lamports` function before closing CToken accounts

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:00:36.663Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/RENT.md:0-0
Timestamp: 2025-11-24T18:00:36.663Z
Learning: Applies to program-libs/compressible/docs/**/*rent*.rs : Implement `calculate_rent_and_balance` function to determine compressibility by checking if account balance covers required rent for epochs since last claim, returning (bool, u64) tuple.

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T17:55:17.323Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-libs/macros/src/compressible/README.md:0-0
Timestamp: 2025-11-24T17:55:17.323Z
Learning: Applies to sdk-libs/macros/src/compressible/**/instructions.rs : Compress/decompress instruction handlers and context struct generation should be implemented in `instructions.rs`, with compress using PDA-only and decompress supporting full PDA + ctoken

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T18:01:30.012Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:30.012Z
Learning: Run account-compression tests using `cargo test-sbf -p account-compression-test` to test core account compression program (Merkle tree management)

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: When working with ctoken accounts having the compressible extension, you must read program-libs/compressible/docs/ documentation including RENT.md, CONFIG_ACCOUNT.md, and SOLANA_RENT.md for rent system understanding

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:00:13.178Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/CONFIG_ACCOUNT.md:0-0
Timestamp: 2025-11-24T18:00:13.178Z
Learning: Applies to program-libs/compressible/docs/**/config.rs : Set CompressibleConfig default values for CToken V1: base_rent = 1220, compression_cost = 11000, lamports_per_byte_per_epoch = 10, and address_space[0] = `amt2kaJA14v3urZbZvnc5v2np8jqvc4Z8zDep5wbtzx`

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T18:02:15.670Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/registry/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:02:15.670Z
Learning: Applies to programs/registry/src/account_compression_cpi/*.rs : Create wrapper instruction module at `src/account_compression_cpi/new_operation.rs` with `NewOperationContext` struct defining required accounts

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T17:55:32.059Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-tests/sdk-ctoken-test/README.md:0-0
Timestamp: 2025-11-24T17:55:32.059Z
Learning: Implement all 8 core compressed token operations: create_cmint, mint_to_ctoken, create_token_account_invoke, create_token_account_invoke_signed, create_ata_invoke, create_ata_invoke_signed, transfer_interface_invoke, and transfer_interface_invoke_signed

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T17:56:50.011Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_STATE_TREE.md:0-0
Timestamp: 2025-11-24T17:56:50.011Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/initialize_state_tree.rs : Return error `AccountError::AccountNotRentExempt` (error code 12011) when account balance is insufficient for rent exemption at calculated size

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:02:15.670Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/registry/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:02:15.670Z
Learning: Applies to programs/registry/src/account_compression_cpi/mod.rs : Export new wrapper modules in `account_compression_cpi/mod.rs` using `pub mod new_operation;` and `pub use new_operation::*;`, then import in `lib.rs`

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:14.087Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Use Anchor serialization for CompressibleConfig account structures in Rust programs

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
📚 Learning: 2025-11-24T18:01:14.087Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Derive PDA addresses using `derive_pda` and `derive_v1_config_pda` functions for CToken account configuration

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/mint_action/**/*.rs : MintAction instruction must support 9 action types: CreateCompressedMint, MintTo, UpdateMintAuthority, UpdateFreezeAuthority, CreateSplMint, MintToCToken, UpdateMetadataField, UpdateMetadataAuthority, RemoveMetadataKey

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T17:59:54.233Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/PACKED_ACCOUNTS.md:0-0
Timestamp: 2025-11-24T17:59:54.233Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/**/*.rs : Provide descriptive names in ProgramPackedAccounts error messages (e.g., 'token_mint' instead of 'account')

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T17:59:23.357Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/CLAUDE.md:0-0
Timestamp: 2025-11-24T17:59:23.357Z
Learning: Applies to program-libs/account-checks/docs/src/**/packed_accounts.rs : Implement index-based dynamic account access with bounds checking for handling variable account sets (mint, owner, delegate accounts)

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T18:01:03.786Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:03.786Z
Learning: Applies to program-libs/account-checks/**/packed_accounts.rs : Support dynamic account sets (mint, owner, delegate accounts) by index in account access utilities

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T18:01:54.689Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/docs/instructions/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:54.689Z
Learning: Applies to programs/compressed-token/program/docs/instructions/instructions/MINT_ACTION.md : MintAction documentation must cover batch instruction for compressed mint management supporting 9 actions: CreateCompressedMint, MintTo, UpdateMintAuthority, UpdateFreezeAuthority, CreateSplMint, MintToCToken, UpdateMetadataField, UpdateMetadataAuthority, RemoveMetadataKey

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T18:01:03.786Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:03.786Z
Learning: Applies to program-libs/account-checks/**/packed_accounts.rs : Implement index-based account access with bounds-checked retrieval and descriptive error messages in PackedAccounts

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/**/*.rs : Compressed mint accounts (cmints) support only one extension: TokenMetadata

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T17:57:39.230Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/QUEUE_ACCOUNT.md:0-0
Timestamp: 2025-11-24T17:57:39.230Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/queue.rs : Validate account ownership by Light account compression program using `check_owner` from `light-account-checks` when deserializing `BatchedQueueAccount` with `output_from_account_info`

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T17:59:54.233Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/PACKED_ACCOUNTS.md:0-0
Timestamp: 2025-11-24T17:59:54.233Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/**/*.rs : Use `ProgramPackedAccounts` for index-based access to dynamically sized account arrays in Rust programs

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T18:01:03.786Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:03.786Z
Learning: Applies to program-libs/account-checks/src/account_info/*.rs : Provide PDA derivation functions (`find_program_address`, `create_program_address`) and permission checks in AccountInfoTrait

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T17:59:54.233Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/PACKED_ACCOUNTS.md:0-0
Timestamp: 2025-11-24T17:59:54.233Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/**/*.rs : Call `get()` or `get_u8()` methods with bounds checking for account retrieval in ProgramPackedAccounts

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T18:01:30.012Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:30.012Z
Learning: Run compressed token core tests using `cargo test-sbf -p compressed-token-test --test ctoken`, `--test v1`, `--test mint`, and `--test transfer2`

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T18:01:54.689Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/docs/instructions/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:54.689Z
Learning: Applies to programs/compressed-token/program/docs/instructions/instructions/CLOSE_TOKEN_ACCOUNT.md : Close Token Account documentation must cover closing decompressed token accounts with rent distribution

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T18:00:48.449Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/SOLANA_RENT.md:0-0
Timestamp: 2025-11-24T18:00:48.449Z
Learning: Applies to program-libs/compressible/docs/**/*.rs : Account closure must distribute lamports according to: Solana rent exemption → returned to user, completed epoch rent → rent recipient, partial epoch rent → user, compression incentive → forester node

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/programs/compressed-token/anchor/src/lib.rs : Custom error codes must be defined in programs/compressed-token/anchor/src/lib.rs as the 'anchor_compressed_token::ErrorCode' enum

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T17:58:50.237Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/ACCOUNT_CHECKS.md:0-0
Timestamp: 2025-11-24T17:58:50.237Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/checks.rs : Implement `check_program` function to verify account key matches program_id AND is marked executable, returning `InvalidProgramId` (20011) or `ProgramNotExecutable` (20012) errors

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T17:58:50.237Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/ACCOUNT_CHECKS.md:0-0
Timestamp: 2025-11-24T17:58:50.237Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/checks.rs : Implement `check_signer` function to verify account is a transaction signer, returning `InvalidSigner` (20009) error if not

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T17:58:50.237Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/ACCOUNT_CHECKS.md:0-0
Timestamp: 2025-11-24T17:58:50.237Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/checks.rs : Implement `check_owner` function to verify account is owned by specified program, returning `AccountOwnedByWrongProgram` (20001) error on mismatch

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T18:00:13.178Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/CONFIG_ACCOUNT.md:0-0
Timestamp: 2025-11-24T18:00:13.178Z
Learning: Applies to program-libs/compressible/docs/**/*instruction*.rs : Validate CompressibleConfig state using `validate_active()` method to ensure state == Active before allowing new compressed token account creation

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T18:01:14.087Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Implement state validation methods (`validate_active`, `validate_not_inactive`) for CompressibleConfig account state verification

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/create_*_account*.rs : Token account creation instructions (Create CToken Account and Create Associated CToken Account) require ACTIVE config validation only

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T17:55:17.323Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-libs/macros/src/compressible/README.md:0-0
Timestamp: 2025-11-24T17:55:17.323Z
Learning: Applies to sdk-libs/macros/src/compressible/**/variant_enum.rs : Account variant enum (`CompressedAccountVariant`) generation and `CompressedAccountData` wrapper struct should be implemented in `variant_enum.rs`

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T17:56:50.011Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_STATE_TREE.md:0-0
Timestamp: 2025-11-24T17:56:50.011Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/initialize_state_tree.rs : Charge rollover fee when creating output compressed accounts (insertion into output queue), not on tree operations

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T17:56:50.011Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_STATE_TREE.md:0-0
Timestamp: 2025-11-24T17:56:50.011Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/initialize_state_tree.rs : Return error `AccountError::InvalidAccountSize` (error code 12006) when account data length doesn't match calculated size requirements

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:00:48.449Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/SOLANA_RENT.md:0-0
Timestamp: 2025-11-24T18:00:48.449Z
Learning: Applies to program-libs/compressible/docs/**/*.rs : Implement account compressibility states in the following order: Funded (rent for current + 1 epoch) → Compressible (lacks rent for current + 1 epoch) → Claimable (funded but past epochs unclaimed)

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
🧬 Code graph analysis (3)
programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs (2)
sdk-libs/compressed-token-sdk/src/compressed_token/v2/account2.rs (1)
  • compression (370-372)
programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs (1)
  • compress_or_decompress_ctokens (21-109)
programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs (1)
programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs (1)
  • compress_or_decompress_ctokens (21-109)
programs/compressed-token/program/src/transfer2/compression/mod.rs (3)
sdk-libs/compressed-token-sdk/src/compressed_token/v2/account2.rs (1)
  • compression (370-372)
programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs (1)
  • process_ctoken_compressions (20-39)
programs/compressed-token/program/src/mint_action/actions/process_actions.rs (1)
  • transfer_map (140-156)
🔇 Additional comments (8)
programs/compressed-token/program/src/mint_action/actions/process_actions.rs (1)

97-113: LGTM! Clean bounds checking and transfer accumulation via mutable reference.

The bounds check at lines 98-105 correctly validates account_index before using it to index into transfer_map. Passing &mut transfer_map[account_index] directly to process_mint_to_ctoken_action elegantly handles deduplication—multiple operations on the same account index will accumulate into the same slot, which is then processed once during the final transfer construction.

programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs (1)

24-25: LGTM! Signature updated to propagate transfer amount via mutable reference.

The updated signature correctly threads transfer_amount through to compress_or_decompress_ctokens, enabling the accumulator pattern. This aligns with the MintToCToken action type requirement per the coding guidelines.

Also applies to: 59-59

programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs (1)

21-21: LGTM! CompressAndClose correctly returns unit type.

This makes sense—CompressAndClose doesn't need to report a transfer amount for the accumulator because the account is being closed entirely. Per the coding guidelines, lamport distribution on close follows: rent → rent_sponsor, unutilized → destination. The actual closing and distribution is handled separately in close_for_compress_and_close.

Also applies to: 30-30, 67-67

programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs (1)

18-26: LGTM! Signature propagates transfer_amount correctly.

The function validates compression mode fields and then delegates to compress_or_decompress_ctokens with the transfer_amount reference. This maintains the Transfer2 instruction's support for Compress, Decompress, and CompressAndClose operations as required by the coding guidelines.

Also applies to: 38-38

programs/compressed-token/program/src/transfer2/compression/mod.rs (1)

59-66: LGTM! Transfer accumulation correctly scoped to ctoken accounts only.

The transfer_map entry is only passed to process_ctoken_compressions for ctoken accounts (owned by LIGHT_CPI_SIGNER). SPL token paths correctly skip this because SPL tokens don't have the compressible extension that requires rent top-up tracking.

programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs (3)

19-24: LGTM! Signature updated for accumulator pattern.

The function now accepts transfer_amount: &mut u64 and returns Result<(), ProgramError>, enabling the caller to track transfer amounts by account index.


118-120: This is the dedup fix—early exit prevents redundant top-up calculations.

The early return at lines 118-120 is the core fix: when transfer_amount is already non-zero, we skip recalculating. Since all operations on the same account index share the same transfer_amount slot (from transfer_map[account_index]), only the first operation calculates the top-up amount. Subsequent operations correctly skip the calculation.

This ensures that when multiple compress/decompress operations target the same ctoken account within a single transaction, the rent top-up is calculated exactly once—fixing the dedup issue mentioned in the PR title.

Also applies to: 130-139


78-83: LGTM! Both Compress and Decompress modes propagate transfer_amount correctly.

The process_compressible_extension call now receives transfer_amount for both modes, ensuring rent deficit tracking works consistently across compress and decompress operations.

Also applies to: 93-98

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs (2)

23-68: Clarify invariants around compression_authority_is_signer and guarding amount vs ctoken.amount.

The new shape of process_compress_and_close looks good overall: explicit Option inputs, early authority/signer check, and reuse of validate_token_account_for_close_transfer2/validate_compressed_token_account align with the transfer2 + close_token_account flows.

One subtle point: we always set *ctoken.amount = 0.into() even when compression_authority_is_signer is false, in which case we also skip validate_compressed_token_account. That means there is a path where the on‑chain balance is zeroed entirely based only on the amount parameter and the close‑account validation, without any local cross‑check that amount actually matches the current ctoken balance or a concrete compressed output.

If compression_authority_is_signer is guaranteed to be true for any real CompressAndClose (e.g., false only in pre‑filtered/non‑compressible cases that never reach this function), it would be good to document that invariant here. If not, I’d recommend adding a local guard before zeroing the balance, something along the lines of:

  • Ensure amount matches the full source balance (e.g. compare against ctoken.amount using the same conversion you use in validate_compressed_token_account), and
  • Fail with CompressAndCloseBalanceMismatch (or similar) if they don’t match.

That way, even if a caller accidentally passes an incorrect amount or a future refactor relaxes the authority invariant, we can’t silently burn only part of the balance or rely solely on upstream aggregation.
Based on learnings, this keeps the CompressAndClose path aligned with the requirement that compression/close only happens when the account is actually compressible and fully accounted for.


171-227: Compressed-output index deduplication looks correct; confirm 256‑output bound and error choice.

The bitmap‑based dedup for CompressAndClose outputs is a nice, tight way to prevent the same compressed token account index from being used twice in one instruction. The view_bits_mut::<Msb0>() + get_mut(compressed_idx as usize) pattern is sound, and returning CompressAndCloseDuplicateOutput on a reused index matches the PR’s “rent deficit dedup” goal.

Two small points to confirm:

  • The [0u8; 32] bitmap caps you at 256 distinct compressed token account indices. If the transfer2 format ever evolves to allow more than 256 compressed outputs, this function will start rejecting otherwise‑valid instructions with InvalidInstructionData. If 256 is the intentional protocol limit, consider documenting that here.
  • For the out‑of‑bounds branch, you currently return ProgramError::InvalidInstructionData. If you have (or add) a domain‑specific error like CompressAndCloseInvalidCompressedIndex, it might make debugging easier than a generic program error, given this is a fairly subtle invariant.

Functionally this logic looks solid as‑is; these are mainly clarity/safety considerations for future changes.
Based on learnings, this dedup is an important guardrail to avoid double‑closing the same compressed account and double‑applying rent/deficit accounting.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 917c43b and e14031d.

⛔ Files ignored due to path filters (1)
  • program-tests/compressed-token-test/tests/transfer2/no_system_program_cpi_failing.rs is excluded by none and included by none
📒 Files selected for processing (6)
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs (2 hunks)
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs (1 hunks)
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs (3 hunks)
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs (6 hunks)
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs (2 hunks)
  • programs/compressed-token/program/src/transfer2/compression/mod.rs (1 hunks)
🧰 Additional context used
📓 Path-based instructions (6)
programs/compressed-token/program/src/**/*.rs

📄 CodeRabbit inference engine (programs/compressed-token/program/CLAUDE.md)

programs/compressed-token/program/src/**/*.rs: Compressed token accounts (ctoken solana accounts) must use the same account layout as SPL tokens with a custom Compressible extension
Compressed mint accounts (cmints) support only one extension: TokenMetadata

Files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
programs/compressed-token/program/src/mint_action/**/*.rs

📄 CodeRabbit inference engine (programs/compressed-token/program/CLAUDE.md)

MintAction instruction must support 9 action types: CreateCompressedMint, MintTo, UpdateMintAuthority, UpdateFreezeAuthority, CreateSplMint, MintToCToken, UpdateMetadataField, UpdateMetadataAuthority, RemoveMetadataKey

Files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
**/programs/**/src/**/*.rs

📄 CodeRabbit inference engine (DOCS.md)

For accounts with associated methods, add a Methods section grouping methods by purpose (Validation, Constructors, PDA Derivation, etc.) with concise parameter names in signatures, one-line action-oriented descriptions, and concrete values where helpful (constants, defaults)

Files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
programs/**/*.rs

📄 CodeRabbit inference engine (CLAUDE.md)

Unit tests in programs must not depend on light-test-utils; any test requiring light-test-utils must be in program-tests

Files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
programs/compressed-token/program/src/transfer2/**/*.rs

📄 CodeRabbit inference engine (programs/compressed-token/program/CLAUDE.md)

Transfer2 instruction must support Compress, Decompress, and CompressAndClose operations with multi-mint support and sum checks

Files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
programs/compressed-token/program/src/{claim,transfer2}/**/*.rs

📄 CodeRabbit inference engine (programs/compressed-token/program/CLAUDE.md)

Rent authority can only compress accounts when is_compressible() returns true; lamport distribution on close is: rent → rent_sponsor, unutilized → destination

Files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
🧠 Learnings (45)
📓 Common learnings
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/SOLANA_RENT.md:0-0
Timestamp: 2025-11-24T18:00:48.449Z
Learning: Use epoch-based accounting (432,000 slots ≈ 2.5 days) instead of continuous time for Light Protocol rent collection
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/SOLANA_RENT.md:0-0
Timestamp: 2025-11-24T18:00:48.449Z
Learning: Applies to program-libs/compressible/docs/**/*.rs : Light Protocol accounts must satisfy both Solana rent exemption and Light Protocol rent requirements, plus an 11,000 lamport compression incentive during creation
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/SOLANA_RENT.md:0-0
Timestamp: 2025-11-24T18:00:48.449Z
Learning: Applies to program-libs/compressible/docs/**/*.rs : Account closure must distribute lamports according to: Solana rent exemption → returned to user, completed epoch rent → rent recipient, partial epoch rent → user, compression incentive → forester node
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_STATE_TREE.md:0-0
Timestamp: 2025-11-24T17:56:50.011Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/initialize_state_tree.rs : Use `check_account_balance_is_rent_exempt` function from `light-account-checks` to verify rent exemption for both queue_account and merkle_tree_account during initialization
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/RENT.md:0-0
Timestamp: 2025-11-24T18:00:36.663Z
Learning: Applies to program-libs/compressible/docs/**/*rent*.rs : Implement `calculate_close_lamports` function to return (u64, u64) tuple splitting lamports between rent recipient and user, with rent recipient receiving completed epochs and user receiving partial epoch remainder.
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/transfer2/**/*.rs : Transfer2 instruction must support Compress, Decompress, and CompressAndClose operations with multi-mint support and sum checks
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/{claim,transfer2}/**/*.rs : Rent authority can only compress accounts when is_compressible() returns true; lamport distribution on close is: rent → rent_sponsor, unutilized → destination
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Use `calculate_rent_and_balance` function to determine if a CToken account is compressible
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Use `calculate_close_lamports` function to determine lamport distribution when closing CToken accounts
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/close_token_account.rs : Close Token Account instruction must return rent exemption to rent recipient if compressible, and return remaining lamports to destination account
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Calculate claimable rent using `claimable_lamports` function before closing CToken accounts
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:30.012Z
Learning: Run compressed token core tests using `cargo test-sbf -p compressed-token-test --test ctoken`, `--test v1`, `--test mint`, and `--test transfer2`
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-tests/sdk-ctoken-test/README.md:0-0
Timestamp: 2025-11-24T17:55:32.059Z
Learning: Implement all 8 core compressed token operations: create_cmint, mint_to_ctoken, create_token_account_invoke, create_token_account_invoke_signed, create_ata_invoke, create_ata_invoke_signed, transfer_interface_invoke, and transfer_interface_invoke_signed
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/docs/instructions/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:54.689Z
Learning: Applies to programs/compressed-token/program/docs/instructions/instructions/DECOMPRESSED_TRANSFER.md : Decompressed Transfer documentation must cover SPL-compatible transfers between decompressed accounts
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/**/*.rs : Compressed token accounts (ctoken solana accounts) must use the same account layout as SPL tokens with a custom Compressible extension
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/mint_action/**/*.rs : MintAction instruction must support 9 action types: CreateCompressedMint, MintTo, UpdateMintAuthority, UpdateFreezeAuthority, CreateSplMint, MintToCToken, UpdateMetadataField, UpdateMetadataAuthority, RemoveMetadataKey

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/transfer2/**/*.rs : Transfer2 instruction must support Compress, Decompress, and CompressAndClose operations with multi-mint support and sum checks

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T18:01:54.689Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/docs/instructions/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:54.689Z
Learning: Applies to programs/compressed-token/program/docs/instructions/instructions/MINT_ACTION.md : MintAction documentation must cover batch instruction for compressed mint management supporting 9 actions: CreateCompressedMint, MintTo, UpdateMintAuthority, UpdateFreezeAuthority, CreateSplMint, MintToCToken, UpdateMetadataField, UpdateMetadataAuthority, RemoveMetadataKey

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T17:59:54.233Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/PACKED_ACCOUNTS.md:0-0
Timestamp: 2025-11-24T17:59:54.233Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/**/*.rs : Provide descriptive names in ProgramPackedAccounts error messages (e.g., 'token_mint' instead of 'account')

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/{claim,transfer2}/**/*.rs : Rent authority can only compress accounts when is_compressible() returns true; lamport distribution on close is: rent → rent_sponsor, unutilized → destination

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/**/*.rs : Compressed mint accounts (cmints) support only one extension: TokenMetadata

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T17:59:23.357Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/CLAUDE.md:0-0
Timestamp: 2025-11-24T17:59:23.357Z
Learning: Applies to program-libs/account-checks/docs/src/**/packed_accounts.rs : Implement index-based dynamic account access with bounds checking for handling variable account sets (mint, owner, delegate accounts)

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T18:01:14.087Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Use `calculate_rent_and_balance` function to determine if a CToken account is compressible

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T18:01:14.087Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Use `calculate_close_lamports` function to determine lamport distribution when closing CToken accounts

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T18:02:15.670Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/registry/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:02:15.670Z
Learning: Applies to programs/registry/src/account_compression_cpi/mod.rs : Export new wrapper modules in `account_compression_cpi/mod.rs` using `pub mod new_operation;` and `pub use new_operation::*;`, then import in `lib.rs`

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T17:55:32.059Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-tests/sdk-ctoken-test/README.md:0-0
Timestamp: 2025-11-24T17:55:32.059Z
Learning: Implement all 8 core compressed token operations: create_cmint, mint_to_ctoken, create_token_account_invoke, create_token_account_invoke_signed, create_ata_invoke, create_ata_invoke_signed, transfer_interface_invoke, and transfer_interface_invoke_signed

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/close_token_account.rs : Close Token Account instruction must return rent exemption to rent recipient if compressible, and return remaining lamports to destination account

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T18:01:54.689Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/docs/instructions/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:54.689Z
Learning: Applies to programs/compressed-token/program/docs/instructions/instructions/DECOMPRESSED_TRANSFER.md : Decompressed Transfer documentation must cover SPL-compatible transfers between decompressed accounts

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/**/*.rs : Compressed token accounts (ctoken solana accounts) must use the same account layout as SPL tokens with a custom Compressible extension

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T17:55:17.323Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-libs/macros/src/compressible/README.md:0-0
Timestamp: 2025-11-24T17:55:17.323Z
Learning: Applies to sdk-libs/macros/src/compressible/**/decompress_context.rs : Decompression trait implementation (`DecompressContext`) with account accessors, PDA/token separation logic, and token processing delegation should be in `decompress_context.rs`

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T18:01:14.087Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Calculate claimable rent using `claimable_lamports` function before closing CToken accounts

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T18:02:15.670Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/registry/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:02:15.670Z
Learning: Applies to programs/registry/src/account_compression_cpi/*.rs : Create wrapper instruction module at `src/account_compression_cpi/new_operation.rs` with `NewOperationContext` struct defining required accounts

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T18:01:30.012Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:30.012Z
Learning: Run account-compression tests using `cargo test-sbf -p account-compression-test` to test core account compression program (Merkle tree management)

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T18:01:03.786Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:03.786Z
Learning: Applies to program-libs/account-checks/**/packed_accounts.rs : Implement index-based account access with bounds-checked retrieval and descriptive error messages in PackedAccounts

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T17:55:17.323Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-libs/macros/src/compressible/README.md:0-0
Timestamp: 2025-11-24T17:55:17.323Z
Learning: Applies to sdk-libs/macros/src/compressible/**/variant_enum.rs : Account variant enum (`CompressedAccountVariant`) generation and `CompressedAccountData` wrapper struct should be implemented in `variant_enum.rs`

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: When working with ctoken accounts having the compressible extension, you must read program-libs/compressible/docs/ documentation including RENT.md, CONFIG_ACCOUNT.md, and SOLANA_RENT.md for rent system understanding

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T17:56:50.011Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_STATE_TREE.md:0-0
Timestamp: 2025-11-24T17:56:50.011Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/initialize_state_tree.rs : Return error `AccountError::AccountNotRentExempt` (error code 12011) when account balance is insufficient for rent exemption at calculated size

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T18:00:36.663Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/RENT.md:0-0
Timestamp: 2025-11-24T18:00:36.663Z
Learning: Applies to program-libs/compressible/docs/**/*rent*.rs : Implement `calculate_rent_and_balance` function to determine compressibility by checking if account balance covers required rent for epochs since last claim, returning (bool, u64) tuple.

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T17:56:50.011Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_STATE_TREE.md:0-0
Timestamp: 2025-11-24T17:56:50.011Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/initialize_state_tree.rs : Charge rollover fee when creating output compressed accounts (insertion into output queue), not on tree operations

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T17:56:50.011Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_STATE_TREE.md:0-0
Timestamp: 2025-11-24T17:56:50.011Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/initialize_state_tree.rs : Return error `AccountError::InvalidAccountSize` (error code 12006) when account data length doesn't match calculated size requirements

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T18:00:48.449Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/SOLANA_RENT.md:0-0
Timestamp: 2025-11-24T18:00:48.449Z
Learning: Applies to program-libs/compressible/docs/**/*.rs : Implement account compressibility states in the following order: Funded (rent for current + 1 epoch) → Compressible (lacks rent for current + 1 epoch) → Claimable (funded but past epochs unclaimed)

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T18:01:54.689Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/docs/instructions/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:54.689Z
Learning: Applies to programs/compressed-token/program/docs/instructions/instructions/TRANSFER2.md : Transfer2 documentation must cover batch transfer instruction supporting compress/decompress/transfer operations

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T18:01:14.087Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Derive PDA addresses using `derive_pda` and `derive_v1_config_pda` functions for CToken account configuration

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
📚 Learning: 2025-11-24T17:55:17.323Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-libs/macros/src/compressible/README.md:0-0
Timestamp: 2025-11-24T17:55:17.323Z
Learning: Applies to sdk-libs/macros/src/compressible/**/instructions.rs : Compress/decompress instruction handlers and context struct generation should be implemented in `instructions.rs`, with compress using PDA-only and decompress supporting full PDA + ctoken

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
📚 Learning: 2025-11-24T18:01:30.012Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:30.012Z
Learning: Run compressed token core tests using `cargo test-sbf -p compressed-token-test --test ctoken`, `--test v1`, `--test mint`, and `--test transfer2`

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T18:01:03.786Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:03.786Z
Learning: Applies to program-libs/account-checks/**/packed_accounts.rs : Support dynamic account sets (mint, owner, delegate accounts) by index in account access utilities

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T17:57:39.230Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/QUEUE_ACCOUNT.md:0-0
Timestamp: 2025-11-24T17:57:39.230Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/queue.rs : Validate account ownership by Light account compression program using `check_owner` from `light-account-checks` when deserializing `BatchedQueueAccount` with `output_from_account_info`

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T17:59:54.233Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/PACKED_ACCOUNTS.md:0-0
Timestamp: 2025-11-24T17:59:54.233Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/**/*.rs : Use `ProgramPackedAccounts` for index-based access to dynamically sized account arrays in Rust programs

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T18:01:03.786Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:03.786Z
Learning: Applies to program-libs/account-checks/src/account_info/*.rs : Provide PDA derivation functions (`find_program_address`, `create_program_address`) and permission checks in AccountInfoTrait

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T17:59:54.233Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/PACKED_ACCOUNTS.md:0-0
Timestamp: 2025-11-24T17:59:54.233Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/**/*.rs : Call `get()` or `get_u8()` methods with bounds checking for account retrieval in ProgramPackedAccounts

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs
📚 Learning: 2025-11-24T18:01:14.087Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Implement state validation methods (`validate_active`, `validate_not_inactive`) for CompressibleConfig account state verification

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T18:01:54.689Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/docs/instructions/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:54.689Z
Learning: Applies to programs/compressed-token/program/docs/instructions/instructions/CLOSE_TOKEN_ACCOUNT.md : Close Token Account documentation must cover closing decompressed token accounts with rent distribution

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/programs/compressed-token/anchor/src/lib.rs : Custom error codes must be defined in programs/compressed-token/anchor/src/lib.rs as the 'anchor_compressed_token::ErrorCode' enum

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T17:58:50.237Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/ACCOUNT_CHECKS.md:0-0
Timestamp: 2025-11-24T17:58:50.237Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/checks.rs : Implement `check_program` function to verify account key matches program_id AND is marked executable, returning `InvalidProgramId` (20011) or `ProgramNotExecutable` (20012) errors

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T17:58:50.237Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/ACCOUNT_CHECKS.md:0-0
Timestamp: 2025-11-24T17:58:50.237Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/checks.rs : Implement `check_signer` function to verify account is a transaction signer, returning `InvalidSigner` (20009) error if not

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T17:58:50.237Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/ACCOUNT_CHECKS.md:0-0
Timestamp: 2025-11-24T17:58:50.237Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/checks.rs : Implement `check_owner` function to verify account is owned by specified program, returning `AccountOwnedByWrongProgram` (20001) error on mismatch

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T18:00:13.178Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/CONFIG_ACCOUNT.md:0-0
Timestamp: 2025-11-24T18:00:13.178Z
Learning: Applies to program-libs/compressible/docs/**/*instruction*.rs : Validate CompressibleConfig state using `validate_active()` method to ensure state == Active before allowing new compressed token account creation

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/create_*_account*.rs : Token account creation instructions (Create CToken Account and Create Associated CToken Account) require ACTIVE config validation only

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs
📚 Learning: 2025-11-24T18:00:13.178Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/CONFIG_ACCOUNT.md:0-0
Timestamp: 2025-11-24T18:00:13.178Z
Learning: Applies to program-libs/compressible/docs/**/config.rs : Set CompressibleConfig default values for CToken V1: base_rent = 1220, compression_cost = 11000, lamports_per_byte_per_epoch = 10, and address_space[0] = `amt2kaJA14v3urZbZvnc5v2np8jqvc4Z8zDep5wbtzx`

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
🧬 Code graph analysis (4)
programs/compressed-token/program/src/mint_action/actions/process_actions.rs (2)
programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs (1)
  • process_mint_to_ctoken_action (18-60)
programs/compressed-token/program/src/transfer2/compression/mod.rs (1)
  • transfer_map (100-116)
programs/compressed-token/program/src/transfer2/compression/mod.rs (3)
sdk-libs/compressed-token-sdk/src/compressed_token/v2/account2.rs (1)
  • compression (370-372)
programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs (1)
  • process_ctoken_compressions (20-39)
programs/compressed-token/program/src/mint_action/actions/process_actions.rs (1)
  • transfer_map (140-156)
programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs (2)
sdk-libs/compressed-token-sdk/src/compressed_token/v2/account2.rs (1)
  • compression (370-372)
programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs (1)
  • compress_or_decompress_ctokens (21-109)
programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs (1)
programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs (1)
  • compress_or_decompress_ctokens (21-109)
🔇 Additional comments (10)
programs/compressed-token/program/src/transfer2/compression/mod.rs (3)

45-52: Good: Bounds check prevents out-of-bounds panic.

The bounds check on account_index against 40 (the size of transfer_map) is correct and prevents potential panics. The error message is clear and informative.


99-120: LGTM: Transfer aggregation and execution.

The pattern of building transfers from non-zero transfer_map entries matches the existing pattern in process_actions.rs (as shown in the relevant code snippets). The iterator chain correctly filters, maps, and collects into an ArrayVec, with proper error propagation.


59-66: The dedup behavior is intentional—remove this concern.

The early return in process_compressible_extension when *transfer_amount != 0 is correct. Rent-exemption top-ups are account-level values determined by account size and current epoch, not per-compression. Multiple compressions on the same account within a single instruction do not change these rent parameters, so calculating the top-up once and reusing it is both correct and efficient. The transfer_map deduplicates by account_index as designed, storing a single top-up amount per account regardless of compression count.

Likely an incorrect or invalid review comment.

programs/compressed-token/program/src/mint_action/actions/process_actions.rs (2)

96-113: LGTM: Bounds check and transfer accumulation for MintToCToken.

The bounds check is consistent with the pattern in compression/mod.rs, and passing a mutable reference to the specific transfer_map slot enables proper deduplication across multiple MintToCToken actions targeting the same account. This aligns with the guideline that MintAction must support the MintToCToken action type.


139-156: LGTM: Transfer array construction.

This is identical to the pattern in compression/mod.rs and the snippet from the existing codebase (lines 139-155 in the relevant code snippets). Consistent and correct.

programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs (2)

19-24: Signature change enables rent deficit deduplication.

The change from returning Result<Option<u64>, ProgramError> to accepting &mut u64 and returning Result<(), ProgramError> is the core of this fix. This allows the caller to pass a reference to a slot in transfer_map, enabling deduplication when the same account is processed multiple times.


100-108: CompressAndClose doesn't pass transfer_amount because it has no Compressible extension topup logic.

The CompressAndClose branch omits transfer_amount intentionally. Unlike Compress/Decompress which may need to topup lamports for the Compressible extension, CompressAndClose closes the account entirely and distributes lamports directly via close_token_account (rent → rent_sponsor, remaining → destination). The topup calculation is irrelevant for accounts being closed.

Regarding duplicate source accounts in batch operations: The same source account cannot appear in multiple operations because CompressAndClose finalizes closure, making it unavailable for subsequent operations. For regular Compress/Decompress operations on the same account, the transfer_map in process_token_compression accumulates amounts per account index—this is intentional for handling topups, not a dedup concern. The dedup logic (bitvec tracking) is specific to preventing duplicate output compressed account indices within CompressAndClose operations, not source accounts.

programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs (2)

18-25: LGTM: Signature updated to support transfer accumulation.

The function signature change correctly propagates the transfer_amount parameter from the caller (process_actions) to the callee (compress_or_decompress_ctokens). This maintains the dedup chain.


52-59: LGTM: Transfer amount forwarded to compression logic.

The mint_ctokens constructor creates inputs for a Decompress operation, and transfer_amount is correctly forwarded. This allows the compressible extension's top-up calculation to participate in the dedup mechanism.

programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs (1)

18-38: LGTM: Clean signature update and delegation.

The function signature change is consistent with the overall refactor. The function continues to:

  1. Validate compression mode fields
  2. Construct CTokenCompressionInputs from the compression data
  3. Delegate to compress_or_decompress_ctokens with the transfer_amount reference

The change from returning a tuple (index, amount) to void (with accumulation via mutable reference) simplifies the caller's responsibility and enables proper deduplication.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
programs/compressed-token/program/src/lib.rs (2)

39-44: Centralizing MAX_PACKED_ACCOUNTS is the right move

Defining pub(crate) const MAX_PACKED_ACCOUNTS: usize = 40; here eliminates magic numbers downstream and gives a single source of truth for packed-account limits. Consider adding a short comment tying this to the maximum ProgramPackedAccounts capacity so future changes keep those in sync.


113-121: Guard against empty instruction_data before indexing

InstructionType::from(instruction_data[0]) will panic if instruction_data is empty, which is still user-controlled input at the Solana level. A small upfront length check would turn this into a clean InvalidInstructionData error instead of a hard abort:

 pub fn process_instruction(
     program_id: &pinocchio::pubkey::Pubkey,
     accounts: &[AccountInfo],
     instruction_data: &[u8],
 ) -> Result<(), ProgramError> {
-    let discriminator = InstructionType::from(instruction_data[0]);
+    if instruction_data.is_empty() {
+        return Err(ProgramError::InvalidInstructionData);
+    }
+    let discriminator = InstructionType::from(instruction_data[0]);
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e14031d and 486873a.

📒 Files selected for processing (3)
  • programs/compressed-token/program/src/lib.rs (1 hunks)
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs (2 hunks)
  • programs/compressed-token/program/src/transfer2/compression/mod.rs (4 hunks)
🧰 Additional context used
📓 Path-based instructions (6)
programs/compressed-token/program/src/**/*.rs

📄 CodeRabbit inference engine (programs/compressed-token/program/CLAUDE.md)

programs/compressed-token/program/src/**/*.rs: Compressed token accounts (ctoken solana accounts) must use the same account layout as SPL tokens with a custom Compressible extension
Compressed mint accounts (cmints) support only one extension: TokenMetadata

Files:

  • programs/compressed-token/program/src/lib.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
**/programs/**/src/**/*.rs

📄 CodeRabbit inference engine (DOCS.md)

For accounts with associated methods, add a Methods section grouping methods by purpose (Validation, Constructors, PDA Derivation, etc.) with concise parameter names in signatures, one-line action-oriented descriptions, and concrete values where helpful (constants, defaults)

Files:

  • programs/compressed-token/program/src/lib.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
programs/**/*.rs

📄 CodeRabbit inference engine (CLAUDE.md)

Unit tests in programs must not depend on light-test-utils; any test requiring light-test-utils must be in program-tests

Files:

  • programs/compressed-token/program/src/lib.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
programs/compressed-token/program/src/transfer2/**/*.rs

📄 CodeRabbit inference engine (programs/compressed-token/program/CLAUDE.md)

Transfer2 instruction must support Compress, Decompress, and CompressAndClose operations with multi-mint support and sum checks

Files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
programs/compressed-token/program/src/{claim,transfer2}/**/*.rs

📄 CodeRabbit inference engine (programs/compressed-token/program/CLAUDE.md)

Rent authority can only compress accounts when is_compressible() returns true; lamport distribution on close is: rent → rent_sponsor, unutilized → destination

Files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
programs/compressed-token/program/src/mint_action/**/*.rs

📄 CodeRabbit inference engine (programs/compressed-token/program/CLAUDE.md)

MintAction instruction must support 9 action types: CreateCompressedMint, MintTo, UpdateMintAuthority, UpdateFreezeAuthority, CreateSplMint, MintToCToken, UpdateMetadataField, UpdateMetadataAuthority, RemoveMetadataKey

Files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
🧠 Learnings (43)
📓 Common learnings
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Calculate claimable rent using `claimable_lamports` function before closing CToken accounts
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/{claim,transfer2}/**/*.rs : Rent authority can only compress accounts when is_compressible() returns true; lamport distribution on close is: rent → rent_sponsor, unutilized → destination
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/SOLANA_RENT.md:0-0
Timestamp: 2025-11-24T18:00:48.449Z
Learning: Applies to program-libs/compressible/docs/**/*.rs : Light Protocol accounts must satisfy both Solana rent exemption and Light Protocol rent requirements, plus an 11,000 lamport compression incentive during creation
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Use `calculate_rent_and_balance` function to determine if a CToken account is compressible
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/docs/instructions/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:54.689Z
Learning: Applies to programs/compressed-token/program/docs/instructions/instructions/CLOSE_TOKEN_ACCOUNT.md : Close Token Account documentation must cover closing decompressed token accounts with rent distribution
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/SOLANA_RENT.md:0-0
Timestamp: 2025-11-24T18:00:48.449Z
Learning: Applies to program-libs/compressible/docs/**/*.rs : Account closure must distribute lamports according to: Solana rent exemption → returned to user, completed epoch rent → rent recipient, partial epoch rent → user, compression incentive → forester node
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/transfer2/**/*.rs : Transfer2 instruction must support Compress, Decompress, and CompressAndClose operations with multi-mint support and sum checks
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Use `calculate_close_lamports` function to determine lamport distribution when closing CToken accounts
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/PACKED_ACCOUNTS.md:0-0
Timestamp: 2025-11-24T17:59:54.233Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/**/*.rs : Provide descriptive names in ProgramPackedAccounts error messages (e.g., 'token_mint' instead of 'account')
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/CLAUDE.md:0-0
Timestamp: 2025-11-24T17:59:23.357Z
Learning: Applies to program-libs/account-checks/docs/src/**/packed_accounts.rs : Implement index-based dynamic account access with bounds checking for handling variable account sets (mint, owner, delegate accounts)
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/close_token_account.rs : Close Token Account instruction must return rent exemption to rent recipient if compressible, and return remaining lamports to destination account
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:03.786Z
Learning: Applies to program-libs/account-checks/**/packed_accounts.rs : Implement index-based account access with bounds-checked retrieval and descriptive error messages in PackedAccounts
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/registry/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:02:15.670Z
Learning: Applies to programs/registry/src/account_compression_cpi/*.rs : Create wrapper instruction module at `src/account_compression_cpi/new_operation.rs` with `NewOperationContext` struct defining required accounts
📚 Learning: 2025-11-24T17:59:23.357Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/CLAUDE.md:0-0
Timestamp: 2025-11-24T17:59:23.357Z
Learning: Applies to program-libs/account-checks/docs/src/**/packed_accounts.rs : Implement index-based dynamic account access with bounds checking for handling variable account sets (mint, owner, delegate accounts)

Applied to files:

  • programs/compressed-token/program/src/lib.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T17:59:54.233Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/PACKED_ACCOUNTS.md:0-0
Timestamp: 2025-11-24T17:59:54.233Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/**/*.rs : Provide descriptive names in ProgramPackedAccounts error messages (e.g., 'token_mint' instead of 'account')

Applied to files:

  • programs/compressed-token/program/src/lib.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T18:01:03.786Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:03.786Z
Learning: Applies to program-libs/account-checks/**/packed_accounts.rs : Support dynamic account sets (mint, owner, delegate accounts) by index in account access utilities

Applied to files:

  • programs/compressed-token/program/src/lib.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T17:59:54.233Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/PACKED_ACCOUNTS.md:0-0
Timestamp: 2025-11-24T17:59:54.233Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/**/*.rs : Use `ProgramPackedAccounts` for index-based access to dynamically sized account arrays in Rust programs

Applied to files:

  • programs/compressed-token/program/src/lib.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T18:01:14.087Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Use Anchor serialization for CompressibleConfig account structures in Rust programs

Applied to files:

  • programs/compressed-token/program/src/lib.rs
📚 Learning: 2025-11-24T18:01:14.087Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Use `calculate_close_lamports` function to determine lamport distribution when closing CToken accounts

Applied to files:

  • programs/compressed-token/program/src/lib.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T18:00:13.178Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/CONFIG_ACCOUNT.md:0-0
Timestamp: 2025-11-24T18:00:13.178Z
Learning: Applies to program-libs/compressible/docs/program-libs/compressible/src/config.rs : Define CompressibleConfig constant `LEN = 256` to represent the account size in bytes for rent calculation and account creation

Applied to files:

  • programs/compressed-token/program/src/lib.rs
📚 Learning: 2025-11-24T18:02:15.670Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/registry/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:02:15.670Z
Learning: Applies to programs/registry/src/account_compression_cpi/mod.rs : Export new wrapper modules in `account_compression_cpi/mod.rs` using `pub mod new_operation;` and `pub use new_operation::*;`, then import in `lib.rs`

Applied to files:

  • programs/compressed-token/program/src/lib.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T18:01:14.087Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Derive PDA addresses using `derive_pda` and `derive_v1_config_pda` functions for CToken account configuration

Applied to files:

  • programs/compressed-token/program/src/lib.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:03.786Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:03.786Z
Learning: Applies to program-libs/account-checks/**/packed_accounts.rs : Implement index-based account access with bounds-checked retrieval and descriptive error messages in PackedAccounts

Applied to files:

  • programs/compressed-token/program/src/lib.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T17:59:23.357Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/CLAUDE.md:0-0
Timestamp: 2025-11-24T17:59:23.357Z
Learning: Applies to program-libs/account-checks/docs/src/**/*.rs : Define constant discriminator arrays for compile-time verification of account types

Applied to files:

  • programs/compressed-token/program/src/lib.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T17:59:54.233Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/PACKED_ACCOUNTS.md:0-0
Timestamp: 2025-11-24T17:59:54.233Z
Learning: Use ProgramPackedAccounts when account indices come from instruction data and accounts can be accessed in any order

Applied to files:

  • programs/compressed-token/program/src/lib.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/create_*_account*.rs : Token account creation instructions (Create CToken Account and Create Associated CToken Account) require ACTIVE config validation only

Applied to files:

  • programs/compressed-token/program/src/lib.rs
📚 Learning: 2025-11-24T18:01:54.689Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/docs/instructions/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:54.689Z
Learning: Applies to programs/compressed-token/program/docs/instructions/instructions/CREATE_TOKEN_ACCOUNT.md : Create Token Account Instructions documentation must cover creation of regular and associated ctoken accounts

Applied to files:

  • programs/compressed-token/program/src/lib.rs
📚 Learning: 2025-11-24T18:02:15.670Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/registry/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:02:15.670Z
Learning: Applies to programs/registry/src/account_compression_cpi/*.rs : Create wrapper instruction module at `src/account_compression_cpi/new_operation.rs` with `NewOperationContext` struct defining required accounts

Applied to files:

  • programs/compressed-token/program/src/lib.rs
  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/{claim,transfer2}/**/*.rs : Rent authority can only compress accounts when is_compressible() returns true; lamport distribution on close is: rent → rent_sponsor, unutilized → destination

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/transfer2/**/*.rs : Transfer2 instruction must support Compress, Decompress, and CompressAndClose operations with multi-mint support and sum checks

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T18:01:14.087Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:14.087Z
Learning: Applies to program-libs/compressible/**/*.rs : Use `calculate_rent_and_balance` function to determine if a CToken account is compressible

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/**/*.rs : Compressed token accounts (ctoken solana accounts) must use the same account layout as SPL tokens with a custom Compressible extension

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T17:55:17.323Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-libs/macros/src/compressible/README.md:0-0
Timestamp: 2025-11-24T17:55:17.323Z
Learning: Applies to sdk-libs/macros/src/compressible/**/decompress_context.rs : Decompression trait implementation (`DecompressContext`) with account accessors, PDA/token separation logic, and token processing delegation should be in `decompress_context.rs`

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:00:13.178Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/CONFIG_ACCOUNT.md:0-0
Timestamp: 2025-11-24T18:00:13.178Z
Learning: Applies to program-libs/compressible/docs/**/*.rs : Use CompressibleConfig discriminator `[180, 4, 231, 26, 220, 144, 55, 168]` for account validation in Solana programs and clients

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T17:55:17.323Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-libs/macros/src/compressible/README.md:0-0
Timestamp: 2025-11-24T17:55:17.323Z
Learning: Applies to sdk-libs/macros/src/compressible/**/pack_unpack.rs : Pubkey compression logic and `PackedXxx` struct generation with Pack/Unpack trait implementations should be in `pack_unpack.rs`

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T17:55:17.323Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-libs/macros/src/compressible/README.md:0-0
Timestamp: 2025-11-24T17:55:17.323Z
Learning: Applies to sdk-libs/macros/src/compressible/**/variant_enum.rs : Account variant enum (`CompressedAccountVariant`) generation and `CompressedAccountData` wrapper struct should be implemented in `variant_enum.rs`

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:00:13.178Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/CONFIG_ACCOUNT.md:0-0
Timestamp: 2025-11-24T18:00:13.178Z
Learning: Applies to program-libs/compressible/docs/program-libs/compressible/src/config.rs : RentConfig struct must use fixed-size fields: base_rent (u16, 2 bytes), compression_cost (u16, 2 bytes), lamports_per_byte_per_epoch (u8, 1 byte), and _place_holder_bytes ([u8; 3], 3 bytes padding) for proper 8-byte alignment

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T17:59:36.701Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/DISCRIMINATOR.md:0-0
Timestamp: 2025-11-24T17:59:36.701Z
Learning: Applies to program-libs/account-checks/docs/**/account-checks/**/*.rs : Implement the Discriminator trait for account types, providing 8-byte LIGHT_DISCRIMINATOR constant and LIGHT_DISCRIMINATOR_SLICE reference in Rust account structures

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:54.689Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/docs/instructions/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:54.689Z
Learning: Applies to programs/compressed-token/program/docs/instructions/instructions/DECOMPRESSED_TRANSFER.md : Decompressed Transfer documentation must cover SPL-compatible transfers between decompressed accounts

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/close_token_account.rs : Close Token Account instruction must return rent exemption to rent recipient if compressible, and return remaining lamports to destination account

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T17:57:39.230Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/QUEUE_ACCOUNT.md:0-0
Timestamp: 2025-11-24T17:57:39.230Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/queue.rs : Validate account ownership by Light account compression program using `check_owner` from `light-account-checks` when deserializing `BatchedQueueAccount` with `output_from_account_info`

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: When working with ctoken accounts having the compressible extension, you must read program-libs/compressible/docs/ documentation including RENT.md, CONFIG_ACCOUNT.md, and SOLANA_RENT.md for rent system understanding

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:30.012Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:30.012Z
Learning: Run account-compression tests using `cargo test-sbf -p account-compression-test` to test core account compression program (Merkle tree management)

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T17:56:50.011Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_STATE_TREE.md:0-0
Timestamp: 2025-11-24T17:56:50.011Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/initialize_state_tree.rs : Return error `AccountError::AccountNotRentExempt` (error code 12011) when account balance is insufficient for rent exemption at calculated size

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T17:56:50.011Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_STATE_TREE.md:0-0
Timestamp: 2025-11-24T17:56:50.011Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/initialize_state_tree.rs : Return error `AccountError::InvalidAccountSize` (error code 12006) when account data length doesn't match calculated size requirements

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T18:00:36.663Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/RENT.md:0-0
Timestamp: 2025-11-24T18:00:36.663Z
Learning: Applies to program-libs/compressible/docs/**/*rent*.rs : Implement `calculate_rent_and_balance` function to determine compressibility by checking if account balance covers required rent for epochs since last claim, returning (bool, u64) tuple.

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T17:57:39.230Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/QUEUE_ACCOUNT.md:0-0
Timestamp: 2025-11-24T17:57:39.230Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/queue.rs : Use two value vectors (`[ZeroCopyVecU64<[u8; 32]>; 2]`), one per batch, to store compressed account hashes in `BatchedQueueAccount`

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T17:57:39.230Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/QUEUE_ACCOUNT.md:0-0
Timestamp: 2025-11-24T17:57:39.230Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/queue.rs : Use zero-copy deserialization for all `BatchedQueueAccount` operations

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T17:56:50.011Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_STATE_TREE.md:0-0
Timestamp: 2025-11-24T17:56:50.011Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/queue.rs : Store `BatchedQueueAccount` layout and `BatchedQueueMetadata` in src/queue.rs

Applied to files:

  • programs/compressed-token/program/src/transfer2/compression/mod.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/mint_action/**/*.rs : MintAction instruction must support 9 action types: CreateCompressedMint, MintTo, UpdateMintAuthority, UpdateFreezeAuthority, CreateSplMint, MintToCToken, UpdateMetadataField, UpdateMetadataAuthority, RemoveMetadataKey

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T18:01:54.689Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/docs/instructions/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:54.689Z
Learning: Applies to programs/compressed-token/program/docs/instructions/instructions/MINT_ACTION.md : MintAction documentation must cover batch instruction for compressed mint management supporting 9 actions: CreateCompressedMint, MintTo, UpdateMintAuthority, UpdateFreezeAuthority, CreateSplMint, MintToCToken, UpdateMetadataField, UpdateMetadataAuthority, RemoveMetadataKey

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T18:01:42.343Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2025-11-24T18:01:42.343Z
Learning: Applies to programs/compressed-token/program/src/**/*.rs : Compressed mint accounts (cmints) support only one extension: TokenMetadata

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T17:56:50.011Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_STATE_TREE.md:0-0
Timestamp: 2025-11-24T17:56:50.011Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/initialize_state_tree.rs : Define batch size parameters in `InitStateTreeAccountsInstructionData` struct: input_queue_batch_size (u64, default 15,000), output_queue_batch_size (u64, default 15,000), input_queue_zkp_batch_size (u64, default 500), and output_queue_zkp_batch_size (u64, default 500)

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T17:59:46.693Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/ERRORS.md:0-0
Timestamp: 2025-11-24T17:59:46.693Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/error.rs : Map Pinocchio standard ProgramError variants (InvalidArgument, InvalidInstructionData, InvalidAccountData, AccountDataTooSmall, InsufficientFunds, IncorrectProgramId, MissingRequiredSignature, AccountAlreadyInitialized, UninitializedAccount, NotEnoughAccountKeys, AccountBorrowFailed) to AccountError::PinocchioProgramError with codes 1-11

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
📚 Learning: 2025-11-24T17:55:32.059Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-tests/sdk-ctoken-test/README.md:0-0
Timestamp: 2025-11-24T17:55:32.059Z
Learning: Implement all 8 core compressed token operations: create_cmint, mint_to_ctoken, create_token_account_invoke, create_token_account_invoke_signed, create_ata_invoke, create_ata_invoke_signed, transfer_interface_invoke, and transfer_interface_invoke_signed

Applied to files:

  • programs/compressed-token/program/src/mint_action/actions/process_actions.rs
🧬 Code graph analysis (2)
programs/compressed-token/program/src/transfer2/compression/mod.rs (3)
programs/compressed-token/program/src/mint_action/actions/process_actions.rs (1)
  • transfer_map (138-154)
sdk-libs/compressed-token-sdk/src/compressed_token/v2/account2.rs (1)
  • compression (370-372)
programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs (1)
  • process_ctoken_compressions (20-39)
programs/compressed-token/program/src/mint_action/actions/process_actions.rs (2)
programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs (1)
  • process_mint_to_ctoken_action (18-60)
programs/compressed-token/program/src/transfer2/compression/mod.rs (1)
  • transfer_map (99-115)
⏰ Context from checks skipped due to timeout of 900000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: programs (system-cpi-test-v2-functional-read-only, ["cargo-test-sbf -p system-cpi-v2-test -- func...
  • GitHub Check: programs (compressed-token-and-e2e, ["cargo-test-sbf -p compressed-token-test --test v1", "cargo-...
  • GitHub Check: programs (system-cpi-test-v2-functional-account-infos, ["cargo-test-sbf -p system-cpi-v2-test -- ...
  • GitHub Check: programs (system-cpi-test, ["cargo-test-sbf -p system-cpi-test", "cargo test -p light-system-prog...
  • GitHub Check: stateless-js-v1
  • GitHub Check: Forester e2e test
🔇 Additional comments (2)
programs/compressed-token/program/src/mint_action/actions/process_actions.rs (2)

31-32: Per-account transfer_map aggregation correctly dedups top-ups

Using MAX_PACKED_ACCOUNTS for the transfer map size and ArrayVec<Transfer, MAX_PACKED_ACCOUNTS> ensures you aggregate all rent top-ups per packed-account index and emit at most one lamport transfer per account. This, combined with passing a &mut u64 down into the compression helpers, is exactly what you need to avoid double-charging rent deficits when the same ctoken account is touched multiple times in a single MintAction.

As per coding guidelines and packed-accounts learnings, this is a nice alignment with the recommended index-based, bounds-checked access pattern.

Also applies to: 47-48, 137-155


94-111: Bounds check + &mut accumulation on MintToCToken look solid; clarify dedup scope

The new account_index bounds check against MAX_PACKED_ACCOUNTS prevents out-of-bounds indexing on transfer_map and returns a domain-specific TooManyCompressionTransfers error with a clear log message. Passing &mut transfer_map[account_index] into process_mint_to_ctoken_action lets compress_or_decompress_ctokens simulate prior scheduled top-ups and avoid overcharging the same ctoken account across multiple MintToCToken actions in this instruction.

One thing to explicitly confirm: this design dedups per MintAction instruction. If the same ctoken account appears in multiple MintAction or Transfer2 instructions within the same transaction, it will still be billed once per instruction. Please confirm that “once per transaction per ctoken account” in the issue description is meant in this per-instruction sense.

Based on learnings about ProgramPackedAccounts and instruction-data indices, this pattern matches the intended safe usage.

@ananas-block ananas-block merged commit 82470c4 into main Dec 3, 2025
29 checks passed
@ananas-block ananas-block deleted the jorrit/fix-rent-deficit-dedup branch December 3, 2025 19:04
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.

2 participants