refactor: store mint signer in compressed mint struct#2169
refactor: store mint signer in compressed mint struct#2169SwenSchaeferjohann merged 3 commits intomainfrom
Conversation
📝 WalkthroughWalkthroughReplaces stored Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant Client
participant SDK
participant Program
participant CompressedMintState
participant CMintPDA as CMint PDA
rect rgba(50,150,250,0.5)
Client->>SDK: build create_compressed_mint(inputs with mint_signer)
SDK->>Program: create_compressed_mint instruction (metadata: mint_signer, bump derived)
Program->>Program: derive mint_pda, validate bump & derived PDA == metadata.mint
Program->>CompressedMintState: store metadata (mint_signer, bump, reserved)
end
sequenceDiagram
autonumber
participant Client
participant SDK
participant Program
participant CompressedMintState
participant CMintPDA as CMint PDA
rect rgba(50,200,100,0.5)
Client->>SDK: build DecompressMint action (no cmint_bump)
SDK->>Program: DecompressMint instruction referencing compressed mint
Program->>CompressedMintState: read metadata (mint_signer, bump)
Program->>Program: derive cmint PDA from mint_signer + bump (derive_address)
Program->>CMintPDA: create/verify CMint PDA using derived seeds
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ 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 |
sdk-libs/token-sdk/src/compressed_token/v2/create_compressed_mint/instruction.rs
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (7)
sdk-libs/token-sdk/src/token/decompress_mint.rs (1)
172-188: Clarify naming:mint_signervsmint_seed.The comment at line 174 refers to "mint_signer" but
build_account_infos()passesself.mint_seedat that position. The struct field is namedmint_seed(line 135) while the comment usesmint_signer.From the broader PR context,
mint_signeris now stored in the compressed mint metadata. Ifmint_seedandmint_signerrefer to the same pubkey (the seed used to derive the CMint PDA), consider aligning the terminology for clarity.Either:
- Update the comment to say "mint_seed" to match the struct field, or
- Rename the struct field to
mint_signerif that's the canonical term post-refactoringsdk-libs/token-sdk/src/compressed_token/v2/create_compressed_mint/instruction.rs (2)
106-119: Unused struct fieldmint_addressshould be removed.The
mint_addressfield inCreateCompressedMintInputsCpiWriteis never used increate_compressed_mint_cpi_write. The function derives the mint address internally at line 132 usingfind_mint_address(&input.mint_signer).This unused field adds unnecessary serialization overhead and confuses API consumers.
🔧 Proposed fix
#[derive(Debug, Clone, AnchorDeserialize, AnchorSerialize)] pub struct CreateCompressedMintInputsCpiWrite { pub decimals: u8, pub mint_authority: Pubkey, pub freeze_authority: Option<Pubkey>, pub address_merkle_tree_root_index: u16, pub mint_signer: Pubkey, pub payer: Pubkey, - pub mint_address: [u8; 32], pub cpi_context: CpiContext, pub cpi_context_pubkey: Pubkey, pub extensions: Option<Vec<ExtensionInstructionData>>, pub version: u8, }
203-208: Duplicate function - consolidate with existingfind_mint_addressincreate_mint.rs.This function is identical to the one at
sdk-libs/token-sdk/src/token/create_mint.rs(lines 537-542). Having two copies violates DRY and risks divergence if one is updated without the other.Consider re-exporting from a single canonical location or moving to a shared utilities module.
♻️ Suggested approach
Option 1: Import from the existing location:
-pub fn find_mint_address(mint_seed: &Pubkey) -> (Pubkey, u8) { - Pubkey::find_program_address( - &[COMPRESSED_MINT_SEED, mint_seed.as_ref()], - &Pubkey::new_from_array(light_token_interface::LIGHT_TOKEN_PROGRAM_ID), - ) -} +pub use crate::token::create_mint::find_mint_address;Option 2: Move to a shared module (e.g.,
crate::utils::address) and have both files import from there.#!/bin/bash # Check for other duplicates of find_mint_address across the codebase rg -n "fn find_mint_address" --type=rustsdk-libs/token-sdk/src/token/create_mint.rs (3)
26-36: Unused fields remain inCreateMintParamsafter refactoring.After your changes,
compression_address(line 32) andmint(line 33) are no longer used inCreateMint::instruction()— the method now derives these values internally frommint_seed_pubkey. These fields are now dead code in the public API, which will confuse SDK users.Consider removing these unused fields to keep the API clean:
♻️ Proposed cleanup
pub struct CreateMintParams { pub decimals: u8, pub address_merkle_tree_root_index: u16, pub mint_authority: Pubkey, pub proof: CompressedProof, - pub compression_address: [u8; 32], - pub mint: Pubkey, pub freeze_authority: Option<Pubkey>, pub extensions: Option<Vec<ExtensionInstructionData>>, }
38-75: Documentation example is now misleading.The doc example still shows users deriving and setting
compression_address(line 54, 62) andmint(line 55, 63) inCreateMintParams. After your refactoring, these fields are unused — the instruction derives them internally. This will lead developers astray.Update the example to match the new behavior once unused fields are removed from the struct.
175-208: Same dead-field issue inCreateMintCpiWriteParams.
compression_address(line 181) andmint(line 182) are unused after the refactoring —CreateCompressedMintCpiWrite::instruction()derives these frommint_signerat line 259. Thenew()constructor still accepts these parameters, forcing callers to compute values that are immediately discarded.♻️ Proposed cleanup
pub struct CreateMintCpiWriteParams { pub decimals: u8, pub mint_authority: Pubkey, pub freeze_authority: Option<Pubkey>, pub address_merkle_tree_root_index: u16, - pub compression_address: [u8; 32], - pub mint: Pubkey, pub cpi_context: CpiContext, pub extensions: Option<Vec<ExtensionInstructionData>>, pub version: u8, } impl CreateMintCpiWriteParams { pub fn new( decimals: u8, address_merkle_tree_root_index: u16, mint_authority: Pubkey, - compression_address: [u8; 32], - mint: Pubkey, cpi_context: CpiContext, ) -> Self { Self { decimals, version: 3, address_merkle_tree_root_index, mint_authority, - compression_address, - mint, cpi_context, freeze_authority: None, extensions: None, } }programs/compressed-token/program/src/compressed_token/mint_action/actions/create_mint.rs (1)
50-54: Minor: Comment numbering inconsistency.The comment says "3. Validate derived PDA" but the first validation comment at line 40 says "1. Validate mint_signer" - there's no "2." comment for the bump validation. Consider adding consistent numbering for maintainability.
🔧 Suggested fix for comment consistency
// 1. Validate mint_signer matches account if mint_signer.as_slice() != mint.metadata.mint_signer.array_ref() { msg!("Mint signer mismatch"); return Err(ErrorCode::MintActionInvalidMintSigner.into()); } + // 2. Validate bump matches derived PDA bump if mint_pda_bump != mint.metadata.bump { msg!("Mint bump mismatch"); return Err(ErrorCode::MintActionInvalidMintBump.into()); } // 3. Validate derived PDA matches stored mint
🤖 Fix all issues with AI agents
In `@program-libs/token-interface/src/state/mint/compressed_mint.rs`:
- Around line 78-93: The compressed_address() doc should clarify the two-step
derivation chain: note that mint_signer and bump are used to derive the mint PDA
(via COMPRESSED_MINT_SEED) and that compressed_address() derives the Light
Protocol compressed address from that mint PDA (using derive_address with
CMINT_ADDRESS_TREE and LIGHT_TOKEN_PROGRAM_ID); update the doc comment on the
compressed_address() method to state this relationship and mention the mint
field is the PDA derived from (mint_signer, bump).
In
`@sdk-libs/token-sdk/src/compressed_token/v2/create_compressed_mint/instruction.rs`:
- Around line 42-48: The parameter `_mint_address` on create_compressed_mint_cpi
is unused (mint is derived via find_mint_address(&input.mint_signer)); remove
the `_mint_address` parameter from the function signature and all call sites, or
if you must preserve API compatibility, mark the parameter/function as
deprecated with a clear note and add documentation explaining that mint address
is now derived from `input.mint_signer`, or alternatively introduce a new
function (e.g., create_compressed_mint_cpi_v2) without the parameter and
deprecate the old one; update any docs and tests referencing
create_compressed_mint_cpi accordingly.
In `@sdk-libs/token-sdk/src/token/decompress_mint.rs`:
- Line 64: The call to find_mint_address(&self.mint_seed_pubkey) returns a bump
that is never used (_cmint_bump) causing unnecessary work; replace this with a
variant that avoids computing the bump (e.g., use Pubkey::find_program_address
with the same seeds to obtain just the PDA or use Pubkey::create_program_address
if you can supply the known bump), update the code that references cmint_pda
accordingly, and remove the unused _cmint_bump local and any dead imports so the
decompression path no longer computes an unused bump in find_mint_address.
sdk-libs/token-sdk/src/compressed_token/v2/create_compressed_mint/instruction.rs
Show resolved
Hide resolved
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (6)
sdk-libs/token-sdk/src/token/create_mint.rs (1)
48-61: Documentation example is missing the newbumpfield.The code example in the docstring shows
CreateMintParamswithout the newly addedbumpfield. This will cause compilation errors for anyone following the example.📝 Suggested documentation update
/// let params = CreateMintParams { /// decimals: 9, /// address_merkle_tree_root_index, // from rpc.get_validity_proof /// mint_authority, /// proof, // from rpc.get_validity_proof /// compression_address, /// mint, +/// bump, // from find_mint_address /// freeze_authority: None, /// extensions: None, /// };sdk-libs/token-sdk/src/compressed_token/v2/create_compressed_mint/instruction.rs (2)
105-118: Unusedmint_addressfield inCreateCompressedMintInputsCpiWrite.Line 113 still declares
pub mint_address: [u8; 32]but this value is never used increate_compressed_mint_cpi_write— the function derivesmint_pdafrominput.mint_signerat line 131 instead. This is dead code that will confuse future maintainers.♻️ Suggested fix
pub struct CreateCompressedMintInputsCpiWrite { pub decimals: u8, pub mint_authority: Pubkey, pub freeze_authority: Option<Pubkey>, pub address_merkle_tree_root_index: u16, pub mint_signer: Pubkey, pub payer: Pubkey, - pub mint_address: [u8; 32], pub cpi_context: CpiContext, pub cpi_context_pubkey: Pubkey, pub extensions: Option<Vec<ExtensionInstructionData>>, pub version: u8, }
200-205: Extractfind_mint_addressto shared module to eliminate duplication.This function is identically implemented in both
sdk-libs/token-sdk/src/token/create_mint.rs(line 338) andsdk-libs/token-sdk/src/compressed_token/v2/create_compressed_mint/instruction.rs(line 200), creating unnecessary maintenance burden. Both modules actively use the function—consider consolidating into a shared location like the existingutils.rsmodule and re-exporting from each module as needed.sdk-libs/token-sdk/src/token/decompress_mint.rs (1)
170-186: Account ordering comment lists 15 accounts but implementation has 14.The comment at lines 170-185 lists
mint_signer (no sign for decompress)as account#2, butbuild_account_infos()at lines 196-213 doesn't include amint_signeraccount — it starts directly withauthority. The comment is now stale and misleading.📝 Suggested comment update
// Account order must match to_account_metas() from MintActionMetaConfig: // 1. light_system_program - // 2. mint_signer (no sign for decompress) - // 3. authority (signer) - // 4. compressible_config - // 5. cmint - // 6. rent_sponsor - // 7. fee_payer (signer) - // 8. cpi_authority_pda - // 9. registered_program_pda - // 10. account_compression_authority - // 11. account_compression_program - // 12. system_program - // 13. output_queue - // 14. tree_pubkey (state_tree) - // 15. input_queue + // 2. authority (signer) + // 3. compressible_config + // 4. cmint + // 5. rent_sponsor + // 6. fee_payer (signer) + // 7. cpi_authority_pda + // 8. registered_program_pda + // 9. account_compression_authority + // 10. account_compression_program + // 11. system_program + // 12. output_queue + // 13. tree_pubkey (state_tree) + // 14. input_queueprograms/compressed-token/program/docs/compressed_token/MINT_ACTION.md (1)
60-61: Consider documenting DecompressMintAction fields for completeness.Line 60 references
DecompressMint(DecompressMintAction)but doesn't describe the action's fields. Since thecmint_bumpfield was removed as part of this refactor, it would help future readers to document the current fields:- `DecompressMint(DecompressMintAction)` - Decompress compressed mint to CMint Solana account (decompress_mint.rs) - `rent_payment: u8` - Rent payment in epochs (must be >= 2) - `write_top_up: u32` - Lamports for future write operationsThis matches the pattern used for other actions and helps verify the docs match the implementation.
programs/compressed-token/program/tests/mint.rs (1)
67-71: Address derivation uses wrong seed—this is causing the pipeline failure.The
compressed_account_addressis derived usingmint_pda.to_bytes(), but with the new design wheremint_signeris stored in the metadata, the address should be derived usingmint_signeras the seed. The test generates a randommint_signerat line 116 that's different frommint_pda, so the assertion at line 304 fails.🐛 Proposed fix: Derive address from mint_signer
Move the address derivation after
mint_signeris generated, and use it as the seed:- // Derive compressed account address - let compressed_account_address = derive_address( - &mint_pda.to_bytes(), - &address_merkle_tree.to_bytes(), - &program_id.to_bytes(), - ); - // Step 1: Create random extension data (simplified for current API)Then after line 117 where
mint_signeris defined:let mint_signer = Pubkey::new_from_array(rng.gen::<[u8; 32]>()); let bump: u8 = rng.gen(); + + // Derive compressed account address from mint_signer (the new seed) + let compressed_account_address = derive_address( + &mint_signer.to_bytes(), + &address_merkle_tree.to_bytes(), + &program_id.to_bytes(), + ); + let mint_instruction_data = CompressedMintInstructionData {
🤖 Fix all issues with AI agents
In `@program-libs/token-interface/src/state/mint/compressed_mint.rs`:
- Around line 23-24: Update the misleading comment next to the `pub reserved:
[u8; 16]` declaration to state that the 16-byte reserved field positions
`account_type` at offset 165 for T22 compatibility and clarify that the `bump:
u8` in `CompressedMintMetadata` is not new (it has been part of
`CompressedMintMetadata` since its definition). Modify the description of
`CompressedMintMetadata` (referencing the fields `version`,
`cmint_decompressed`, `mint`, `mint_signer`, `bump`) to reflect the correct
67-byte metadata size, and update the outdated arithmetic comment in `top_up.rs`
to read `"82 (BaseMint) + 67 (metadata) + 16 (reserved) + 1 (account_type) =
166"`.
♻️ Duplicate comments (1)
program-libs/token-interface/src/state/mint/compressed_mint.rs (1)
70-93: Well-structured refactor of CompressedMintMetadata with clear derivation chain.The replacement of
compressed_address: [u8; 32]withmint_signer: [u8; 32]+bump: u8is clean. Thecompressed_address()method correctly derives the Light Protocol address from themintPDA (not directly frommint_signer), using the canonicalCMINT_ADDRESS_TREEandLIGHT_TOKEN_PROGRAM_ID.One suggestion per a previous review: consider adding a brief doc comment to
compressed_address()clarifying the two-step derivation chain for future maintainers:/// Derives the Light Protocol compressed address from the mint PDA. /// Note: The mint PDA itself is derived from (mint_signer, bump) using COMPRESSED_MINT_SEED.
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)
sdk-libs/token-sdk/src/token/decompress_mint.rs (1)
169-184: Stale comment: account order no longer matches code.The comment lists 15 accounts with
mint_signerat position 2, but after this refactor the mint signer is stored in metadata and no longer passed as an account. The actualbuild_account_infos()below has 14 accounts starting withauthorityat position 2.Update the comment to reflect the current account order:
- light_system_program
- authority (signer)
- compressible_config
- cmint
- rent_sponsor
- fee_payer (signer)
- cpi_authority_pda
- registered_program_pda
- account_compression_authority
- account_compression_program
- system_program
- output_queue
- tree_pubkey (state_tree)
- input_queue
sdk-libs/token-sdk/src/token/create_mint.rs (1)
21-31: Remove unusedcompression_addressfield fromCreateMintParams.The field at line 26 is never referenced in the instruction flow. While callers derive and pass it (as shown in the doc example at line 49),
MintActionCompressedInstructionData::new_mintdoesn't need it—it only usesaddress_merkle_tree_root_indexandproof. The compressed address can be derived on-demand frommint_seed_pubkeyandaddress_tree_pubkeyif needed elsewhere, eliminating dead weight from the struct.
🤖 Fix all issues with AI agents
In `@programs/compressed-token/program/tests/mint.rs`:
- Around line 113-125: The test currently randomizes mint_signer, bump, and
mint_pda independently which breaks PDA invariants; update the test so mint_pda
and bump are derived from mint_signer using the same PDA derivation helper used
in production (e.g., the program's mint PDA helper or find_program_address)
before constructing CompressedMintInstructionData/CompressedMintMetadata,
ensuring mint_signer, bump, and mint_pda are consistent with the real PDA
derivation.
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
⛔ Files ignored due to path filters (12)
js/compressed-token/src/v3/actions/mint-to-compressed.tsis excluded by none and included by nonejs/compressed-token/src/v3/actions/mint-to.tsis excluded by none and included by nonejs/compressed-token/src/v3/instructions/create-mint.tsis excluded by none and included by nonejs/compressed-token/src/v3/instructions/mint-to-compressed.tsis excluded by none and included by nonejs/compressed-token/src/v3/instructions/mint-to-interface.tsis excluded by none and included by nonejs/compressed-token/src/v3/instructions/mint-to.tsis excluded by none and included by nonejs/compressed-token/src/v3/instructions/update-metadata.tsis excluded by none and included by nonejs/compressed-token/src/v3/instructions/update-mint.tsis excluded by none and included by nonejs/compressed-token/src/v3/layout/layout-mint-action.tsis excluded by none and included by nonejs/compressed-token/src/v3/layout/layout-mint.tsis excluded by none and included by nonesdk-tests/sdk-light-token-test/tests/test_ctoken_mint_to.rsis excluded by none and included by nonesdk-tests/sdk-light-token-test/tests/test_decompress_cmint.rsis excluded by none and included by none
📒 Files selected for processing (3)
programs/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rssdk-libs/token-sdk/src/token/decompress_mint.rs
🧰 Additional context used
📓 Path-based instructions (4)
sdk-libs/**/*.rs
📄 CodeRabbit inference engine (CLAUDE.md)
sdk-libs/**/*.rs: SDK libs must depend only on program-libs, light-prover-client, and external crates
SDK libs must not depend on programs without devenv feature
Files:
sdk-libs/token-sdk/src/token/decompress_mint.rssdk-libs/token-sdk/src/token/create_mint.rs
programs/**/*.rs
📄 CodeRabbit inference engine (CLAUDE.md)
programs/**/*.rs: Programs must depend only on program-libs and external crates (except devenv feature)
Programs must not depend on other programs without devenv feature
Files:
programs/compressed-token/program/tests/mint.rs
programs/**/tests/**/*.rs
📄 CodeRabbit inference engine (CLAUDE.md)
programs/**/tests/**/*.rs: Unit tests in programs must not depend on light-test-utils; tests requiring light-test-utils must be in program-tests
Integration tests for programs must be in program-tests, not in programs crates
Files:
programs/compressed-token/program/tests/mint.rs
programs/compressed-token/program/**/*.rs
📄 CodeRabbit inference engine (programs/compressed-token/program/CLAUDE.md)
programs/compressed-token/program/**/*.rs: When converting SPL Token operation errors from pinocchio token program processors, useconvert_pinocchio_token_errorto map error codes (0-18) to named ErrorCode variants
When handling errors from functions returning TokenError directly (e.g., unpack_amount_and_decimals), useconvert_token_errorto map SPL Token error codes (0-18) to named ErrorCode variants
When converting errors from system program operations, data access operations, or lamport transfers, useconvert_program_errorwhich adds a +6000 offset to raw error codes
Files:
programs/compressed-token/program/tests/mint.rs
🧠 Learnings (90)
📓 Common learnings
Learnt from: CR
Repo: Lightprotocol/distributor PR: 0
File: README.md:0-0
Timestamp: 2026-01-11T01:05:03.142Z
Learning: Applies to programs/merkle-distributor/src/**/*.rs : Use compressed accounts (compressed PDAs) instead of regular PDAs for ClaimStatus accounts in the Solana merkle-distributor program to reduce cost per claim (~0.00005 SOL vs ~0.002 SOL per claim)
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: account-comparison/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:01.412Z
Learning: Applies to account-comparison/programs/**/tests/test_compressed_account.rs : Include Light Protocol tests in test_compressed_account.rs to verify compressed account operations using LightAccount primitives
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: account-comparison/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:01.412Z
Learning: Applies to account-comparison/programs/**/src/**/*.rs : Use `LightAccount::new_init` for compressed account creation and `LightAccount::new_mut` for updates in Light Protocol implementations
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: airdrop-implementations/simple-claim/README.md:0-0
Timestamp: 2026-01-10T19:24:56.367Z
Learning: Applies to airdrop-implementations/simple-claim/**/*.rs : Tokens must be minted as compressed tokens to PDAs derived from `[claimant, mint, unlock_slot, bump]`
Learnt from: CR
Repo: Lightprotocol/distributor PR: 0
File: programs/merkle-distributor/CLAUDE.md:0-0
Timestamp: 2026-01-11T01:05:19.378Z
Learning: Applies to programs/merkle-distributor/**/state/*.rs : Use `LightDiscriminator` derive for compressed account state structs (e.g., ClaimStatus)
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: create-and-update/README.md:0-0
Timestamp: 2026-01-10T19:25:28.052Z
Learning: Applies to create-and-update/**/*.rs : Use `LightAccount::new_mut()` to update existing compressed accounts
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: create-and-update/README.md:0-0
Timestamp: 2026-01-10T19:25:28.052Z
Learning: Applies to create-and-update/**/*.rs : Use `LightAccount::new_init()` to create new compressed accounts
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/CONFIG_ACCOUNT.md:0-0
Timestamp: 2026-01-14T00:05:47.820Z
Learning: Applies to program-libs/compressible/docs/**/*.rs : CompressibleConfig PDA must be derived using seeds [b"compressible_config", version.to_le_bytes()] with the bump stored in the account's bump field
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2026-01-14T00:06:46.444Z
Learning: Applies to programs/compressed-token/program/src/compressed_token/mint_action/**/*.rs : MintAction instruction must support exactly 10 action types: CreateCompressedMint, MintTo, UpdateMintAuthority, UpdateFreezeAuthority, MintToCToken, UpdateMetadataField, UpdateMetadataAuthority, RemoveMetadataKey, DecompressMint, and CompressAndCloseCMint
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: counter/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:31.226Z
Learning: Applies to counter/**/{anchor,native,pinocchio}/src/**/*.rs : Compressed PDA address must be derived from seeds ["counter", signer] using derive_address() with the address_tree_pubkey and program_id parameters
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2026-01-14T00:06:46.444Z
Learning: Compressed mint accounts support only one extension: TokenMetadata
Learnt from: CR
Repo: Lightprotocol/distributor PR: 0
File: programs/merkle-distributor/CLAUDE.md:0-0
Timestamp: 2026-01-11T01:05:19.378Z
Learning: Applies to programs/merkle-distributor/**/instructions/{new_claim,claim_locked}.rs : ClaimStatus compressed account address is derived via `light_sdk::address::v2::derive_address` with `ADDRESS_TREE_V2` using seeds: `["ClaimStatus", claimant.key(), distributor.key()]`
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-tests/sdk-light-token-test/README.md:0-0
Timestamp: 2026-01-14T00:05:32.217Z
Learning: Implement all 8 compressed token instructions: 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/CLAUDE.md:0-0
Timestamp: 2026-01-12T14:27:56.326Z
Learning: Applies to programs/compressed-token/program/docs/compressed_token/{TRANSFER2,MINT_ACTION,FREEZE,THAW,CREATE_TOKEN_POOL,ADD_TOKEN_POOL}.md : Compressed token operations documentation should be organized in a compressed_token/ subdirectory with separate files for TRANSFER2.md (batch transfer with compress/decompress), MINT_ACTION.md (mint operations), FREEZE.md (freeze operations), THAW.md (thaw operations), CREATE_TOKEN_POOL.md (initial token pool creation), and ADD_TOKEN_POOL.md (additional token pools)
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-tests/sdk-light-token-test/README.md:0-0
Timestamp: 2026-01-14T00:05:32.217Z
Learning: Applies to sdk-tests/sdk-light-token-test/**/*.rs : Use the `invoke_signed()` method for PDA-signed CPI calls in compressed token operations
📚 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:
sdk-libs/token-sdk/src/token/decompress_mint.rs
📚 Learning: 2026-01-10T19:24:56.367Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: airdrop-implementations/simple-claim/README.md:0-0
Timestamp: 2026-01-10T19:24:56.367Z
Learning: Applies to airdrop-implementations/simple-claim/**/*.rs : Tokens must be minted as compressed tokens to PDAs derived from `[claimant, mint, unlock_slot, bump]`
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rsprograms/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-14T00:05:47.820Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/CONFIG_ACCOUNT.md:0-0
Timestamp: 2026-01-14T00:05:47.820Z
Learning: Applies to program-libs/compressible/docs/**/*.rs : CompressibleConfig PDA must be derived using seeds [b"compressible_config", version.to_le_bytes()] with the bump stored in the account's bump field
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rsprograms/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.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:
sdk-libs/token-sdk/src/token/decompress_mint.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:
sdk-libs/token-sdk/src/token/decompress_mint.rssdk-libs/token-sdk/src/token/create_mint.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:
sdk-libs/token-sdk/src/token/decompress_mint.rssdk-libs/token-sdk/src/token/create_mint.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/**/seed_providers.rs : PDA and CToken seed provider implementations with client-side seed functions should be in `seed_providers.rs`
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rs
📚 Learning: 2026-01-11T01:05:03.142Z
Learnt from: CR
Repo: Lightprotocol/distributor PR: 0
File: README.md:0-0
Timestamp: 2026-01-11T01:05:03.142Z
Learning: Applies to programs/merkle-distributor/src/**/*.rs : Use compressed accounts (compressed PDAs) instead of regular PDAs for ClaimStatus accounts in the Solana merkle-distributor program to reduce cost per claim (~0.00005 SOL vs ~0.002 SOL per claim)
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rsprograms/compressed-token/program/tests/mint.rs
📚 Learning: 2026-01-14T00:05:47.820Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/CONFIG_ACCOUNT.md:0-0
Timestamp: 2026-01-14T00:05:47.820Z
Learning: Applies to program-libs/compressible/docs/**/*.rs : CompressibleConfig account state layout must follow the defined structure with version (u16), state (u8), bump (u8), update_authority (Pubkey), withdrawal_authority (Pubkey), rent_sponsor (Pubkey), compression_authority (Pubkey), rent_sponsor_bump (u8), compression_authority_bump (u8), rent_config (RentConfig), address_space ([Pubkey; 4]), and _place_holder ([u8; 32]) fields
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rsprograms/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-10T19:26:10.578Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: airdrop-implementations/simple-claim/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:10.578Z
Learning: Applies to airdrop-implementations/simple-claim/program/src/processor.rs : Invoke light_ctoken_sdk::decompress via CPI to convert compressed tokens to SPL tokens in the Claim instruction processor
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rssdk-libs/token-sdk/src/token/create_mint.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_pda_seeds_with_bump` function to verify PDA with known bump seed using `create_program_address`, returning `InvalidSeeds` (20010) error on mismatch
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-10T19:26:10.578Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: airdrop-implementations/simple-claim/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:10.578Z
Learning: Applies to airdrop-implementations/simple-claim/program/src/processor.rs : Airdrop PDA must be derived using seeds: [claimant.to_bytes(), mint.to_bytes(), unlock_slot.to_le_bytes(), bump] via Pubkey::create_program_address
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rsprograms/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-10T19:26:31.226Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: counter/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:31.226Z
Learning: Applies to counter/**/{anchor,native,pinocchio}/src/**/*.rs : Compressed PDA address must be derived from seeds ["counter", signer] using derive_address() with the address_tree_pubkey and program_id parameters
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rsprograms/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2025-11-24T17:59:03.485Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/ACCOUNT_INFO_TRAIT.md:0-0
Timestamp: 2025-11-24T17:59:03.485Z
Learning: Applies to program-libs/account-checks/docs/**/*.rs : PDA derivation functions should accept `&[&[u8]]` for seeds and `&[u8; 32]` for program_id when using AccountInfoTrait methods `find_program_address()` or `create_program_address()`
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rs
📚 Learning: 2026-01-15T02:04:22.996Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: zk/nullifier/README.md:0-0
Timestamp: 2026-01-15T02:04:22.996Z
Learning: Applies to zk/nullifier/programs/nullifier/src/**/*.rs : Program must derive addresses and create compressed accounts via CPI to Light system program, which will reject if any address already exists
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rsprograms/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-15T02:04:22.996Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: zk/nullifier/README.md:0-0
Timestamp: 2026-01-15T02:04:22.996Z
Learning: Applies to zk/nullifier/programs/nullifier/src/**/*.rs : Consider using compressed PDAs instead of regular PDAs for nullifiers to reduce rent costs (~0.000015 SOL vs ~0.001 SOL per nullifier)
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.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_pda_seeds` function to derive PDA using `find_program_address` and verify it matches account key, returning `InvalidSeeds` (20010) error on mismatch
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rs
📚 Learning: 2025-11-24T17:59:03.485Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/ACCOUNT_INFO_TRAIT.md:0-0
Timestamp: 2025-11-24T17:59:03.485Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/account_info/{solana,pinocchio}.rs : Implement AccountInfoTrait with SDK-specific Pubkey types: `solana_pubkey::Pubkey` for solana-program feature and `[u8; 32]` raw bytes for pinocchio feature
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rs
📚 Learning: 2026-01-14T00:05:32.217Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-tests/sdk-light-token-test/README.md:0-0
Timestamp: 2026-01-14T00:05:32.217Z
Learning: Applies to sdk-tests/sdk-light-token-test/**/*.rs : Derive PDAs using `Pubkey::find_program_address()` before using them as authority/owner in `invoke_signed()` calls
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rsprograms/compressed-token/program/tests/mint.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:
sdk-libs/token-sdk/src/token/decompress_mint.rs
📚 Learning: 2025-11-24T18:00:21.501Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/docs/ERRORS.md:0-0
Timestamp: 2025-11-24T18:00:21.501Z
Learning: Applies to program-libs/compressible/docs/program-libs/compressible/src/error.rs : FailedBorrowRentSysvar (Error Code 19001): Ensure the rent sysvar is properly initialized in test environments and verify the sysvar is accessible for on-chain programs. Use `solana_program::rent::Rent::get()` with proper error handling for borrowing rent sysvar.
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.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:
sdk-libs/token-sdk/src/token/decompress_mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2025-11-24T17:56:20.711Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_ADDRESS_TREE.md:0-0
Timestamp: 2025-11-24T17:56:20.711Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/initialize_address_tree.rs : Verify merkle_tree_account balance is rent-exempt in `src/initialize_address_tree.rs`. Use `check_account_balance_is_rent_exempt` from `light-account-checks` library. Return error `AccountError::AccountNotRentExempt` (error code: 12011) if account balance is insufficient for rent exemption at calculated size.
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.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 : All AccountError variants must convert automatically to `ProgramError::Custom(u32)` for both solana-program and pinocchio SDKs using From trait implementations
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rs
📚 Learning: 2025-11-24T17:59:03.485Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/ACCOUNT_INFO_TRAIT.md:0-0
Timestamp: 2025-11-24T17:59:03.485Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/account_info/pinocchio.rs : Pinocchio AccountInfo implementations should use native on-chain implementations for PDA functions when available, with fallback to solana_pubkey off-chain
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rs
📚 Learning: 2026-01-10T19:26:10.578Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: airdrop-implementations/simple-claim/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:10.578Z
Learning: Applies to airdrop-implementations/simple-claim/program/src/instruction.rs : Include ClaimIxData structure with fields: proof (ValidityProof), packed_tree_info (PackedStateTreeInfo), amount (u64), lamports (Option<u64>), mint (Pubkey), unlock_slot (u64), and bump_seed (u8)
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-15T02:04:37.090Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: zk/zk-id/README.md:0-0
Timestamp: 2026-01-15T02:04:37.090Z
Learning: Applies to zk/zk-id/src/lib.rs : Create compressed accounts for issuer entities storing their pubkey and credential issuance counter in the create_issuer instruction
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rsprograms/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-11T01:05:19.378Z
Learnt from: CR
Repo: Lightprotocol/distributor PR: 0
File: programs/merkle-distributor/CLAUDE.md:0-0
Timestamp: 2026-01-11T01:05:19.378Z
Learning: Applies to programs/merkle-distributor/**/instructions/{new_claim,claim_locked}.rs : ClaimStatus compressed account address is derived via `light_sdk::address::v2::derive_address` with `ADDRESS_TREE_V2` using seeds: `["ClaimStatus", claimant.key(), distributor.key()]`
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rsprograms/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-14T00:06:46.444Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2026-01-14T00:06:46.444Z
Learning: Applies to programs/compressed-token/program/src/compressed_token/mint_action/**/*.rs : MintAction instruction must support exactly 10 action types: CreateCompressedMint, MintTo, UpdateMintAuthority, UpdateFreezeAuthority, MintToCToken, UpdateMetadataField, UpdateMetadataAuthority, RemoveMetadataKey, DecompressMint, and CompressAndCloseCMint
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rsprograms/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-11T01:05:19.378Z
Learnt from: CR
Repo: Lightprotocol/distributor PR: 0
File: programs/merkle-distributor/CLAUDE.md:0-0
Timestamp: 2026-01-11T01:05:19.378Z
Learning: Applies to programs/merkle-distributor/**/instructions/new_distributor.rs : MerkleDistributor PDA uses seeds: `["MerkleDistributor", mint.key(), version.to_le_bytes()]`
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rsprograms/compressed-token/program/tests/mint.rs
📚 Learning: 2026-01-15T02:04:58.086Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: zk/zk-id/CLAUDE.md:0-0
Timestamp: 2026-01-15T02:04:58.086Z
Learning: Applies to zk/zk-id/src/lib.rs : zk_verify_credential instruction must decompress G1/G2 points and verify Groth16 proof using Groth16Verifier
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-14T00:06:46.444Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2026-01-14T00:06:46.444Z
Learning: Applies to programs/compressed-token/program/src/compressed_token/transfer2/**/*.rs : Transfer2 instruction must perform sum checks when supporting multi-mint Compress, Decompress, and CompressAndClose operations
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rsprograms/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.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:
sdk-libs/token-sdk/src/token/decompress_mint.rsprograms/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-10T19:26:10.578Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: airdrop-implementations/simple-claim/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:10.578Z
Learning: Applies to airdrop-implementations/simple-claim/program/src/processor.rs : Validate that the derived PDA matches the provided airdrop_pda account in the Claim instruction
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.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: Wrapper instruction Account context must include: optional `registered_forester_pda` (mutable), `authority` signer, `cpi_authority` PDA with seeds, `registered_program_pda`, `account_compression_program`, `log_wrapper` for events, and `target_account` (mutable)
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rs
📚 Learning: 2026-01-14T00:06:11.915Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2026-01-14T00:06:11.915Z
Learning: Applies to program-libs/compressible/src/config.rs : Provide PDA derivation methods (`derive_pda`, `derive_v1_config_pda`) for CompressibleConfig account location
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.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 : Implement `process_new_operation()` function in wrapper module to handle PDA signer setup, account mapping, and CPI execution
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rssdk-libs/token-sdk/src/token/create_mint.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 : Set output queue account discriminator to b`queueacc` (8 bytes) and initialize queue metadata with QueueType::OutputStateV2
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rs
📚 Learning: 2026-01-14T00:06:11.915Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/compressible/CLAUDE.md:0-0
Timestamp: 2026-01-14T00:06:11.915Z
Learning: Applies to program-libs/compressible/src/config.rs : CompressibleConfig account structure must support multiple serialization features (Anchor, Pinocchio, Borsh) for program compatibility
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rsprograms/compressed-token/program/tests/mint.rs
📚 Learning: 2025-11-24T17:56:00.229Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/CLAUDE.md:0-0
Timestamp: 2025-11-24T17:56:00.229Z
Learning: Applies to program-libs/batched-merkle-tree/docs/**/initialize_state_tree.rs : State tree initialization must create two Solana accounts: BatchedMerkleTreeAccount with integrated input queue and separate BatchedQueueAccount
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.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 : Initialize an output queue account as `BatchedQueueAccount` with `QueueType::OutputStateV2`, temporary storage for compressed account hashes before tree insertion with immediate spending capability via proof-by-index, using discriminator b`queueacc` [113, 117, 101, 117, 101, 97, 99, 99]
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rs
📚 Learning: 2026-01-15T02:04:37.090Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: zk/zk-id/README.md:0-0
Timestamp: 2026-01-15T02:04:37.090Z
Learning: Applies to zk/zk-id/src/lib.rs : Use CpiAccounts::new() from light_sdk::cpi::v2 for account parameter handling
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-11T01:05:19.378Z
Learnt from: CR
Repo: Lightprotocol/distributor PR: 0
File: programs/merkle-distributor/CLAUDE.md:0-0
Timestamp: 2026-01-11T01:05:19.378Z
Learning: Applies to programs/merkle-distributor/**/instructions/{new_claim,claim_locked}.rs : Use Light SDK v2 CPI via `LightSystemProgramCpi::new_cpi` for compressed account interactions
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-10T19:26:48.012Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: read-only/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:48.012Z
Learning: Creates compressed accounts with derived addresses and validates them read-only via Light System Program CPI
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2025-11-24T17:59:03.485Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/ACCOUNT_INFO_TRAIT.md:0-0
Timestamp: 2025-11-24T17:59:03.485Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/account_info/test_account_info.rs : Create a test-only AccountInfo mock implementation without external dependencies for unit testing AccountInfoTrait implementations
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rs
📚 Learning: 2026-01-10T19:26:10.578Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: airdrop-implementations/simple-claim/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:10.578Z
Learning: Applies to airdrop-implementations/simple-claim/program/src/instruction.rs : Define ClaimAccounts structure with 16 account fields in order: claimant, fee_payer, associated_airdrop_pda, ctoken_cpi_authority_pda, light_system_program, registered_program_pda, noop_program, account_compression_authority, account_compression_program, ctoken_program, spl_interface_pda, decompress_destination, token_program, system_program, state_tree, and queue
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rsprograms/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.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 : Use generic `AccountInfoTrait` parameter for all account validation functions to enable compatibility with both Solana and Pinocchio runtimes
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rs
📚 Learning: 2025-11-24T17:59:03.485Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/ACCOUNT_INFO_TRAIT.md:0-0
Timestamp: 2025-11-24T17:59:03.485Z
Learning: Applies to program-libs/account-checks/docs/program-libs/account-checks/src/account_info/*.rs : AccountInfoTrait implementations must return `AccountError` from all fallible operations: `BorrowAccountDataFailed` (12009) for borrow failures, `InvalidSeeds` (12016) for PDA creation, and `FailedBorrowRentSysvar` (12014) for rent access
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rs
📚 Learning: 2026-01-15T02:04:37.090Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: zk/zk-id/README.md:0-0
Timestamp: 2026-01-15T02:04:37.090Z
Learning: Applies to zk/zk-id/src/lib.rs : Use system_accounts_offset parameter to locate system accounts in remaining accounts when using Light SDK V2
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rs
📚 Learning: 2026-01-15T02:04:37.090Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: zk/zk-id/README.md:0-0
Timestamp: 2026-01-15T02:04:37.090Z
Learning: Applies to zk/zk-id/src/lib.rs : Use sha::LightAccount for accounts with Vec fields (uses SHA256 flat hashing)
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.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 `account_info_init` function to initialize account with discriminator, handling `BorrowAccountDataFailed` (20003) and `AlreadyInitialized` (20006) errors
Applied to files:
sdk-libs/token-sdk/src/token/decompress_mint.rs
📚 Learning: 2026-01-10T19:26:01.412Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: account-comparison/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:01.412Z
Learning: Applies to account-comparison/programs/**/tests/test_compressed_account.rs : Include Light Protocol tests in test_compressed_account.rs to verify compressed account operations using LightAccount primitives
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2026-01-10T19:25:28.052Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: create-and-update/README.md:0-0
Timestamp: 2026-01-10T19:25:28.052Z
Learning: Applies to create-and-update/**/*.rs : Use `LightAccount::new_mut()` to update existing compressed accounts
Applied to files:
programs/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-11T01:05:19.378Z
Learnt from: CR
Repo: Lightprotocol/distributor PR: 0
File: programs/merkle-distributor/CLAUDE.md:0-0
Timestamp: 2026-01-11T01:05:19.378Z
Learning: Applies to programs/merkle-distributor/**/state/*.rs : Use `LightDiscriminator` derive for compressed account state structs (e.g., ClaimStatus)
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2026-01-10T19:26:38.625Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: create-and-update/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:38.625Z
Learning: Applies to create-and-update/**/programs/**/src/**/*.rs : Define compressed account state structs with 8-byte discriminators derived via `LightDiscriminator` hash of struct name
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2026-01-11T01:05:19.378Z
Learnt from: CR
Repo: Lightprotocol/distributor PR: 0
File: programs/merkle-distributor/CLAUDE.md:0-0
Timestamp: 2026-01-11T01:05:19.378Z
Learning: Applies to programs/merkle-distributor/**/state/claim_status.rs : ClaimStatus compressed accounts are serialized with 8-byte discriminator + 56 bytes data = 64 bytes total
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2026-01-10T19:26:01.412Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: account-comparison/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:01.412Z
Learning: Applies to account-comparison/programs/**/src/**/*.rs : Validate address tree identity by comparing `address_tree_pubkey.to_bytes()` against the constant `ADDRESS_TREE_V2` in `create_compressed_account` instruction
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2026-01-14T00:06:28.451Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-tests/CLAUDE.md:0-0
Timestamp: 2026-01-14T00:06:28.451Z
Learning: Account compression tests should verify Merkle tree management functionality in the core account compression program
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2025-11-24T17:57:53.312Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/TREE_ACCOUNT.md:0-0
Timestamp: 2025-11-24T17:57:53.312Z
Learning: Applies to program-libs/batched-merkle-tree/docs/**/*.rs : Account validation for address trees must check: (1) account ownership by Light account compression program, (2) account discriminator is `BatchMta`, and (3) tree type is `ADDRESS_MERKLE_TREE_TYPE_V2` (5)
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2026-01-10T19:26:48.012Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: read-only/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:48.012Z
Learning: Applies to read-only/**/*.rs : Validate address tree pubkey matches `ADDRESS_TREE_V2` constant in `create_compressed_account` instruction
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2026-01-10T19:26:21.240Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: basic-operations/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:21.240Z
Learning: Applies to basic-operations/**/{anchor,native}/**/src/**/*.rs : Validate that `address_tree_pubkey.to_bytes() == ADDRESS_TREE_V2` before processing account operations
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2025-11-24T17:57:53.312Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/TREE_ACCOUNT.md:0-0
Timestamp: 2025-11-24T17:57:53.312Z
Learning: Applies to program-libs/batched-merkle-tree/docs/**/*.rs : Account validation for state trees must check: (1) account ownership by Light account compression program, (2) account discriminator is `BatchMta`, and (3) tree type is `STATE_MERKLE_TREE_TYPE_V2` (4)
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2026-01-10T19:26:38.625Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: create-and-update/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:38.625Z
Learning: Applies to create-and-update/**/programs/**/src/**/*.rs : Create compressed accounts with derived addresses using `LightAccount::new_init()` method
Applied to files:
programs/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2025-11-24T17:56:00.229Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/CLAUDE.md:0-0
Timestamp: 2025-11-24T17:56:00.229Z
Learning: Applies to program-libs/batched-merkle-tree/docs/**/*.rs : Use constants from constants.rs including ADDRESS_TREE_INIT_ROOT_40 generated from IndexedMerkleTree reference implementation
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2025-11-24T17:56:00.229Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/CLAUDE.md:0-0
Timestamp: 2025-11-24T17:56:00.229Z
Learning: Applies to program-libs/batched-merkle-tree/docs/**/Cargo.toml : Depend on light-compressed-account crate for compressed account types and utilities
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2026-01-14T00:06:46.444Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2026-01-14T00:06:46.444Z
Learning: Compressed mint accounts support only one extension: TokenMetadata
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2025-11-24T17:56:20.711Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_ADDRESS_TREE.md:0-0
Timestamp: 2025-11-24T17:56:20.711Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/initialize_address_tree.rs : Set discriminator to `BatchMta` `[66, 97, 116, 99, 104, 77, 116, 97]` (8 bytes) for BatchedMerkleTreeAccount in `src/initialize_address_tree.rs`.
Applied to files:
programs/compressed-token/program/tests/mint.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 access control parameters: program_owner (Option<Pubkey>), forester (Option<Pubkey>) for non-Light foresters, and owner (Pubkey passed as function parameter)
Applied to files:
programs/compressed-token/program/tests/mint.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 : Compute and store hashed pubkeys by hashing and truncating to 31 bytes for bn254 field compatibility in both queue and tree accounts
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2025-11-24T17:56:20.711Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_ADDRESS_TREE.md:0-0
Timestamp: 2025-11-24T17:56:20.711Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/initialize_address_tree.rs : Compute hashed_pubkey in `src/initialize_address_tree.rs` by hashing and truncating the owner pubkey to 31 bytes for bn254 field compatibility.
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2025-11-24T17:56:20.711Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_ADDRESS_TREE.md:0-0
Timestamp: 2025-11-24T17:56:20.711Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/initialize_address_tree.rs : `InitAddressTreeAccountsInstructionData` struct in `src/initialize_address_tree.rs` must include: height (u32, default 40), index (u64), root_history_capacity (u32, default 200), input_queue_batch_size (u64, default 15,000), input_queue_zkp_batch_size (u64, default 250), bloom_filter_capacity (u64, default batch_size * 8), bloom_filter_num_iters (u64, default 3 for test/10 for production), program_owner (Option<Pubkey>), forester (Option<Pubkey>), rollover_threshold (Option<u64>, default 95%), network_fee (Option<u64>, default 10,000 lamports), and close_threshold (Option<u64>).
Applied to files:
programs/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-15T02:04:37.090Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: zk/zk-id/README.md:0-0
Timestamp: 2026-01-15T02:04:37.090Z
Learning: Applies to zk/zk-id/src/lib.rs : Use into_new_address_params_assigned_packed(seed, Some(index)) for address parameter construction in Light SDK V2
Applied to files:
programs/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-10T19:26:48.012Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: read-only/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:48.012Z
Learning: Applies to read-only/**/*.rs : Derive compressed account addresses using seed pattern `["first", signer.key()]` via `derive_address()` with address tree and program ID
Applied to files:
programs/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2025-11-24T17:56:20.711Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/batched-merkle-tree/docs/INITIALIZE_ADDRESS_TREE.md:0-0
Timestamp: 2025-11-24T17:56:20.711Z
Learning: Applies to program-libs/batched-merkle-tree/docs/src/initialize_address_tree.rs : Initialize address tree with integrated address queue in `src/initialize_address_tree.rs`. Creates one `BatchedMerkleTreeAccount` with account layout defined in `src/merkle_tree.rs`, metadata in `src/merkle_tree_metadata.rs`, tree type `TreeType::AddressV2` (5), initial root `ADDRESS_TREE_INIT_ROOT_40`, starts at next_index 1, and discriminator `BatchMta` (8 bytes).
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2026-01-10T19:25:28.052Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: create-and-update/README.md:0-0
Timestamp: 2026-01-10T19:25:28.052Z
Learning: Applies to create-and-update/**/*.rs : Use deterministic seeds (e.g., `FIRST_SEED`, `SECOND_SEED`) for compressed account address derivation
Applied to files:
programs/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-10T19:26:21.240Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: basic-operations/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:21.240Z
Learning: Applies to basic-operations/**/{anchor,native}/**/src/**/*.rs : Derive addresses from seeds `[b"message", signer.key.as_ref()]` combined with `ADDRESS_TREE_V2` and program ID
Applied to files:
programs/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-15T02:04:58.086Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: zk/zk-id/CLAUDE.md:0-0
Timestamp: 2026-01-15T02:04:58.086Z
Learning: Applies to zk/zk-id/src/lib.rs : IssuerAccount address must derive using derive_address() with seeds [b"issuer", signer_pubkey] and ADDRESS_TREE_V2
Applied to files:
programs/compressed-token/program/tests/mint.rssdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-15T02:04:37.090Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: zk/zk-id/README.md:0-0
Timestamp: 2026-01-15T02:04:37.090Z
Learning: Applies to zk/zk-id/src/lib.rs : Issue credentials by creating compressed accounts binding a user's pubkey to an issuer and incrementing the issuer's credential counter in the add_credential instruction
Applied to files:
programs/compressed-token/program/tests/mint.rs
📚 Learning: 2026-01-14T00:05:32.217Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-tests/sdk-light-token-test/README.md:0-0
Timestamp: 2026-01-14T00:05:32.217Z
Learning: Applies to sdk-tests/sdk-light-token-test/**/*.rs : Use the builder pattern from `light-token-sdk::ctoken` module for CPI operations instead of manual instruction building
Applied to files:
sdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2025-11-24T17:59:13.714Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: program-libs/account-checks/docs/ACCOUNT_ITERATOR.md:0-0
Timestamp: 2025-11-24T17:59:13.714Z
Learning: Applies to program-libs/account-checks/docs/**/*.rs : Use descriptive account names when calling AccountIterator methods (e.g., `iter.next_account("token_mint")` instead of `iter.next_account("account_3")`)
Applied to files:
sdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-14T00:06:46.444Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/CLAUDE.md:0-0
Timestamp: 2026-01-14T00:06:46.444Z
Learning: Applies to programs/compressed-token/program/src/ctoken/*.rs : CToken operations must validate that the CompressibleConfig state is ACTIVE only for CreateTokenAccount, CreateAssociatedTokenAccount, and CreateAssociatedTokenAccountIdempotent instructions
Applied to files:
sdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-14T00:05:32.217Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: sdk-tests/sdk-light-token-test/README.md:0-0
Timestamp: 2026-01-14T00:05:32.217Z
Learning: Implement all 8 compressed token instructions: 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:
sdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2025-11-24T17:54:33.614Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/anchor/README.md:0-0
Timestamp: 2025-11-24T17:54:33.614Z
Learning: Implement the Compressed Token Program interface for creating and using compressed tokens on Solana with ZK Compression
Applied to files:
sdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2025-11-24T17:54:38.537Z
Learnt from: CR
Repo: Lightprotocol/light-protocol PR: 0
File: programs/compressed-token/program/README.md:0-0
Timestamp: 2025-11-24T17:54:38.537Z
Learning: Implement compressed token program interfaces for third-party token creation and usage on Solana using ZK Compression
Applied to files:
sdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-10T19:26:38.625Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: create-and-update/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:38.625Z
Learning: Applies to create-and-update/**/programs/**/src/**/*.rs : Derive addresses from seeds using format `[seed, signer.key()]` with program ID and address tree
Applied to files:
sdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-10T19:26:48.012Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: read-only/CLAUDE.md:0-0
Timestamp: 2026-01-10T19:26:48.012Z
Learning: Applies to read-only/**/*.rs : Include `proof: ValidityProof` and `address_tree_info: PackedAddressTreeInfo` parameters for account creation instructions
Applied to files:
sdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-10T19:25:33.379Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: read-only/README.md:0-0
Timestamp: 2026-01-10T19:25:33.379Z
Learning: Applies to read-only/**/*.rs : Mark fields with `#[hash]` attribute when they should be included in validity proofs for compressed accounts
Applied to files:
sdk-libs/token-sdk/src/token/create_mint.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:
sdk-libs/token-sdk/src/token/create_mint.rs
📚 Learning: 2026-01-10T19:25:28.052Z
Learnt from: CR
Repo: Lightprotocol/program-examples PR: 0
File: create-and-update/README.md:0-0
Timestamp: 2026-01-10T19:25:28.052Z
Learning: Applies to create-and-update/**/*.rs : Use `LightAccount::new_init()` to create new compressed accounts
Applied to files:
sdk-libs/token-sdk/src/token/create_mint.rs
🧬 Code graph analysis (2)
programs/compressed-token/program/tests/mint.rs (1)
program-libs/compressed-account/src/pubkey.rs (1)
new_from_array(79-81)
sdk-libs/token-sdk/src/token/create_mint.rs (1)
sdk-libs/token-client/src/actions/mint_action.rs (1)
mint_action(27-62)
⏰ 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). (11)
- GitHub Check: Forester e2e test
- GitHub Check: programs (system-cpi-test, ["cargo-test-sbf -p system-cpi-test", "cargo test -p light-system-prog...
- GitHub Check: lint
- GitHub Check: programs (light-system-program-address, ["cargo-test-sbf -p system-test -- test_with_address", "c...
- GitHub Check: programs (account-compression-and-registry, ["cargo-test-sbf -p account-compression-test", "cargo...
- GitHub Check: programs (system-cpi-test-v2-functional-read-only, ["cargo-test-sbf -p system-cpi-v2-test -- func...
- GitHub Check: programs (system-cpi-test-v2-functional-account-infos, ["cargo-test-sbf -p system-cpi-v2-test -- ...
- GitHub Check: Test batched-merkle-tree-simulate
- GitHub Check: programs (compressed-token-and-e2e, ["cargo test -p light-compressed-token", "cargo-test-sbf -p c...
- GitHub Check: Test program-libs-slow
- GitHub Check: Test program-libs-fast
✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.
13e7621 to
3630511
Compare
3630511 to
f6ee6e2
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@sdk-libs/token-sdk/src/token/create_mint.rs`:
- Around line 110-120: In instruction(), before building
CompressedMintInstructionData, validate that the PDA derived from
mint_seed_pubkey (using the same seed derivation logic your program uses)
matches params.mint and that the derived bump equals params.bump; if they don’t
match, return an early Err (e.g., ProgramError::InvalidArgument or a more
specific program error) to fail fast and avoid emitting inconsistent metadata
(check the symbols instruction(), CompressedMintInstructionData, params.mint,
params.bump, and mint_seed_pubkey to locate where to insert the guard).
| pub fn instruction(self) -> Result<Instruction, ProgramError> { | ||
| let compression_address = self.params.compression_address; | ||
|
|
||
| let compressed_mint_instruction_data = CompressedMintInstructionData { | ||
| supply: 0, | ||
| decimals: self.params.decimals, | ||
| metadata: light_token_interface::state::CompressedMintMetadata { | ||
| version: 3, | ||
| mint: self.params.mint.to_bytes().into(), | ||
| cmint_decompressed: false, | ||
| compressed_address: compression_address, | ||
| mint_signer: self.mint_seed_pubkey.to_bytes(), | ||
| bump: self.params.bump, | ||
| }, |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Fail fast if mint/bump don’t match mint_seed_pubkey.
Now that metadata stores mint_signer + bump, a mismatch between params.mint/params.bump and the PDA derived from mint_seed_pubkey will silently create inconsistent metadata and likely fail on-chain. Consider validating early.
✅ Suggested guard
pub fn instruction(self) -> Result<Instruction, ProgramError> {
+ let (derived_mint, derived_bump) = find_mint_address(&self.mint_seed_pubkey);
+ if derived_mint != self.params.mint || derived_bump != self.params.bump {
+ return Err(ProgramError::InvalidArgument);
+ }
let compressed_mint_instruction_data = CompressedMintInstructionData {
supply: 0,
decimals: self.params.decimals,
metadata: light_token_interface::state::CompressedMintMetadata {🤖 Prompt for AI Agents
In `@sdk-libs/token-sdk/src/token/create_mint.rs` around lines 110 - 120, In
instruction(), before building CompressedMintInstructionData, validate that the
PDA derived from mint_seed_pubkey (using the same seed derivation logic your
program uses) matches params.mint and that the derived bump equals params.bump;
if they don’t match, return an early Err (e.g., ProgramError::InvalidArgument or
a more specific program error) to fail fast and avoid emitting inconsistent
metadata (check the symbols instruction(), CompressedMintInstructionData,
params.mint, params.bump, and mint_seed_pubkey to locate where to insert the
guard).
Summary by CodeRabbit
Bug Fixes
Refactor
Documentation
✏️ Tip: You can customize this high-level summary in your review settings.