Conversation
WalkthroughRefactors transfer-amount handling: functions that previously returned Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes
Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Pre-merge checks and finishing touches✅ Passed checks (3 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
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.
a0648c8 to
e14031d
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
⛔ Files ignored due to path filters (1)
program-tests/compressed-token-test/tests/transfer2/no_system_program_cpi_failing.rsis 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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/process_actions.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/process_actions.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/process_actions.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/process_actions.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/process_actions.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/process_actions.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/process_actions.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/process_actions.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/process_actions.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/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.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/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.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/mint_action/actions/process_actions.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/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.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/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.rsprograms/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_indexbefore using it to index intotransfer_map. Passing&mut transfer_map[account_index]directly toprocess_mint_to_ctoken_actionelegantly 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_amountthrough tocompress_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_ctokenswith thetransfer_amountreference. 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_mapentry is only passed toprocess_ctoken_compressionsfor ctoken accounts (owned byLIGHT_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 u64and returnsResult<(), 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_amountis already non-zero, we skip recalculating. Since all operations on the same account index share the sametransfer_amountslot (fromtransfer_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_extensioncall now receivestransfer_amountfor both modes, ensuring rent deficit tracking works consistently across compress and decompress operations.Also applies to: 93-98
programs/compressed-token/program/src/transfer2/compression/mod.rs
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
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 aroundcompression_authority_is_signerand guardingamountvsctoken.amount.The new shape of
process_compress_and_closelooks good overall: explicitOptioninputs, early authority/signer check, and reuse ofvalidate_token_account_for_close_transfer2/validate_compressed_token_accountalign with the transfer2 + close_token_account flows.One subtle point: we always set
*ctoken.amount = 0.into()even whencompression_authority_is_signerisfalse, in which case we also skipvalidate_compressed_token_account. That means there is a path where the on‑chain balance is zeroed entirely based only on theamountparameter and the close‑account validation, without any local cross‑check thatamountactually matches the currentctokenbalance or a concrete compressed output.If
compression_authority_is_signeris guaranteed to betruefor any realCompressAndClose(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
amountmatches the full source balance (e.g. compare againstctoken.amountusing the same conversion you use invalidate_compressed_token_account), and- Fail with
CompressAndCloseBalanceMismatch(or similar) if they don’t match.That way, even if a caller accidentally passes an incorrect
amountor 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
CompressAndCloseoutputs is a nice, tight way to prevent the same compressed token account index from being used twice in one instruction. Theview_bits_mut::<Msb0>()+get_mut(compressed_idx as usize)pattern is sound, and returningCompressAndCloseDuplicateOutputon 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 withInvalidInstructionData. 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 likeCompressAndCloseInvalidCompressedIndex, 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
⛔ Files ignored due to path filters (1)
program-tests/compressed-token-test/tests/transfer2/no_system_program_cpi_failing.rsis 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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/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.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/ctoken/mod.rsprograms/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/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_indexagainst 40 (the size oftransfer_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_mapentries matches the existing pattern inprocess_actions.rs(as shown in the relevant code snippets). The iterator chain correctly filters, maps, and collects into anArrayVec, with proper error propagation.
59-66: The dedup behavior is intentional—remove this concern.The early return in
process_compressible_extensionwhen*transfer_amount != 0is 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. Thetransfer_mapdeduplicates byaccount_indexas 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 specifictransfer_mapslot enables proper deduplication across multipleMintToCTokenactions 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.rsand 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 u64and returningResult<(), ProgramError>is the core of this fix. This allows the caller to pass a reference to a slot intransfer_map, enabling deduplication when the same account is processed multiple times.
100-108: CompressAndClose doesn't passtransfer_amountbecause it has no Compressible extension topup logic.The
CompressAndClosebranch omitstransfer_amountintentionally. UnlikeCompress/Decompresswhich may need to topup lamports for the Compressible extension,CompressAndClosecloses the account entirely and distributes lamports directly viaclose_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
CompressAndClosefinalizes closure, making it unavailable for subsequent operations. For regularCompress/Decompressoperations on the same account, thetransfer_mapinprocess_token_compressionaccumulates 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 withinCompressAndCloseoperations, 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_amountparameter 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_ctokensconstructor creates inputs for a Decompress operation, andtransfer_amountis 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:
- Validate compression mode fields
- Construct
CTokenCompressionInputsfrom the compression data- Delegate to
compress_or_decompress_ctokenswith thetransfer_amountreferenceThe change from returning a tuple
(index, amount)to void (with accumulation via mutable reference) simplifies the caller's responsibility and enables proper deduplication.
.../compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs
Show resolved
Hide resolved
There was a problem hiding this comment.
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: CentralizingMAX_PACKED_ACCOUNTSis the right moveDefining
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 maximumProgramPackedAccountscapacity so future changes keep those in sync.
113-121: Guard against emptyinstruction_databefore indexing
InstructionType::from(instruction_data[0])will panic ifinstruction_datais empty, which is still user-controlled input at the Solana level. A small upfront length check would turn this into a cleanInvalidInstructionDataerror 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
📒 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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/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.rsprograms/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.rsprograms/compressed-token/program/src/transfer2/compression/mod.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/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.rsprograms/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-accounttransfer_mapaggregation correctly dedups top-upsUsing
MAX_PACKED_ACCOUNTSfor the transfer map size andArrayVec<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 u64down 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 +&mutaccumulation on MintToCToken look solid; clarify dedup scopeThe new
account_indexbounds check againstMAX_PACKED_ACCOUNTSprevents out-of-bounds indexing ontransfer_mapand returns a domain-specificTooManyCompressionTransferserror with a clear log message. Passing&mut transfer_map[account_index]intoprocess_mint_to_ctoken_actionletscompress_or_decompress_ctokenssimulate 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.
Issue:
top upis charged per usage of a ctoken account (eg multiple decompressions or mints to the same ctoken account) instead of once per transactionSolution:
Summary by CodeRabbit
Bug Fixes
Refactor
✏️ Tip: You can customize this high-level summary in your review settings.