From 9a9ac1f0dfb01f9345d12bb86da87a451f642636 Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Fri, 22 Aug 2025 13:02:18 -0400 Subject: [PATCH 01/20] add ctoken program to token_interface --- spl/src/token_interface.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/spl/src/token_interface.rs b/spl/src/token_interface.rs index 6e6047cd4e..ab9767c1da 100644 --- a/spl/src/token_interface.rs +++ b/spl/src/token_interface.rs @@ -9,7 +9,12 @@ pub use crate::token_2022::*; #[cfg(feature = "token_2022_extensions")] pub use crate::token_2022_extensions::*; -static IDS: [Pubkey; 2] = [spl_token::ID, spl_token_2022::ID]; +pub const COMPRESSED_TOKEN_ID: Pubkey = Pubkey::new_from_array([ + 9, 21, 163, 87, 35, 121, 78, 143, 182, 93, 7, 91, 107, 114, 105, 156, 56, 221, 2, 229, 148, + 139, 117, 176, 229, 160, 65, 142, 128, 151, 91, 68, +]); + +static IDS: [Pubkey; 3] = [spl_token::ID, spl_token_2022::ID, COMPRESSED_TOKEN_ID]; #[derive(Clone, Debug, Default, PartialEq, Copy)] pub struct TokenAccount(spl_token_2022::state::Account); From d8a2b3d99d61ef900d1f6cdaabcef14eb9af6279 Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Fri, 22 Aug 2025 13:10:33 -0400 Subject: [PATCH 02/20] use external anchor dep in anchor-spl --- spl/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spl/Cargo.toml b/spl/Cargo.toml index 8c5ec66baf..766ad13a5f 100644 --- a/spl/Cargo.toml +++ b/spl/Cargo.toml @@ -26,7 +26,7 @@ token_2022 = ["spl-token-2022"] token_2022_extensions = ["spl-token-2022", "spl-token-group-interface", "spl-token-metadata-interface", "spl-pod"] [dependencies] -anchor-lang = { path = "../lang", version = "0.31.1", features = ["derive"] } +anchor-lang = { version = "0.31.1", features = ["derive"] } borsh = { version = "0.10.3", optional = true } mpl-token-metadata = { version = "5", optional = true } spl-associated-token-account = { version = "6", features = ["no-entrypoint"], optional = true } From 2d8ad8d93dc757fc0bca3e435f93c55b47e4e808 Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Fri, 26 Sep 2025 13:15:03 -0400 Subject: [PATCH 03/20] wip --- COMPRESSED_EXAMPLE.md | 291 + COMPRESSION_MODES.md | 202 + Cargo.lock | 5704 +++++++++++++---- lang/Cargo.toml | 24 + lang/src/accounts/cmint.rs | 99 + lang/src/accounts/mod.rs | 4 + lang/src/compressed_mint.rs | 337 + lang/src/lib.rs | 35 +- lang/syn/src/codegen/accounts/constraints.rs | 201 +- lang/syn/src/codegen/accounts/exit.rs | 371 ++ lang/syn/src/codegen/accounts/try_accounts.rs | 65 +- lang/syn/src/codegen/program/handlers.rs | 3 +- lang/syn/src/lib.rs | 77 + lang/syn/src/parser/accounts/constraints.rs | 225 +- lang/syn/src/parser/accounts/mod.rs | 15 + 15 files changed, 6267 insertions(+), 1386 deletions(-) create mode 100644 COMPRESSED_EXAMPLE.md create mode 100644 COMPRESSION_MODES.md create mode 100644 lang/src/accounts/cmint.rs create mode 100644 lang/src/compressed_mint.rs diff --git a/COMPRESSED_EXAMPLE.md b/COMPRESSED_EXAMPLE.md new file mode 100644 index 0000000000..912da691c2 --- /dev/null +++ b/COMPRESSED_EXAMPLE.md @@ -0,0 +1,291 @@ +# Complete Anchor Compressed Implementation Example + +## Updated Caller Program with Compressed Support + +```rust +use anchor_lang::prelude::*; + +#[derive(Accounts)] +pub struct Initialize<'info> { + /// Address paying to create the pool + #[account(mut)] + pub creator: Signer<'info>, + + /// AMM config + pub amm_config: Box>, + + /// Pool authority + #[account( + seeds = [crate::AUTH_SEED.as_bytes()], + bump, + )] + pub authority: UncheckedAccount<'info>, + + /// Pool state - COMPRESSIBLE (index 0) + #[account( + init, + compressible, // ← Makes this account compressible + seeds = [ + POOL_SEED.as_bytes(), + amm_config.key().as_ref(), + token_0_mint.key().as_ref(), + token_1_mint.key().as_ref(), + ], + bump, + payer = creator, + space = PoolState::INIT_SPACE + )] + pub pool_state: Box>, + + /// Token mints... + #[account(mint::token_program = token_0_program)] + pub token_0_mint: Box>, + + #[account(mint::token_program = token_1_program)] + pub token_1_mint: Box>, + + /// LP mint signer PDA + #[account( + seeds = [POOL_LP_MINT_SEED.as_bytes(), pool_state.key().as_ref()], + bump, + )] + pub lp_mint_signer: UncheckedAccount<'info>, + + /// Compressed LP mint (index 2, after CPDAs) + #[account( + cmint::authority = authority, + cmint::decimals = 9, + cmint::mint_signer_seeds = [POOL_LP_MINT_SEED.as_bytes(), pool_state.key().as_ref()], + cmint::mint_signer_bump, + cmint::program_authority_seeds = [crate::AUTH_SEED.as_bytes()], + cmint::program_authority_bump + )] + pub lp_mint: CMint<'info>, + + // Token accounts... + #[account(mut)] + pub creator_token_0: Box>, + + #[account(mut)] + pub creator_token_1: Box>, + + #[account(mut)] + pub creator_lp_token: UncheckedAccount<'info>, + + #[account(mut, seeds = [POOL_VAULT_SEED.as_bytes(), lp_mint.key().as_ref()], bump)] + pub lp_vault: UncheckedAccount<'info>, + + // Token vaults... + #[account(mut, seeds = [POOL_VAULT_SEED.as_bytes(), pool_state.key().as_ref(), token_0_mint.key().as_ref()], bump)] + pub token_0_vault: UncheckedAccount<'info>, + + #[account(mut, seeds = [POOL_VAULT_SEED.as_bytes(), pool_state.key().as_ref(), token_1_mint.key().as_ref()], bump)] + pub token_1_vault: UncheckedAccount<'info>, + + /// Observation state - COMPRESSIBLE (index 1) + #[account( + init, + compressible, // ← Makes this account compressible + seeds = [ + OBSERVATION_SEED.as_bytes(), + pool_state.key().as_ref(), + ], + bump, + payer = creator, + space = ObservationState::INIT_SPACE + )] + pub observation_state: Box>, + + // Standard programs... + pub token_program: Program<'info, Token>, + pub token_0_program: Interface<'info, TokenInterface>, + pub token_1_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, + pub rent: Sysvar<'info, Rent>, + + // Compression-specific accounts (required by name convention) + /// CHECK: Compression config + pub compression_config: AccountInfo<'info>, + + /// CHECK: Rent recipient + #[account(mut)] + pub rent_recipient: AccountInfo<'info>, + + /// CHECK: Compressed token program CPI authority + pub compressed_token_program_cpi_authority: AccountInfo<'info>, + + /// CHECK: Compressed token program + pub compressed_token_program: AccountInfo<'info>, + + // ... other compression accounts ... +} + +pub fn initialize<'info>( + ctx: Context<'_, '_, '_, 'info, Initialize<'info>>, + init_amount_0: u64, + init_amount_1: u64, + open_time: u64, + compression_params: InitializeCompressionParams, +) -> Result<()> { + // Your normal initialization logic + let pool_state = &mut ctx.accounts.pool_state; + let observation_state = &mut ctx.accounts.observation_state; + + pool_state.initialize(/* ... */); + observation_state.pool_id = pool_state.key(); + + // Transfer initial liquidity + transfer_from_user_to_pool_vault(/* ... */)?; + + // Queue mint actions for compressed mint + let user_lp_amount = calculate_user_lp(/* ... */); + let vault_lp_amount = calculate_vault_lp(/* ... */); + + ctx.accounts.lp_mint.mint_to(&ctx.accounts.creator_lp_token.key(), user_lp_amount)?; + ctx.accounts.lp_mint.mint_to(&ctx.accounts.lp_vault.key(), vault_lp_amount)?; + + // Close accounts to trigger compression + pool_state.close(ctx.accounts.rent_recipient.clone())?; + observation_state.close(ctx.accounts.rent_recipient.clone())?; + + Ok(()) +} + +#[derive(AnchorSerialize, AnchorDeserialize)] +pub struct InitializeCompressionParams { + pub pool_address_tree_info: PackedAddressTreeInfo, + pub observation_address_tree_info: PackedAddressTreeInfo, + pub lp_mint_address_tree_info: PackedAddressTreeInfo, + pub lp_mint_bump: u8, + pub creator_lp_token_bump: u8, + pub proof: ValidityProof, + pub output_state_tree_index: u8, +} +``` + +## What Anchor Does Behind the Scenes + +### 1. Scans for Compressible Accounts + +- Detects `pool_state` with `init, compressible` → index 0 +- Detects `observation_state` with `init, compressible` → index 1 +- Detects `lp_mint: CMint` → index 2 (always last) + +### 2. Generates Batched Compression Logic + +```rust +// Auto-generated in AccountsFinalize implementation +{ + // Build CPI accounts + let cpi_accounts = CpiAccountsSmall::new_with_config( + &self.creator, + _remaining, + CpiAccountsConfig::new_with_cpi_context(crate::LIGHT_CPI_SIGNER), + ); + + // Load compression config + let compression_config = CompressibleConfig::load_checked(&self.compression_config, &crate::ID)?; + + // Parse compression params from ix_data + let compression_params = /* deserialize from ix_data */; + + // Collect ALL compressible accounts + let mut all_compressed_infos = Vec::new(); + + // Process pool_state (index 0) + let pool_new_address_params = compression_params.pool_address_tree_info + .into_new_address_params_assigned_packed( + self.pool_state.key().to_bytes(), + true, + Some(0), + ); + + let pool_compressed_address = derive_address(/* ... */); + + let pool_compressed_infos = prepare_accounts_for_compression_on_init::( + &[&*self.pool_state], + &[pool_compressed_address], + &[pool_new_address_params], + &[compression_params.output_state_tree_index], + &cpi_accounts, + &address_space, + &self.rent_recipient, + )?; + all_compressed_infos.extend(pool_compressed_infos); + + // Process observation_state (index 1) + let observation_new_address_params = compression_params.observation_address_tree_info + .into_new_address_params_assigned_packed( + self.observation_state.key().to_bytes(), + true, + Some(1), + ); + + let observation_compressed_address = derive_address(/* ... */); + + let observation_compressed_infos = prepare_accounts_for_compression_on_init::( + &[&*self.observation_state], + &[observation_compressed_address], + &[observation_new_address_params], + &[compression_params.output_state_tree_index], + &cpi_accounts, + &address_space, + &self.rent_recipient, + )?; + all_compressed_infos.extend(observation_compressed_infos); + + // ONE batched system CPI for ALL CPDAs + let cpi_inputs = CpiInputs::new_first_cpi( + all_compressed_infos, + vec![pool_new_address_params, observation_new_address_params], + ); + + let cpi_context = cpi_accounts.cpi_context().unwrap(); + let cpi_context_accounts = CpiContextWriteAccounts { + fee_payer: cpi_accounts.fee_payer(), + authority: cpi_accounts.authority().unwrap(), + cpi_context, + cpi_signer: crate::LIGHT_CPI_SIGNER, + }; + cpi_inputs.invoke_light_system_program_cpi_context(cpi_context_accounts)?; + + // Then chain CMint creation as last CPI + let mint_actions = self.lp_mint.take_actions(); + if !mint_actions.is_empty() { + // Create mint and execute mint_to actions + // Using last_cpi_create_mint with index 2 + // ... (mint creation logic) + } +} +``` + +## Key Benefits + +1. **Clean Syntax**: Just add `compressible` to any `Account` with `init` +2. **Automatic Batching**: All CPDAs collected and compressed in ONE system CPI +3. **Proper Ordering**: CPDAs first (indices 0, 1, ...), CMint always last +4. **Context Chaining**: CPI context properly carried through to CMint +5. **Generic**: Works for 1-N compressible accounts +6. **Orthodox**: Uses standard Anchor patterns, no new types needed + +## Migration from Manual + +Before (Manual): + +```rust +compress_pool_and_observation_pdas(&cpi_accounts, &pool_state, &observation_state, ...)?; +create_and_mint_lp(...)?; +pool_state.close(rent_recipient)?; +observation_state.close(rent_recipient)?; +``` + +After (Anchor): + +```rust +// Just mark accounts as compressible and queue mint actions +// Anchor handles ALL compression logic automatically! +ctx.accounts.lp_mint.mint_to(&recipient, amount)?; +pool_state.close(rent_recipient)?; +observation_state.close(rent_recipient)?; +``` diff --git a/COMPRESSION_MODES.md b/COMPRESSION_MODES.md new file mode 100644 index 0000000000..2749d5f514 --- /dev/null +++ b/COMPRESSION_MODES.md @@ -0,0 +1,202 @@ +# Anchor Compression Modes for PDAs + +## Two Compression Modes + +### 1. `compress_on_init` - Immediate Compression with Auto-Close + +```rust +#[derive(Accounts)] +pub struct Initialize<'info> { + /// Pool state - will be compressed immediately and auto-closed + #[account( + init, + compress_on_init, // ← Compress immediately + auto-close + seeds = [/* ... */], + bump, + payer = creator, + space = PoolState::INIT_SPACE + )] + pub pool_state: Box>, + + /// Observation state - also compressed immediately + #[account( + init, + compress_on_init, // ← Compress immediately + auto-close + seeds = [/* ... */], + bump, + payer = creator, + space = ObservationState::INIT_SPACE + )] + pub observation_state: Box>, + + // Required compression accounts (by name convention) + pub compression_config: AccountInfo<'info>, + #[account(mut)] + pub rent_recipient: AccountInfo<'info>, + // ... other compression accounts +} + +pub fn initialize(ctx: Context, params: CompressionParams) -> Result<()> { + // Your logic here... + + // NO NEED to manually call .close() - Anchor auto-closes at end! + // pool_state.close() and observation_state.close() are called automatically + + Ok(()) +} +``` + +**What Anchor Does:** + +1. Calls `prepare_accounts_for_compression_on_init` for each account +2. Batches ALL accounts into ONE `invoke_light_system_program_cpi_context` +3. **Automatically calls `.close()` on each account at the end** + +### 2. `compressible` - Prepare for Future Compression (No Auto-Close) + +```rust +#[derive(Accounts)] +pub struct Initialize<'info> { + /// Pool state - prepared for compression but NOT auto-closed + #[account( + init, + compressible, // ← Prepare for future compression, no auto-close + seeds = [/* ... */], + bump, + payer = creator, + space = PoolState::INIT_SPACE + )] + pub pool_state: Box>, + + /// Observation state - also prepared but not auto-closed + #[account( + init, + compressible, // ← Prepare for future compression, no auto-close + seeds = [/* ... */], + bump, + payer = creator, + space = ObservationState::INIT_SPACE + )] + pub observation_state: Box>, + + // Same compression accounts required + pub compression_config: AccountInfo<'info>, + #[account(mut)] + pub rent_recipient: AccountInfo<'info>, + // ... +} + +pub fn initialize(ctx: Context, params: CompressionParams) -> Result<()> { + // Your logic here... + + // Accounts are prepared for compression but NOT closed + // You can compress them later in another instruction + + Ok(()) +} +``` + +**What Anchor Does:** + +1. Calls `prepare_accounts_for_empty_compression_on_init` for each account (currently unimplemented) +2. Batches ALL accounts into ONE system CPI +3. **Does NOT call `.close()` - accounts remain active** + +## Important Rules + +### ✅ Valid: All accounts use the same mode + +```rust +// All compress_on_init - OK +#[account(init, compress_on_init)] +pub pool_state: Account<'info, PoolState>, + +#[account(init, compress_on_init)] +pub observation_state: Account<'info, ObservationState>, +``` + +```rust +// All compressible - OK +#[account(init, compressible)] +pub pool_state: Account<'info, PoolState>, + +#[account(init, compressible)] +pub observation_state: Account<'info, ObservationState>, +``` + +### ❌ Invalid: Mixed modes (compile error) + +```rust +// ERROR: Cannot mix modes! +#[account(init, compress_on_init)] +pub pool_state: Account<'info, PoolState>, + +#[account(init, compressible)] // ← Different mode = ERROR +pub observation_state: Account<'info, ObservationState>, +``` + +## Combined with CMint + +Both modes work with CMint: + +```rust +#[derive(Accounts)] +pub struct Initialize<'info> { + // CPDAs with compress_on_init (auto-close) + #[account(init, compress_on_init)] + pub pool_state: Box>, + + #[account(init, compress_on_init)] + pub observation_state: Box>, + + // Compressed mint + #[account( + cmint::authority = authority, + cmint::decimals = 9, + // ... other cmint constraints + )] + pub lp_mint: CMint<'info>, + + // ... other accounts +} +``` + +**Execution Order:** + +1. All CPDAs compressed first (indices 0, 1, ...) +2. CMint created last (index N) +3. Single batched `invoke_signed` for everything +4. If `compress_on_init`: auto-close CPDAs + +## Migration Path + +### From Manual Compression + +```rust +// Before (Manual): +compress_pool_and_observation_pdas(&cpi_accounts, &pool_state, &observation_state, ...)?; +create_and_mint_lp(...)?; +pool_state.close(rent_recipient)?; +observation_state.close(rent_recipient)?; +``` + +### To Anchor Compression + +```rust +// After (Anchor with compress_on_init): +// Just mark accounts and let Anchor handle everything! +#[account(init, compress_on_init)] +pub pool_state: Box>, + +// In handler: +ctx.accounts.lp_mint.mint_to(&recipient, amount)?; +// That's it! Compression and close happen automatically +``` + +## Current Status + +- ✅ `compress_on_init`: Fully implemented with auto-close +- ⚠️ `compressible`: Structure in place, but `prepare_accounts_for_empty_compression_on_init` throws `unimplemented!()` +- ✅ Error checking: Cannot mix modes +- ✅ Works with CMint in both modes +- ✅ Proper batching and CPI context chaining diff --git a/Cargo.lock b/Cargo.lock index 4e9749a844..b9306bb57b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -63,6 +63,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "agave-feature-set" +version = "2.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98b7122392ed81e9b4569c3c960a557afb9f735719e0bcc9b2c19d0345568f5f" +dependencies = [ + "ahash", + "solana-epoch-schedule 2.2.1", + "solana-hash 2.3.0", + "solana-pubkey 2.4.0", + "solana-sha256-hasher 2.3.0", + "solana-svm-feature-set", +] + [[package]] name = "ahash" version = "0.8.11" @@ -73,7 +87,7 @@ dependencies = [ "getrandom 0.2.10", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.32", ] [[package]] @@ -85,6 +99,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-sized" +version = "1.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -100,11 +123,40 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "anchor-attribute-access-control" +version = "0.31.1" +dependencies = [ + "anchor-syn 0.31.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "anchor-attribute-access-control" version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f70fd141a4d18adf11253026b32504f885447048c7494faf5fa83b01af9c0cf" +dependencies = [ + "anchor-syn 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-account" +version = "0.31.1" dependencies = [ - "anchor-syn", + "anchor-syn 0.31.1", + "bs58", "proc-macro2", "quote", "syn 1.0.109", @@ -113,8 +165,10 @@ dependencies = [ [[package]] name = "anchor-attribute-account" version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "715a261c57c7679581e06f07a74fa2af874ac30f86bd8ea07cca4a7e5388a064" dependencies = [ - "anchor-syn", + "anchor-syn 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", "bs58", "proc-macro2", "quote", @@ -125,7 +179,27 @@ dependencies = [ name = "anchor-attribute-constant" version = "0.31.1" dependencies = [ - "anchor-syn", + "anchor-syn 0.31.1", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-constant" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "730d6df8ae120321c5c25e0779e61789e4b70dc8297102248902022f286102e4" +dependencies = [ + "anchor-syn 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-error" +version = "0.31.1" +dependencies = [ + "anchor-syn 0.31.1", "quote", "syn 1.0.109", ] @@ -133,8 +207,20 @@ dependencies = [ [[package]] name = "anchor-attribute-error" version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27e6e449cc3a37b2880b74dcafb8e5a17b954c0e58e376432d7adc646fb333ef" +dependencies = [ + "anchor-syn 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-event" +version = "0.31.1" dependencies = [ - "anchor-syn", + "anchor-syn 0.31.1", + "proc-macro2", "quote", "syn 1.0.109", ] @@ -142,19 +228,38 @@ dependencies = [ [[package]] name = "anchor-attribute-event" version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7710e4c54adf485affcd9be9adec5ef8846d9c71d7f31e16ba86ff9fc1dd49f" +dependencies = [ + "anchor-syn 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-program" +version = "0.31.1" dependencies = [ - "anchor-syn", + "anchor-lang-idl 0.1.2", + "anchor-syn 0.31.1", + "anyhow", + "bs58", + "heck 0.3.3", "proc-macro2", "quote", + "serde_json", "syn 1.0.109", ] [[package]] name = "anchor-attribute-program" version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ecfd49b2aeadeb32f35262230db402abed76ce87e27562b34f61318b2ec83c" dependencies = [ - "anchor-lang-idl", - "anchor-syn", + "anchor-lang-idl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-syn 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", "anyhow", "bs58", "heck 0.3.3", @@ -169,8 +274,8 @@ name = "anchor-cli" version = "0.31.1" dependencies = [ "anchor-client", - "anchor-lang", - "anchor-lang-idl", + "anchor-lang 0.31.1", + "anchor-lang-idl 0.1.2", "anyhow", "base64 0.21.7", "bincode", @@ -184,7 +289,7 @@ dependencies = [ "pathdiff", "portpicker", "regex", - "reqwest", + "reqwest 0.11.27", "semver", "serde", "serde_json", @@ -204,7 +309,7 @@ dependencies = [ name = "anchor-client" version = "0.31.1" dependencies = [ - "anchor-lang", + "anchor-lang 0.31.1", "anyhow", "futures", "regex", @@ -212,7 +317,7 @@ dependencies = [ "solana-account-decoder", "solana-client", "solana-sdk", - "thiserror", + "thiserror 1.0.66", "tokio", "url", ] @@ -221,7 +326,29 @@ dependencies = [ name = "anchor-derive-accounts" version = "0.31.1" dependencies = [ - "anchor-syn", + "anchor-syn 0.31.1", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-accounts" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be89d160793a88495af462a7010b3978e48e30a630c91de47ce2c1d3cb7a6149" +dependencies = [ + "anchor-syn 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-serde" +version = "0.31.1" +dependencies = [ + "anchor-syn 0.31.1", + "borsh-derive-internal", + "proc-macro2", "quote", "syn 1.0.109", ] @@ -229,8 +356,10 @@ dependencies = [ [[package]] name = "anchor-derive-serde" version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abc6ee78acb7bfe0c2dd2abc677aaa4789c0281a0c0ef01dbf6fe85e0fd9e6e4" dependencies = [ - "anchor-syn", + "anchor-syn 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", "borsh-derive-internal", "proc-macro2", "quote", @@ -246,33 +375,92 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "anchor-derive-space" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134a01c0703f6fd355a0e472c033f6f3e41fac1ef6e370b20c50f4c8d022cea7" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "anchor-lang" version = "0.31.1" dependencies = [ - "anchor-attribute-access-control", - "anchor-attribute-account", - "anchor-attribute-constant", - "anchor-attribute-error", - "anchor-attribute-event", - "anchor-attribute-program", - "anchor-derive-accounts", - "anchor-derive-serde", - "anchor-derive-space", - "anchor-lang-idl", + "anchor-attribute-access-control 0.31.1", + "anchor-attribute-account 0.31.1", + "anchor-attribute-constant 0.31.1", + "anchor-attribute-error 0.31.1", + "anchor-attribute-event 0.31.1", + "anchor-attribute-program 0.31.1", + "anchor-derive-accounts 0.31.1", + "anchor-derive-serde 0.31.1", + "anchor-derive-space 0.31.1", + "anchor-lang-idl 0.1.2", + "base64 0.21.7", + "bincode", + "borsh 0.10.3", + "bytemuck", + "light-compressed-account", + "light-compressed-token-sdk", + "light-compressible", + "light-ctoken-types", + "light-hasher", + "light-macros", + "light-sdk", + "light-sdk-macros", + "light-sdk-types", + "solana-program 2.3.0", + "thiserror 1.0.66", +] + +[[package]] +name = "anchor-lang" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6bab117055905e930f762c196e08f861f8dfe7241b92cee46677a3b15561a0a" +dependencies = [ + "anchor-attribute-access-control 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-attribute-account 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-attribute-constant 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-attribute-error 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-attribute-event 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-attribute-program 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-derive-accounts 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-derive-serde 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-derive-space 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-lang-idl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "base64 0.21.7", "bincode", "borsh 0.10.3", "bytemuck", - "solana-program", - "thiserror", + "solana-program 2.3.0", + "thiserror 1.0.66", +] + +[[package]] +name = "anchor-lang-idl" +version = "0.1.2" +dependencies = [ + "anchor-lang-idl-spec 0.1.0", + "anyhow", + "heck 0.3.3", + "regex", + "serde", + "serde_json", + "sha2 0.10.8", ] [[package]] name = "anchor-lang-idl" version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e8599d21995f68e296265aa5ab0c3cef582fd58afec014d01bd0bce18a4418" dependencies = [ - "anchor-lang-idl-spec", + "anchor-lang-idl-spec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "anyhow", "heck 0.3.3", "regex", @@ -289,16 +477,42 @@ dependencies = [ "serde", ] +[[package]] +name = "anchor-lang-idl-spec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bdf143115440fe621bdac3a29a1f7472e09f6cd82b2aa569429a0c13f103838" +dependencies = [ + "anyhow", + "serde", +] + [[package]] name = "anchor-spl" version = "0.31.1" dependencies = [ - "anchor-lang", + "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", "borsh 0.10.3", "mpl-token-metadata", "spl-associated-token-account", - "spl-memo 6.0.0", - "spl-pod 0.5.0", + "spl-memo", + "spl-pod", + "spl-token 7.0.0", + "spl-token-2022 6.0.0", + "spl-token-group-interface 0.5.0", + "spl-token-metadata-interface 0.6.0", +] + +[[package]] +name = "anchor-spl" +version = "0.31.1" +source = "git+https://github.com/lightprotocol/anchor?rev=d8a2b3d9#d8a2b3d99d61ef900d1f6cdaabcef14eb9af6279" +dependencies = [ + "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "mpl-token-metadata", + "spl-associated-token-account", + "spl-memo", + "spl-pod", "spl-token 7.0.0", "spl-token-2022 6.0.0", "spl-token-group-interface 0.5.0", @@ -319,14 +533,27 @@ dependencies = [ "serde_json", "sha2 0.10.8", "syn 1.0.109", - "thiserror", + "thiserror 1.0.66", ] [[package]] -name = "android-tzdata" -version = "0.1.1" +name = "anchor-syn" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" +checksum = "5dc7a6d90cc643df0ed2744862cdf180587d1e5d28936538c18fc8908489ed67" +dependencies = [ + "anyhow", + "bs58", + "cargo_toml", + "heck 0.3.3", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2 0.10.8", + "syn 1.0.109", + "thiserror 1.0.66", +] [[package]] name = "android_system_properties" @@ -397,9 +624,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.92" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "ark-bn254" @@ -407,9 +634,20 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" dependencies = [ - "ark-ec", - "ark-ff", - "ark-std", + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-std 0.5.0", ] [[package]] @@ -418,10 +656,10 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" dependencies = [ - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-poly 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "hashbrown 0.13.2", "itertools 0.10.5", @@ -429,16 +667,37 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.0", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "zeroize", +] + [[package]] name = "ark-ff" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "digest 0.10.7", "itertools 0.10.5", @@ -449,6 +708,26 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-traits", + "paste", + "zeroize", +] + [[package]] name = "ark-ff-asm" version = "0.4.2" @@ -459,6 +738,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.106", +] + [[package]] name = "ark-ff-macros" version = "0.4.2" @@ -472,27 +761,68 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "ark-poly" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "hashbrown 0.13.2", ] +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.0", +] + [[package]] name = "ark-serialize" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" dependencies = [ - "ark-serialize-derive", - "ark-std", + "ark-serialize-derive 0.4.2", + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive 0.5.0", + "ark-std 0.5.0", + "arrayvec", "digest 0.10.7", "num-bigint 0.4.6", ] @@ -508,6 +838,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "ark-std" version = "0.4.0" @@ -519,22 +860,26 @@ dependencies = [ ] [[package]] -name = "arrayref" -version = "0.3.9" +name = "ark-std" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + [[package]] -name = "arrayvec" -version = "0.7.4" +name = "arrayref" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] -name = "ascii" -version = "0.9.3" +name = "arrayvec" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "ascii-canvas" @@ -557,7 +902,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror", + "thiserror 1.0.66", "time", ] @@ -570,7 +915,7 @@ dependencies = [ "proc-macro2", "quote", "syn 1.0.109", - "synstructure", + "synstructure 0.12.6", ] [[package]] @@ -622,15 +967,21 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "atty" version = "0.2.14" @@ -659,7 +1010,7 @@ dependencies = [ "clap 4.5.17", "clap_complete", "dirs", - "reqwest", + "reqwest 0.11.27", "semver", "serde", "tempfile", @@ -680,6 +1031,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.12.3" @@ -704,6 +1061,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" + [[package]] name = "bincode" version = "1.3.3" @@ -736,18 +1099,18 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" dependencies = [ "serde", ] [[package]] name = "blake3" -version = "1.5.4" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" dependencies = [ "arrayref", "arrayvec", @@ -787,11 +1150,11 @@ dependencies = [ [[package]] name = "borsh" -version = "1.5.1" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" dependencies = [ - "borsh-derive 1.5.1", + "borsh-derive 1.5.7", "cfg_aliases", ] @@ -810,16 +1173,15 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.1" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" dependencies = [ "once_cell", "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.86", - "syn_derive", + "syn 2.0.106", ] [[package]] @@ -892,22 +1254,22 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.19.0" +version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" +checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] @@ -918,9 +1280,12 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +dependencies = [ + "serde", +] [[package]] name = "caps" @@ -929,7 +1294,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" dependencies = [ "libc", - "thiserror", + "thiserror 1.0.66", ] [[package]] @@ -979,22 +1344,20 @@ checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", - "serde", "wasm-bindgen", - "windows-targets 0.52.4", + "windows-link", ] [[package]] @@ -1018,7 +1381,7 @@ dependencies = [ "bitflags 1.3.2", "strsim 0.8.0", "textwrap", - "unicode-width", + "unicode-width 0.1.11", "vec_map", ] @@ -1062,7 +1425,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] @@ -1077,19 +1440,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" -[[package]] -name = "combine" -version = "3.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" -dependencies = [ - "ascii", - "byteorder", - "either", - "memchr", - "unreachable", -] - [[package]] name = "combine" version = "4.6.7" @@ -1111,15 +1461,15 @@ dependencies = [ [[package]] name = "console" -version = "0.15.8" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" dependencies = [ "encode_unicode", - "lazy_static", "libc", - "unicode-width", - "windows-sys 0.52.0", + "once_cell", + "unicode-width 0.2.1", + "windows-sys 0.59.0", ] [[package]] @@ -1142,11 +1492,17 @@ dependencies = [ "web-sys", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "constant_time_eq" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "core-foundation" @@ -1158,11 +1514,21 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" @@ -1184,9 +1550,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] @@ -1227,6 +1593,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -1296,14 +1674,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] name = "darling" -version = "0.20.3" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ "darling_core", "darling_macro", @@ -1311,27 +1689,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 2.0.86", + "strsim 0.11.1", + "syn 2.0.106", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] @@ -1353,6 +1731,16 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + [[package]] name = "der-parser" version = "8.2.0" @@ -1427,6 +1815,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", + "const-oid", "crypto-common", "subtle", ] @@ -1480,7 +1869,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] @@ -1503,14 +1892,22 @@ checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] -name = "eager" -version = "0.1.0" +name = "ecdsa" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature 2.2.0", + "spki", +] [[package]] name = "ed25519" @@ -1518,7 +1915,7 @@ version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" dependencies = [ - "signature", + "signature 1.6.4", ] [[package]] @@ -1547,12 +1944,43 @@ dependencies = [ "sha2 0.10.8", ] +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "either" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "ena" version = "0.14.2" @@ -1564,9 +1992,9 @@ dependencies = [ [[package]] name = "encode_unicode" -version = "0.3.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" @@ -1578,23 +2006,23 @@ dependencies = [ ] [[package]] -name = "enum-iterator" -version = "1.5.0" +name = "enum-ordinalize" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" dependencies = [ - "enum-iterator-derive", + "enum-ordinalize-derive", ] [[package]] -name = "enum-iterator-derive" -version = "1.3.0" +name = "enum-ordinalize-derive" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03cdc46ec28bd728e67540c528013c6a10eb69a02eb31078a1bda695438cbfb8" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] @@ -1664,6 +2092,18 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "fastbloom" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18c1ddb9231d8554c2d6bdf4cfaabf0c59251658c68b6c95cd52dd0c513a912a" +dependencies = [ + "getrandom 0.3.3", + "libm", + "rand 0.9.2", + "siphasher 1.0.1", +] + [[package]] name = "fastrand" version = "2.0.1" @@ -1676,6 +2116,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "fiat-crypto" version = "0.2.9" @@ -1694,11 +2144,20 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "five8" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75b8549488b4715defcb0d8a8a1c1c76a80661b5fa106b4ca0e7fce59d7d875" +dependencies = [ + "five8_core", +] + [[package]] name = "five8_const" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b4f62f0f8ca357f93ae90c8c2dd1041a1f665fde2f889ea9b1787903829015" +checksum = "26dec3da8bc3ef08f2c04f61eab298c3ab334523e55f076354d6d6f613799a7b" dependencies = [ "five8_core", ] @@ -1731,11 +2190,26 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -1796,7 +2270,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] @@ -1841,9 +2315,9 @@ version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ - "serde", "typenum", "version_check", + "zeroize", ] [[package]] @@ -1882,6 +2356,20 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.7+wasi-0.2.4", + "wasm-bindgen", +] + [[package]] name = "gimli" version = "0.28.0" @@ -1908,6 +2396,17 @@ dependencies = [ "spinning_top", ] +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "h2" version = "0.3.21" @@ -1919,7 +2418,7 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.12", "indexmap 1.9.3", "slab", "tokio", @@ -1927,15 +2426,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "hash32" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" -dependencies = [ - "byteorder", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -1962,6 +2452,9 @@ name = "hashbrown" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +dependencies = [ + "allocator-api2", +] [[package]] name = "heck" @@ -1999,6 +2492,25 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hidapi" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b876ecf37e86b359573c16c8366bc3eba52b689884a0fc42ba3f67203d2a8b" +dependencies = [ + "cc", + "cfg-if", + "libc", + "pkg-config", + "windows-sys 0.48.0", +] + [[package]] name = "histogram" version = "0.6.9" @@ -2037,9 +2549,20 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -2053,15 +2576,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", - "http", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.3.1", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body 1.0.1", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -2086,8 +2632,8 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.5", "httparse", "httpdate", "itoa", @@ -2099,6 +2645,27 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http 1.3.1", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-rustls" version = "0.24.1" @@ -2106,11 +2673,52 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" dependencies = [ "futures-util", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.27", "rustls 0.21.12", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http 1.3.1", + "hyper 1.7.0", + "hyper-util", + "rustls 0.23.32", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.4", + "tower-service", + "webpki-roots 1.0.2", +] + +[[package]] +name = "hyper-util" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "hyper 1.7.0", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.6.0", + "tokio", + "tower-service", + "tracing", ] [[package]] @@ -2137,19 +2745,116 @@ dependencies = [ ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] @@ -2164,9 +2869,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", "hashbrown 0.15.0", @@ -2174,15 +2879,15 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.17.8" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" dependencies = [ "console", - "instant", "number_prefix", "portable-atomic", - "unicode-width", + "unicode-width 0.2.1", + "web-time", ] [[package]] @@ -2195,19 +2900,31 @@ dependencies = [ ] [[package]] -name = "instant" -version = "0.1.12" +name = "io-uring" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ + "bitflags 2.9.4", "cfg-if", + "libc", ] [[package]] name = "ipnet" -version = "2.8.0" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] [[package]] name = "is-terminal" @@ -2253,6 +2970,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.9" @@ -2261,16 +2987,18 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jni" -version = "0.19.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", - "combine 4.6.7", + "cfg-if", + "combine", "jni-sys", "log", - "thiserror", + "thiserror 1.0.66", "walkdir", + "windows-sys 0.45.0", ] [[package]] @@ -2290,10 +3018,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -2312,6 +3041,30 @@ dependencies = [ "serde_json", ] +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2 0.10.8", + "signature 2.2.0", +] + +[[package]] +name = "kaigan" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ba15de5aeb137f0f65aa3bf82187647f1285abfe5b20c80c2c37f7007ad519a" +dependencies = [ + "borsh 0.10.3", + "serde", +] + [[package]] name = "keccak" version = "0.1.4" @@ -2357,9 +3110,15 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.176" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" + +[[package]] +name = "libm" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libsecp256k1" @@ -2409,12 +3168,267 @@ dependencies = [ "libsecp256k1-core", ] +[[package]] +name = "light-account-checks" +version = "0.3.0" +dependencies = [ + "solana-account-info 2.3.0", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "solana-sysvar 2.3.0", + "thiserror 2.0.16", +] + +[[package]] +name = "light-compressed-account" +version = "0.3.0" +dependencies = [ + "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "borsh 0.10.3", + "light-hasher", + "light-macros", + "light-profiler", + "light-zero-copy", + "log", + "pinocchio", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "thiserror 2.0.16", + "zerocopy 0.8.27", +] + +[[package]] +name = "light-compressed-token-sdk" +version = "0.1.0" +dependencies = [ + "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-spl 0.31.1 (git+https://github.com/lightprotocol/anchor?rev=d8a2b3d9)", + "arrayvec", + "borsh 0.10.3", + "light-account-checks", + "light-compressed-account", + "light-compressed-token-types", + "light-ctoken-types", + "light-macros", + "light-profiler", + "light-sdk", + "light-sdk-types", + "light-zero-copy", + "solana-account-info 2.3.0", + "solana-cpi 2.2.1", + "solana-instruction 2.3.0", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "spl-pod", + "spl-token-2022 7.0.0", + "thiserror 2.0.16", +] + +[[package]] +name = "light-compressed-token-types" +version = "0.1.0" +dependencies = [ + "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "borsh 0.10.3", + "light-account-checks", + "light-compressed-account", + "light-macros", + "light-sdk-types", + "solana-msg 2.2.1", + "thiserror 2.0.16", +] + +[[package]] +name = "light-compressible" +version = "0.1.0" +dependencies = [ + "aligned-sized", + "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "borsh 0.10.3", + "bytemuck", + "light-account-checks", + "light-compressed-account", + "light-hasher", + "light-macros", + "light-profiler", + "light-zero-copy", + "pinocchio", + "pinocchio-pubkey", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "solana-sysvar 2.3.0", + "thiserror 2.0.16", + "zerocopy 0.8.27", +] + +[[package]] +name = "light-ctoken-types" +version = "0.1.0" +dependencies = [ + "aligned-sized", + "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec", + "borsh 0.10.3", + "bytemuck", + "light-compressed-account", + "light-compressible", + "light-hasher", + "light-macros", + "light-profiler", + "light-zero-copy", + "pinocchio", + "pinocchio-pubkey", + "solana-account-info 2.3.0", + "solana-msg 2.2.1", + "solana-pubkey 2.4.0", + "spl-pod", + "spl-token-2022 7.0.0", + "thiserror 2.0.16", + "zerocopy 0.8.27", +] + +[[package]] +name = "light-hasher" +version = "3.1.0" +dependencies = [ + "ark-bn254 0.5.0", + "ark-ff 0.5.0", + "arrayvec", + "borsh 0.10.3", + "light-poseidon", + "num-bigint 0.4.6", + "sha2 0.10.8", + "sha3", + "solana-nostd-keccak", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "thiserror 2.0.16", +] + +[[package]] +name = "light-macros" +version = "2.1.0" +dependencies = [ + "bs58", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "light-poseidon" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3d87542063daaccbfecd78b60f988079b6ec4e089249658b9455075c78d42" +dependencies = [ + "ark-bn254 0.5.0", + "ark-ff 0.5.0", + "num-bigint 0.4.6", + "thiserror 1.0.66", +] + +[[package]] +name = "light-profiler" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "light-sdk" +version = "0.13.0" +dependencies = [ + "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec", + "bincode", + "borsh 0.10.3", + "light-account-checks", + "light-compressed-account", + "light-hasher", + "light-macros", + "light-sdk-macros", + "light-sdk-types", + "light-zero-copy", + "num-bigint 0.4.6", + "solana-account-info 2.3.0", + "solana-clock 2.2.2", + "solana-cpi 2.2.1", + "solana-instruction 2.3.0", + "solana-msg 2.2.1", + "solana-program 2.3.0", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-system-interface 1.0.0", + "solana-sysvar 2.3.0", + "thiserror 2.0.16", +] + +[[package]] +name = "light-sdk-macros" +version = "0.13.0" +dependencies = [ + "heck 0.4.1", + "light-hasher", + "light-poseidon", + "proc-macro2", + "quote", + "solana-pubkey 2.4.0", + "syn 2.0.106", +] + +[[package]] +name = "light-sdk-types" +version = "0.13.0" +dependencies = [ + "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "borsh 0.10.3", + "light-account-checks", + "light-compressed-account", + "light-hasher", + "light-macros", + "light-zero-copy", + "solana-msg 2.2.1", + "thiserror 2.0.16", +] + +[[package]] +name = "light-zero-copy" +version = "0.2.0" +dependencies = [ + "arrayvec", + "light-zero-copy-derive", + "zerocopy 0.8.27", +] + +[[package]] +name = "light-zero-copy-derive" +version = "0.1.0" +dependencies = [ + "lazy_static", + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "linux-raw-sys" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3852614a3bd9ca9804678ba6be5e3b8ce76dfc902cae004e3e0c44051b6e88db" +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + [[package]] name = "lock_api" version = "0.4.10" @@ -2427,9 +3441,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "lru-slab" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "memchr" @@ -2500,13 +3520,13 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -2518,8 +3538,8 @@ dependencies = [ "borsh 0.10.3", "num-derive 0.3.3", "num-traits", - "solana-program", - "thiserror", + "solana-program 3.0.0", + "thiserror 1.0.66", ] [[package]] @@ -2530,11 +3550,11 @@ checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" [[package]] name = "nix" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.4", "cfg-if", "cfg_aliases", "libc", @@ -2633,7 +3653,7 @@ checksum = "9e6a0fd4f737c707bd9086cc16c925f294943eb62eb71499e9fd4cf71f8b9f4e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] @@ -2679,11 +3699,11 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.5.2", "libc", ] @@ -2705,7 +3725,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] @@ -2744,12 +3764,50 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "openssl-probe" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "parking" version = "2.2.1" @@ -2820,9 +3878,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "percentage" @@ -2840,7 +3898,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.6.0", + "indexmap 2.11.4", ] [[package]] @@ -2873,7 +3931,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] @@ -2882,7 +3940,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" dependencies = [ - "siphasher", + "siphasher 0.3.11", ] [[package]] @@ -2891,7 +3949,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" dependencies = [ - "siphasher", + "siphasher 0.3.11", ] [[package]] @@ -2906,6 +3964,33 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pinocchio" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b971851087bc3699b001954ad02389d50c41405ece3548cbcafc88b3e20017a" + +[[package]] +name = "pinocchio-pubkey" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0225638cadcbebae8932cb7f49cb5da7c15c21beb19f048f05a5ca7d93f065" +dependencies = [ + "five8_const", + "pinocchio", + "sha2-const-stable", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.27" @@ -2939,6 +4024,15 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -2976,33 +4070,10 @@ dependencies = [ ] [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "proc-macro2" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -3033,38 +4104,45 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", + "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash 2.0.0", - "rustls 0.23.16", - "socket2 0.5.7", - "thiserror", + "rustls 0.23.32", + "socket2 0.6.0", + "thiserror 2.0.16", "tokio", "tracing", + "web-time", ] [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", - "rand 0.8.5", + "fastbloom", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.2", "ring 0.17.8", "rustc-hash 2.0.0", - "rustls 0.23.16", + "rustls 0.23.32", + "rustls-pki-types", "rustls-platform-verifier", "slab", - "thiserror", + "thiserror 2.0.16", "tinyvec", "tracing", + "web-time", ] [[package]] @@ -3076,7 +4154,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.7", + "socket2 0.5.10", "tracing", "windows-sys 0.52.0", ] @@ -3090,6 +4168,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rand" version = "0.7.3" @@ -3114,6 +4198,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -3134,6 +4228,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + [[package]] name = "rand_core" version = "0.5.1" @@ -3152,6 +4256,15 @@ dependencies = [ "getrandom 0.2.10", ] +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + [[package]] name = "rand_hc" version = "0.2.0" @@ -3167,7 +4280,7 @@ version = "11.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ab240315c661615f2ee9f0f2cd32d5a7343a84d5ebcccb99d46e6637565e7b0" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.4", ] [[package]] @@ -3216,7 +4329,7 @@ checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom 0.2.10", "redox_syscall 0.2.16", - "thiserror", + "thiserror 1.0.66", ] [[package]] @@ -3254,17 +4367,16 @@ version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ - "async-compression", "base64 0.21.7", "bytes", "encoding_rs", "futures-core", "futures-util", "h2", - "http", - "http-body", - "hyper", - "hyper-rustls", + "http 0.2.12", + "http-body 0.4.5", + "hyper 0.14.27", + "hyper-rustls 0.24.1", "ipnet", "js-sys", "log", @@ -3274,15 +4386,14 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rustls 0.21.12", - "rustls-pemfile 1.0.3", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", - "tokio-rustls", - "tokio-util", + "tokio-rustls 0.24.1", "tower-service", "url", "wasm-bindgen", @@ -3292,19 +4403,71 @@ dependencies = [ "winreg", ] +[[package]] +name = "reqwest" +version = "0.12.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +dependencies = [ + "async-compression", + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.7.0", + "hyper-rustls 0.27.7", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.32", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tokio-rustls 0.26.4", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 1.0.2", +] + [[package]] name = "reqwest-middleware" -version = "0.2.5" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a735987236a8e238bf0296c7e351b999c188ccc11477f311b82b55c93984216" +checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e" dependencies = [ "anyhow", "async-trait", - "http", - "reqwest", + "http 1.3.1", + "reqwest 0.12.23", "serde", - "task-local-extensions", - "thiserror", + "thiserror 1.0.66", + "tower-service", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac 0.12.1", + "subtle", ] [[package]] @@ -3339,13 +4502,13 @@ dependencies = [ [[package]] name = "rpassword" -version = "7.3.1" +version = "7.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" +checksum = "66d4c8b64f049c6721ec8ccec37ddfc3d641c4a7fca57e8f2a89de509c73df39" dependencies = [ "libc", "rtoolbox", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -3400,7 +4563,7 @@ version = "0.38.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2f9da0cbd88f9f09e7814e388301c8414c51c62aa6ce1e4b5c551d49d96e531" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.4", "errno", "libc", "linux-raw-sys", @@ -3421,26 +4584,25 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.16" +version = "0.23.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" dependencies = [ "once_cell", "ring 0.17.8", "rustls-pki-types", - "rustls-webpki 0.102.8", + "rustls-webpki 0.103.6", "subtle", "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.7.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" dependencies = [ "openssl-probe", - "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", "security-framework", @@ -3456,39 +4618,34 @@ dependencies = [ ] [[package]] -name = "rustls-pemfile" -version = "2.2.0" +name = "rustls-pki-types" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ - "rustls-pki-types", + "web-time", + "zeroize", ] -[[package]] -name = "rustls-pki-types" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" - [[package]] name = "rustls-platform-verifier" -version = "0.3.4" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbb878bdfdf63a336a5e63561b1835e7a8c91524f51621db870169eac84b490" +checksum = "be59af91596cac372a6942530653ad0c3a246cdd491aaa9dcaee47f88d67d5a0" dependencies = [ - "core-foundation", + "core-foundation 0.10.1", "core-foundation-sys", "jni", "log", "once_cell", - "rustls 0.23.16", + "rustls 0.23.32", "rustls-native-certs", "rustls-platform-verifier-android", - "rustls-webpki 0.102.8", + "rustls-webpki 0.103.6", "security-framework", "security-framework-sys", - "webpki-roots 0.26.6", - "winapi", + "webpki-root-certs", + "windows-sys 0.52.0", ] [[package]] @@ -3509,9 +4666,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" dependencies = [ "ring 0.17.8", "rustls-pki-types", @@ -3554,12 +4711,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "scroll" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" - [[package]] name = "sct" version = "0.7.0" @@ -3570,25 +4721,38 @@ dependencies = [ "untrusted 0.7.1", ] +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "security-framework" -version = "2.10.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +checksum = "cc198e42d9b7510827939c9a15f5062a0c913f3371d765977e586d2fe6c16f4a" dependencies = [ - "bitflags 1.3.2", - "core-foundation", + "bitflags 2.9.4", + "core-foundation 0.10.1", "core-foundation-sys", "libc", - "num-bigint 0.4.6", "security-framework-sys", ] [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -3596,19 +4760,29 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.214" +version = "1.0.227" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "80ece43fc6fbed4eb5392ab50c07334d3e577cbf40997ee896fe7af40bba4245" dependencies = [ + "serde_core", "serde_derive", ] +[[package]] +name = "serde-big-array" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" +dependencies = [ + "serde", +] + [[package]] name = "serde_bytes" version = "0.11.15" @@ -3618,27 +4792,37 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_core" +version = "1.0.227" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a576275b607a2c86ea29e410193df32bc680303c82f31e275bbfcafe8b33be5" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.227" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "51e694923b8824cf0e9b382adf0f60d4e05f348f357b38833a3fa5ed7c2ede04" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -3664,9 +4848,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.11.0" +version = "3.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" +checksum = "c522100790450cf78eeac1507263d0a350d4d5b30df0c8e1fe051a10c22b376e" dependencies = [ "serde", "serde_derive", @@ -3675,14 +4859,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.11.0" +version = "3.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" +checksum = "327ada00f7d64abaac1e55a6911e90cf665aa051b9a561c7006c157f4633135e" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] @@ -3691,7 +4875,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.11.4", "itoa", "ryu", "serde", @@ -3733,6 +4917,12 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sha2-const-stable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" + [[package]] name = "sha3" version = "0.10.8" @@ -3764,6 +4954,16 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -3779,12 +4979,28 @@ version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + [[package]] name = "siphasher" version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" version = "0.4.9" @@ -3796,9 +5012,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" @@ -3812,59 +5028,90 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "solana-account" -version = "2.1.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730219420b206253977b8cc8fd7846ffe021ab2e2c718e70db420efbd2775547" +checksum = "0f949fe4edaeaea78c844023bfc1c898e0b1f5a100f8a8d2d0f85d0a7b090258" dependencies = [ "bincode", "serde", "serde_bytes", "serde_derive", - "solana-instruction", - "solana-program", + "solana-account-info 2.3.0", + "solana-clock 2.2.2", + "solana-instruction 2.3.0", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", + "solana-sysvar 2.3.0", ] [[package]] name = "solana-account-decoder" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14e5b1c167335942b659d077552607f79b2eca3472e40eeed97a2c55838b84ef" +checksum = "902c42492c67e2cb78e839b1af063ed672b3d1ff22311ce07aa073804ca40e53" dependencies = [ "Inflector", "base64 0.22.1", "bincode", "bs58", "bv", - "lazy_static", "serde", "serde_derive", "serde_json", + "solana-account", "solana-account-decoder-client-types", - "solana-config-program", - "solana-sdk", - "spl-token 6.0.0", - "spl-token-2022 4.0.0", - "spl-token-group-interface 0.3.0", - "spl-token-metadata-interface 0.4.0", - "thiserror", + "solana-address-lookup-table-interface 2.2.2", + "solana-clock 2.2.2", + "solana-config-program-client", + "solana-epoch-schedule 2.2.1", + "solana-fee-calculator 2.2.1", + "solana-instruction 2.3.0", + "solana-loader-v3-interface", + "solana-nonce 2.2.1", + "solana-program-option 2.2.1", + "solana-program-pack 2.2.1", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-slot-hashes 2.2.1", + "solana-slot-history 2.2.1", + "solana-stake-interface", + "solana-sysvar 2.3.0", + "solana-vote-interface", + "spl-generic-token", + "spl-token 8.0.0", + "spl-token-2022 8.0.1", + "spl-token-group-interface 0.6.0", + "spl-token-metadata-interface 0.7.0", + "thiserror 2.0.16", "zstd", ] [[package]] name = "solana-account-decoder-client-types" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee0750d2f106ecbee6d4508b6e2029e6946cb5f67288bf002b5a62f9f451c43" +checksum = "39260da5bed46e52afe17c8dc2fd41b7d23a946c18605154033631a334e882ec" dependencies = [ "base64 0.22.1", "bs58", @@ -3872,454 +5119,1189 @@ dependencies = [ "serde_derive", "serde_json", "solana-account", - "solana-pubkey", + "solana-pubkey 2.4.0", "zstd", ] [[package]] name = "solana-account-info" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6abe81cfc4a75f71a510c6856b03a7d8525e416af3c69d55daef62e6078b8d40" +checksum = "c8f5152a288ef1912300fc6efa6c2d1f9bb55d9398eb6c72326360b8063987da" dependencies = [ "bincode", "serde", - "solana-program-error", - "solana-program-memory", - "solana-pubkey", + "solana-program-error 2.2.2", + "solana-program-memory 2.3.1", + "solana-pubkey 2.4.0", ] [[package]] -name = "solana-atomic-u64" -version = "2.1.0" +name = "solana-account-info" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391b795afcdcad39ddc6c938d64b789d036cdfe00d9dc5ff83024cf2da9f066f" +checksum = "82f4691b69b172c687d218dd2f1f23fc7ea5e9aa79df9ac26dab3d8dd829ce48" dependencies = [ - "parking_lot", + "bincode", + "serde", + "solana-program-error 3.0.0", + "solana-program-memory 3.0.0", + "solana-pubkey 3.0.0", ] [[package]] -name = "solana-bincode" -version = "2.1.0" +name = "solana-address" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e85cb5961c356345a61378163fd9057011b35540f8bcdd8d8a09cb10117264f" +checksum = "0a7a457086457ea9db9a5199d719dc8734dc2d0342fad0d8f77633c31eb62f19" dependencies = [ - "bincode", + "borsh 1.5.7", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "five8", + "five8_const", "serde", - "solana-instruction", + "serde_derive", + "solana-atomic-u64 3.0.0", + "solana-define-syscall 3.0.0", + "solana-program-error 3.0.0", + "solana-sanitize 3.0.1", + "solana-sha256-hasher 3.0.0", ] [[package]] -name = "solana-bn254" -version = "2.1.0" +name = "solana-address-lookup-table-interface" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39c4030db26ad618f7e18fb5284df19fd52a68e092a1ca58db857108c4cc777" +checksum = "d1673f67efe870b64a65cb39e6194be5b26527691ce5922909939961a6e6b395" dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff", - "ark-serialize", + "bincode", "bytemuck", - "solana-program", - "thiserror", + "serde", + "serde_derive", + "solana-clock 2.2.2", + "solana-instruction 2.3.0", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", + "solana-slot-hashes 2.2.1", ] [[package]] -name = "solana-borsh" -version = "2.1.0" +name = "solana-address-lookup-table-interface" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d526f3525ab22a3ada3f9a1d642664dafac00dc9208326b701a2045514eb04" +checksum = "e2f56cac5e70517a2f27d05e5100b20de7182473ffd0035b23ea273307905987" dependencies = [ - "borsh 0.10.3", - "borsh 1.5.1", + "solana-clock 3.0.0", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.0.0", + "solana-slot-hashes 3.0.0", ] [[package]] -name = "solana-clap-utils" -version = "2.1.0" +name = "solana-atomic-u64" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1709e1b0aefc8062fca29a4fde8d35f39ee95586e77cc6360e9bfc50a094c44f" +checksum = "d52e52720efe60465b052b9e7445a01c17550666beec855cce66f44766697bc2" dependencies = [ - "chrono", - "clap 2.34.0", - "rpassword", - "solana-derivation-path", - "solana-remote-wallet", - "solana-sdk", - "thiserror", - "tiny-bip39", - "uriparse", - "url", + "parking_lot", ] [[package]] -name = "solana-cli-config" -version = "2.1.0" +name = "solana-atomic-u64" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384fda0ddf3099eab0f702b326663f499e84731e8584fd7d0c6d8bab03bead79" +checksum = "a933ff1e50aff72d02173cfcd7511bd8540b027ee720b75f353f594f834216d0" dependencies = [ - "dirs-next", - "lazy_static", - "serde", - "serde_derive", - "serde_yaml", - "solana-clap-utils", - "solana-sdk", - "url", + "parking_lot", ] [[package]] -name = "solana-client" -version = "2.1.0" +name = "solana-big-mod-exp" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d9a40b8e9e11604e8c05e8b5fcdb89359235db47d1aae84dcba0fc98e95dd0c" +checksum = "75db7f2bbac3e62cfd139065d15bcda9e2428883ba61fc8d27ccb251081e7567" dependencies = [ - "async-trait", - "bincode", - "dashmap", - "futures", - "futures-util", - "indexmap 2.6.0", - "indicatif", - "log", - "quinn", - "rayon", - "solana-connection-cache", - "solana-measure", - "solana-pubsub-client", - "solana-quic-client", - "solana-rpc-client", - "solana-rpc-client-api", - "solana-rpc-client-nonce-utils", - "solana-sdk", - "solana-streamer", - "solana-thin-client", - "solana-tpu-client", - "solana-udp-client", - "thiserror", - "tokio", + "num-bigint 0.4.6", + "num-traits", + "solana-define-syscall 2.3.0", ] [[package]] -name = "solana-clock" -version = "2.1.0" +name = "solana-big-mod-exp" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30c80fb6d791b3925d5ec4bf23a7c169ef5090c013059ec3ed7d0b2c04efa085" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "solana-define-syscall 3.0.0", +] + +[[package]] +name = "solana-bincode" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7848171e53fa528efd41dd4b3ab919f47b851f8bb4a827d63ff95678f08737fc" +checksum = "19a3787b8cf9c9fe3dd360800e8b70982b9e5a8af9e11c354b6665dd4a003adc" dependencies = [ + "bincode", "serde", - "serde_derive", - "solana-sdk-macro", + "solana-instruction 2.3.0", ] [[package]] -name = "solana-compute-budget" -version = "2.1.0" +name = "solana-blake3-hasher" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebf2f023f471bd1195b7f420e13ffc2422592dd48e71104b4901300b49ac493e" +checksum = "a1a0801e25a1b31a14494fc80882a036be0ffd290efc4c2d640bfcca120a4672" dependencies = [ - "solana-sdk", + "blake3", + "solana-define-syscall 2.3.0", + "solana-hash 2.3.0", + "solana-sanitize 2.2.1", ] [[package]] -name = "solana-config-program" -version = "2.1.0" +name = "solana-blake3-hasher" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a035a01970ebbf40a244b3b79af533329ac8d48d80b0b98e166e23e35aa88171" +checksum = "ffa2e3bdac3339c6d0423275e45dafc5ac25f4d43bf344d026a3cc9a85e244a6" +dependencies = [ + "blake3", + "solana-define-syscall 3.0.0", + "solana-hash 3.0.0", +] + +[[package]] +name = "solana-bn254" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4420f125118732833f36facf96a27e7b78314b2d642ba07fa9ffdacd8d79e243" +dependencies = [ + "ark-bn254 0.4.0", + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "bytemuck", + "solana-define-syscall 2.3.0", + "thiserror 2.0.16", +] + +[[package]] +name = "solana-borsh" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "718333bcd0a1a7aed6655aa66bef8d7fb047944922b2d3a18f49cbc13e73d004" +dependencies = [ + "borsh 0.10.3", + "borsh 1.5.7", +] + +[[package]] +name = "solana-borsh" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc402b16657abbfa9991cd5cbfac5a11d809f7e7d28d3bb291baeb088b39060e" +dependencies = [ + "borsh 1.5.7", +] + +[[package]] +name = "solana-clap-utils" +version = "2.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d417e6d62ed172c023e8c91f716d2d4b7be3a452a19e2c534a14bfdb56c4be" dependencies = [ - "bincode", "chrono", + "clap 2.34.0", + "rpassword", + "solana-clock 2.2.2", + "solana-cluster-type", + "solana-commitment-config", + "solana-derivation-path", + "solana-hash 2.3.0", + "solana-keypair", + "solana-message 2.4.0", + "solana-native-token 2.2.2", + "solana-presigner", + "solana-pubkey 2.4.0", + "solana-remote-wallet", + "solana-seed-phrase", + "solana-signature", + "solana-signer", + "thiserror 2.0.16", + "tiny-bip39", + "uriparse", + "url", +] + +[[package]] +name = "solana-cli-config" +version = "2.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c04ed885bc338d800e2ac180d701f72003f0e325d431adafc7cc55601d7cd2" +dependencies = [ + "dirs-next", "serde", "serde_derive", - "solana-log-collector", - "solana-program-runtime", - "solana-sdk", - "solana-short-vec", + "serde_yaml", + "solana-clap-utils", + "solana-commitment-config", + "url", +] + +[[package]] +name = "solana-client" +version = "2.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a035d424d5a44a3c16506378fd1e6133c73bc5016ffc40f8983d5373e426522" +dependencies = [ + "async-trait", + "bincode", + "dashmap", + "futures", + "futures-util", + "indexmap 2.11.4", + "indicatif", + "log", + "quinn", + "rayon", + "solana-account", + "solana-client-traits", + "solana-commitment-config", + "solana-connection-cache", + "solana-epoch-info", + "solana-hash 2.3.0", + "solana-instruction 2.3.0", + "solana-keypair", + "solana-measure", + "solana-message 2.4.0", + "solana-pubkey 2.4.0", + "solana-pubsub-client", + "solana-quic-client", + "solana-quic-definitions", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-rpc-client-nonce-utils", + "solana-signature", + "solana-signer", + "solana-streamer", + "solana-thin-client", + "solana-time-utils", + "solana-tpu-client", + "solana-transaction", + "solana-transaction-error 2.2.1", + "solana-udp-client", + "thiserror 2.0.16", + "tokio", +] + +[[package]] +name = "solana-client-traits" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83f0071874e629f29e0eb3dab8a863e98502ac7aba55b7e0df1803fc5cac72a7" +dependencies = [ + "solana-account", + "solana-commitment-config", + "solana-epoch-info", + "solana-hash 2.3.0", + "solana-instruction 2.3.0", + "solana-keypair", + "solana-message 2.4.0", + "solana-pubkey 2.4.0", + "solana-signature", + "solana-signer", + "solana-system-interface 1.0.0", + "solana-transaction", + "solana-transaction-error 2.2.1", +] + +[[package]] +name = "solana-clock" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bb482ab70fced82ad3d7d3d87be33d466a3498eb8aa856434ff3c0dfc2e2e31" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-clock" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb62e9381182459a4520b5fe7fb22d423cae736239a6427fc398a88743d0ed59" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 3.0.0", + "solana-sdk-macro 3.0.0", + "solana-sysvar-id 3.0.0", +] + +[[package]] +name = "solana-cluster-type" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ace9fea2daa28354d107ea879cff107181d85cd4e0f78a2bedb10e1a428c97e" +dependencies = [ + "serde", + "serde_derive", + "solana-hash 2.3.0", +] + +[[package]] +name = "solana-commitment-config" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac49c4dde3edfa832de1697e9bcdb7c3b3f7cb7a1981b7c62526c8bb6700fb73" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-compute-budget-interface" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8432d2c4c22d0499aa06d62e4f7e333f81777b3d7c96050ae9e5cb71a8c3aee4" +dependencies = [ + "borsh 1.5.7", + "serde", + "serde_derive", + "solana-instruction 2.3.0", + "solana-sdk-ids 2.2.1", +] + +[[package]] +name = "solana-config-program-client" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53aceac36f105fd4922e29b4f0c1f785b69d7b3e7e387e384b8985c8e0c3595e" +dependencies = [ + "bincode", + "borsh 0.10.3", + "kaigan", + "serde", + "solana-program 2.3.0", ] [[package]] name = "solana-connection-cache" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f45dd2a6d5d55ed951781486231d0d2ee9ff7047fdafaed01ee021e236319d0" +checksum = "b46de0f0ec7ea94dfbc81268020c7af10999bab279d37b71f94a35f27c1c4af2" dependencies = [ "async-trait", "bincode", "crossbeam-channel", "futures-util", - "indexmap 2.6.0", + "indexmap 2.11.4", "log", "rand 0.8.5", "rayon", + "solana-keypair", "solana-measure", "solana-metrics", - "solana-sdk", - "thiserror", + "solana-time-utils", + "solana-transaction-error 2.2.1", + "thiserror 2.0.16", + "tokio", +] + +[[package]] +name = "solana-cpi" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dc71126edddc2ba014622fc32d0f5e2e78ec6c5a1e0eb511b85618c09e9ea11" +dependencies = [ + "solana-account-info 2.3.0", + "solana-define-syscall 2.3.0", + "solana-instruction 2.3.0", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "solana-stable-layout 2.2.1", +] + +[[package]] +name = "solana-cpi" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16238feb63d1cbdf915fb287f29ef7a7ebf81469bd6214f8b72a53866b593f8f" +dependencies = [ + "solana-account-info 3.0.0", + "solana-define-syscall 3.0.0", + "solana-instruction 3.0.0", + "solana-program-error 3.0.0", + "solana-pubkey 3.0.0", + "solana-stable-layout 3.0.0", +] + +[[package]] +name = "solana-curve25519" +version = "2.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "946ba468216b901ecfc9476497aeaa985745652bf312dbdc7d72dbe702916b9b" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "solana-define-syscall 2.3.0", + "subtle", + "thiserror 2.0.16", +] + +[[package]] +name = "solana-decode-error" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c781686a18db2f942e70913f7ca15dc120ec38dcab42ff7557db2c70c625a35" +dependencies = [ + "num-traits", +] + +[[package]] +name = "solana-define-syscall" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ae3e2abcf541c8122eafe9a625d4d194b4023c20adde1e251f94e056bb1aee2" + +[[package]] +name = "solana-define-syscall" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9697086a4e102d28a156b8d6b521730335d6951bd39a5e766512bbe09007cee" + +[[package]] +name = "solana-derivation-path" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "939756d798b25c5ec3cca10e06212bdca3b1443cb9bb740a38124f58b258737b" +dependencies = [ + "derivation-path", + "qstring", + "uriparse", +] + +[[package]] +name = "solana-ed25519-program" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1feafa1691ea3ae588f99056f4bdd1293212c7ece28243d7da257c443e84753" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "ed25519-dalek", + "solana-feature-set", + "solana-instruction 2.3.0", + "solana-precompile-error", + "solana-sdk-ids 2.2.1", +] + +[[package]] +name = "solana-epoch-info" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ef6f0b449290b0b9f32973eefd95af35b01c5c0c34c569f936c34c5b20d77b" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-epoch-rewards" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b575d3dd323b9ea10bb6fe89bf6bf93e249b215ba8ed7f68f1a3633f384db7" +dependencies = [ + "serde", + "serde_derive", + "solana-hash 2.3.0", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-epoch-rewards" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b319a4ed70390af911090c020571f0ff1f4ec432522d05ab89f5c08080381995" +dependencies = [ + "serde", + "serde_derive", + "solana-hash 3.0.0", + "solana-sdk-ids 3.0.0", + "solana-sdk-macro 3.0.0", + "solana-sysvar-id 3.0.0", +] + +[[package]] +name = "solana-epoch-rewards-hasher" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c5fd2662ae7574810904585fd443545ed2b568dbd304b25a31e79ccc76e81b" +dependencies = [ + "siphasher 0.3.11", + "solana-hash 2.3.0", + "solana-pubkey 2.4.0", +] + +[[package]] +name = "solana-epoch-schedule" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fce071fbddecc55d727b1d7ed16a629afe4f6e4c217bc8d00af3b785f6f67ed" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-epoch-schedule" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5481e72cc4d52c169db73e4c0cd16de8bc943078aac587ec4817a75cc6388f" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 3.0.0", + "solana-sdk-macro 3.0.0", + "solana-sysvar-id 3.0.0", +] + +[[package]] +name = "solana-epoch-stake" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc6693d0ea833b880514b9b88d95afb80b42762dca98b0712465d1fcbbcb89e" +dependencies = [ + "solana-define-syscall 3.0.0", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-example-mocks" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84461d56cbb8bb8d539347151e0525b53910102e4bced875d49d5139708e39d3" +dependencies = [ + "serde", + "serde_derive", + "solana-address-lookup-table-interface 2.2.2", + "solana-clock 2.2.2", + "solana-hash 2.3.0", + "solana-instruction 2.3.0", + "solana-keccak-hasher 2.2.1", + "solana-message 2.4.0", + "solana-nonce 2.2.1", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", + "solana-system-interface 1.0.0", + "thiserror 2.0.16", +] + +[[package]] +name = "solana-example-mocks" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978855d164845c1b0235d4b4d101cadc55373fffaf0b5b6cfa2194d25b2ed658" +dependencies = [ + "serde", + "serde_derive", + "solana-address-lookup-table-interface 3.0.0", + "solana-clock 3.0.0", + "solana-hash 3.0.0", + "solana-instruction 3.0.0", + "solana-keccak-hasher 3.0.0", + "solana-message 3.0.1", + "solana-nonce 3.0.0", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.0.0", + "solana-system-interface 2.0.0", + "thiserror 2.0.16", +] + +[[package]] +name = "solana-faucet" +version = "2.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e372728835d6087b1fecba3fc1270bd2e9cdc7c890e92c0daa6775302f9acef" +dependencies = [ + "bincode", + "clap 2.34.0", + "crossbeam-channel", + "log", + "serde", + "serde_derive", + "solana-clap-utils", + "solana-cli-config", + "solana-hash 2.3.0", + "solana-instruction 2.3.0", + "solana-keypair", + "solana-logger", + "solana-message 2.4.0", + "solana-metrics", + "solana-native-token 2.2.2", + "solana-packet", + "solana-pubkey 2.4.0", + "solana-signer", + "solana-system-interface 1.0.0", + "solana-system-transaction", + "solana-transaction", + "solana-version", + "spl-memo", + "thiserror 2.0.16", "tokio", ] [[package]] -name = "solana-cpi" -version = "2.1.0" +name = "solana-feature-gate-interface" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f5c5382b449e8e4e3016fb05e418c53d57782d8b5c30aa372fc265654b956d" +dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-account", + "solana-account-info 2.3.0", + "solana-instruction 2.3.0", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-system-interface 1.0.0", +] + +[[package]] +name = "solana-feature-set" +version = "2.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93b93971e289d6425f88e6e3cb6668c4b05df78b3c518c249be55ced8efd6b6d" +dependencies = [ + "ahash", + "lazy_static", + "solana-epoch-schedule 2.2.1", + "solana-hash 2.3.0", + "solana-pubkey 2.4.0", + "solana-sha256-hasher 2.3.0", +] + +[[package]] +name = "solana-fee-calculator" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89bc408da0fb3812bc3008189d148b4d3e08252c79ad810b245482a3f70cd8d" +dependencies = [ + "log", + "serde", + "serde_derive", +] + +[[package]] +name = "solana-fee-calculator" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a73cc03ca4bed871ca174558108835f8323e85917bb38b9c81c7af2ab853efe" +dependencies = [ + "log", + "serde", + "serde_derive", +] + +[[package]] +name = "solana-fee-structure" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33adf673581c38e810bf618f745bf31b683a0a4a4377682e6aaac5d9a058dd4e" +dependencies = [ + "serde", + "serde_derive", + "solana-message 2.4.0", + "solana-native-token 2.2.2", +] + +[[package]] +name = "solana-genesis-config" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3725085d47b96d37fef07a29d78d2787fc89a0b9004c66eed7753d1e554989f" +dependencies = [ + "bincode", + "chrono", + "memmap2", + "serde", + "serde_derive", + "solana-account", + "solana-clock 2.2.2", + "solana-cluster-type", + "solana-epoch-schedule 2.2.1", + "solana-fee-calculator 2.2.1", + "solana-hash 2.3.0", + "solana-inflation", + "solana-keypair", + "solana-logger", + "solana-poh-config", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-sha256-hasher 2.3.0", + "solana-shred-version", + "solana-signer", + "solana-time-utils", +] + +[[package]] +name = "solana-hard-forks" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c28371f878e2ead55611d8ba1b5fb879847156d04edea13693700ad1a28baf" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-hash" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b96e9f0300fa287b545613f007dfe20043d7812bee255f418c1eb649c93b63" +dependencies = [ + "borsh 1.5.7", + "bytemuck", + "bytemuck_derive", + "five8", + "js-sys", + "serde", + "serde_derive", + "solana-atomic-u64 2.2.1", + "solana-sanitize 2.2.1", + "wasm-bindgen", +] + +[[package]] +name = "solana-hash" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a063723b9e84c14d8c0d2cdf0268207dc7adecf546e31251f9e07c7b00b566c" +dependencies = [ + "borsh 1.5.7", + "bytemuck", + "bytemuck_derive", + "five8", + "serde", + "serde_derive", + "solana-atomic-u64 3.0.0", + "solana-sanitize 3.0.1", +] + +[[package]] +name = "solana-inflation" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23eef6a09eb8e568ce6839573e4966850e85e9ce71e6ae1a6c930c1c43947de3" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-instruction" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47298e2ce82876b64f71e9d13a46bc4b9056194e7f9937ad3084385befa50885" +dependencies = [ + "bincode", + "borsh 1.5.7", + "getrandom 0.2.10", + "js-sys", + "num-traits", + "serde", + "serde_derive", + "solana-define-syscall 2.3.0", + "solana-pubkey 2.4.0", + "wasm-bindgen", +] + +[[package]] +name = "solana-instruction" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df4e8fcba01d7efa647ed20a081c234475df5e11a93acb4393cc2c9a7b99bab" +dependencies = [ + "bincode", + "borsh 1.5.7", + "serde", + "serde_derive", + "solana-define-syscall 3.0.0", + "solana-instruction-error", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-instruction-error" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25c536ad0ce25d84a64f48dedcb773e764827e0ef781eda41fa1fa35f5d64b38" +checksum = "b1f0d483b8ae387178d9210e0575b666b05cdd4bd0f2f188128249f6e454d39d" dependencies = [ - "solana-account-info", - "solana-define-syscall", - "solana-instruction", - "solana-program-error", - "solana-pubkey", - "solana-stable-layout", + "num-traits", + "solana-program-error 3.0.0", ] [[package]] -name = "solana-curve25519" -version = "2.1.0" +name = "solana-instructions-sysvar" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f934d38b6f2a940fb1e1d8eaa17a14ffd3773b37be9fb29fa4bcec1bac5e4591" +checksum = "e0e85a6fad5c2d0c4f5b91d34b8ca47118fc593af706e523cdbedf846a954f57" dependencies = [ - "bytemuck", - "bytemuck_derive", - "curve25519-dalek 4.1.3", - "solana-program", - "thiserror", + "bitflags 2.9.4", + "solana-account-info 2.3.0", + "solana-instruction 2.3.0", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "solana-sanitize 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-serialize-utils 2.2.1", + "solana-sysvar-id 2.2.1", ] [[package]] -name = "solana-decode-error" -version = "2.1.0" +name = "solana-instructions-sysvar" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5a431f532d030098e81d120877f2dddbd3dd90bea5b259198a6aae4ff6456c3" +checksum = "7ddf67876c541aa1e21ee1acae35c95c6fbc61119814bfef70579317a5e26955" dependencies = [ - "num-traits", + "bitflags 2.9.4", + "solana-account-info 3.0.0", + "solana-instruction 3.0.0", + "solana-instruction-error", + "solana-program-error 3.0.0", + "solana-pubkey 3.0.0", + "solana-sanitize 3.0.1", + "solana-sdk-ids 3.0.0", + "solana-serialize-utils 3.1.0", + "solana-sysvar-id 3.0.0", ] [[package]] -name = "solana-define-syscall" -version = "2.1.0" +name = "solana-keccak-hasher" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7062ae1de58e294d3bee5fd2c89efc155b7f7383ddce4cb88345dfafaaabc5bd" +checksum = "c7aeb957fbd42a451b99235df4942d96db7ef678e8d5061ef34c9b34cae12f79" +dependencies = [ + "sha3", + "solana-define-syscall 2.3.0", + "solana-hash 2.3.0", + "solana-sanitize 2.2.1", +] [[package]] -name = "solana-derivation-path" -version = "2.1.0" +name = "solana-keccak-hasher" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12080d9bf8eecd559c6f40b5aaf9e47f7f28f515218087f83f02e493b46d8388" +checksum = "57eebd3012946913c8c1b8b43cdf8a6249edb09c0b6be3604ae910332a3acd97" dependencies = [ - "derivation-path", - "qstring", - "uriparse", + "sha3", + "solana-define-syscall 3.0.0", + "solana-hash 3.0.0", ] [[package]] -name = "solana-epoch-schedule" -version = "2.1.0" +name = "solana-keypair" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65c4cf7d7c266d353169cf4feeada5e4bba3a55f33715535fa1ef49080eac3e0" +checksum = "3dbb7042c2e0c561afa07242b2099d55c57bd1b1da3b6476932197d84e15e3e4" dependencies = [ - "serde", - "serde_derive", - "solana-sdk-macro", + "bs58", + "ed25519-dalek", + "ed25519-dalek-bip32", + "rand 0.7.3", + "solana-derivation-path", + "solana-pubkey 2.4.0", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature", + "solana-signer", + "wasm-bindgen", ] [[package]] -name = "solana-faucet" -version = "2.1.0" +name = "solana-last-restart-slot" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "281c481c0efa41a7ddada5dbffabee9099a6b01e9d748b7135366df589f7415e" +checksum = "4a6360ac2fdc72e7463565cd256eedcf10d7ef0c28a1249d261ec168c1b55cdd" dependencies = [ - "bincode", - "byteorder", - "clap 2.34.0", - "crossbeam-channel", - "log", "serde", "serde_derive", - "solana-clap-utils", - "solana-cli-config", - "solana-logger", - "solana-metrics", - "solana-sdk", - "solana-version", - "spl-memo 5.0.0", - "thiserror", - "tokio", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-sysvar-id 2.2.1", ] [[package]] -name = "solana-feature-set" -version = "2.1.0" +name = "solana-last-restart-slot" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cebf45992982065a0b01b4e109bf039b2ebf6394b21672382fd951516d4c9b0" +checksum = "dcda154ec827f5fc1e4da0af3417951b7e9b8157540f81f936c4a8b1156134d0" dependencies = [ - "lazy_static", - "solana-clock", - "solana-epoch-schedule", - "solana-hash", - "solana-pubkey", - "solana-sha256-hasher", + "serde", + "serde_derive", + "solana-sdk-ids 3.0.0", + "solana-sdk-macro 3.0.0", + "solana-sysvar-id 3.0.0", ] [[package]] -name = "solana-fee-calculator" -version = "2.1.0" +name = "solana-loader-v2-interface" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2befe056ece2eb5807298c2b569a35ee52f79df859bdd16a1f97869f8224a28" +checksum = "d8ab08006dad78ae7cd30df8eea0539e207d08d91eaefb3e1d49a446e1c49654" dependencies = [ - "log", "serde", + "serde_bytes", "serde_derive", + "solana-instruction 2.3.0", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", ] [[package]] -name = "solana-hash" -version = "2.1.0" +name = "solana-loader-v3-interface" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1807bc4e9e1d25271514167d5a1e698ce5a330bce547a368242dd63b355b5faa" +checksum = "6f7162a05b8b0773156b443bccd674ea78bb9aa406325b467ea78c06c99a63a2" dependencies = [ - "borsh 1.5.1", - "bs58", - "bytemuck", - "bytemuck_derive", - "js-sys", "serde", + "serde_bytes", "serde_derive", - "solana-atomic-u64", - "solana-sanitize", - "wasm-bindgen", + "solana-instruction 2.3.0", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", + "solana-system-interface 1.0.0", ] [[package]] -name = "solana-inflation" -version = "2.1.0" +name = "solana-loader-v4-interface" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a60b572cdf0ec8fcf5a53e5ba4e3e19814dd96c2b9c156d5828be68d0d2e7103" +checksum = "706a777242f1f39a83e2a96a2a6cb034cb41169c6ecbee2cf09cb873d9659e7e" dependencies = [ "serde", + "serde_bytes", "serde_derive", + "solana-instruction 2.3.0", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", + "solana-system-interface 1.0.0", ] [[package]] -name = "solana-inline-spl" -version = "2.1.0" +name = "solana-logger" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24c9c6590e4eaf91efa887b2689b2941fe4b324bccd9a95f77853168f3d9a88" +checksum = "db8e777ec1afd733939b532a42492d888ec7c88d8b4127a5d867eb45c6eb5cd5" dependencies = [ - "bytemuck", - "solana-pubkey", + "env_logger", + "lazy_static", + "libc", + "log", + "signal-hook", ] [[package]] -name = "solana-instruction" -version = "2.1.0" +name = "solana-measure" +version = "2.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "776bf2178d04969492949d3b1b8d0885160d2436b9e90b55fd22ab816d6b0539" + +[[package]] +name = "solana-message" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfef689e06e5c7cb6206d4dc61ac77733de4f72d754e0d531393206abc27dbe4" +checksum = "1796aabce376ff74bf89b78d268fa5e683d7d7a96a0a4e4813ec34de49d5314b" dependencies = [ "bincode", - "borsh 1.5.1", - "getrandom 0.2.10", - "js-sys", - "num-traits", + "blake3", + "lazy_static", "serde", "serde_derive", - "solana-define-syscall", - "solana-pubkey", + "solana-bincode", + "solana-hash 2.3.0", + "solana-instruction 2.3.0", + "solana-pubkey 2.4.0", + "solana-sanitize 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-short-vec 2.2.1", + "solana-system-interface 1.0.0", + "solana-transaction-error 2.2.1", "wasm-bindgen", ] [[package]] -name = "solana-last-restart-slot" -version = "2.1.0" +name = "solana-message" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3186feae497bdfd2e77bfa56caed38b1cb1b0f389506666e3331f0b9ae799cb" +checksum = "85666605c9fd727f865ed381665db0a8fc29f984a030ecc1e40f43bfb2541623" dependencies = [ + "lazy_static", "serde", "serde_derive", - "solana-sdk-macro", + "solana-address", + "solana-hash 3.0.0", + "solana-instruction 3.0.0", + "solana-sanitize 3.0.1", + "solana-sdk-ids 3.0.0", + "solana-short-vec 3.0.0", + "solana-transaction-error 3.0.0", ] [[package]] -name = "solana-log-collector" -version = "2.1.0" +name = "solana-metrics" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b529f5736a6c0794a885dac2e091138d3db6d924335906f117a62b58b0d3b5dc" +checksum = "e208835e05d7017d78619a441e30399c762fcce499d1d20577c553774680f66f" dependencies = [ + "crossbeam-channel", + "gethostname", "log", + "reqwest 0.12.23", + "solana-cluster-type", + "solana-sha256-hasher 2.3.0", + "solana-time-utils", + "thiserror 2.0.16", ] [[package]] -name = "solana-logger" -version = "2.1.0" +name = "solana-msg" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "367c5431bad14b10fbb62614b48720b746672558dba3244167ff7d251890c355" +checksum = "f36a1a14399afaabc2781a1db09cb14ee4cc4ee5c7a5a3cfcc601811379a8092" dependencies = [ - "env_logger", - "lazy_static", - "log", + "solana-define-syscall 2.3.0", ] [[package]] -name = "solana-measure" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b2047a2f588082b71080b060918f107c3330ae1505f759c3b2d74bae9d9c88" - -[[package]] -name = "solana-metrics" -version = "2.1.0" +name = "solana-msg" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6319c74238e8ed4f7159fd37c693a574ab8316d03b053103f9cc83dce13f1d5c" +checksum = "264275c556ea7e22b9d3f87d56305546a38d4eee8ec884f3b126236cb7dcbbb4" dependencies = [ - "crossbeam-channel", - "gethostname", - "lazy_static", - "log", - "reqwest", - "solana-sdk", - "thiserror", + "solana-define-syscall 3.0.0", ] [[package]] -name = "solana-msg" -version = "2.1.0" +name = "solana-native-token" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f7551f85064bc7299d56dbd7126258b084a2d78d0325b1579324f818b405123" -dependencies = [ - "solana-define-syscall", -] +checksum = "307fb2f78060995979e9b4f68f833623565ed4e55d3725f100454ce78a99a1a3" [[package]] name = "solana-native-token" -version = "2.1.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0c4074f5fc67574dabd8f30fe6e51e290a812d88326b19b49c462058e23340" +checksum = "ae8dd4c280dca9d046139eb5b7a5ac9ad10403fbd64964c7d7571214950d758f" [[package]] name = "solana-net-utils" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbac19474a4c4f91cb264c2fccead8a1a4f65384ce650b24360d9df5650e65bc" +checksum = "b4f42a434c8bf97ed2ae5080f66016abf25023a7fd8a26fd8d88e808446c7500" dependencies = [ + "anyhow", "bincode", - "crossbeam-channel", + "bytes", + "itertools 0.12.1", "log", "nix", "rand 0.8.5", "serde", "serde_derive", - "socket2 0.5.7", - "solana-sdk", + "socket2 0.5.10", + "solana-serde", "tokio", "url", ] +[[package]] +name = "solana-nonce" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703e22eb185537e06204a5bd9d509b948f0066f2d1d814a6f475dafb3ddf1325" +dependencies = [ + "serde", + "serde_derive", + "solana-fee-calculator 2.2.1", + "solana-hash 2.3.0", + "solana-pubkey 2.4.0", + "solana-sha256-hasher 2.3.0", +] + +[[package]] +name = "solana-nonce" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abbdc6c8caf1c08db9f36a50967539d0f72b9f1d4aea04fec5430f532e5afadc" +dependencies = [ + "solana-fee-calculator 3.0.0", + "solana-hash 3.0.0", + "solana-pubkey 3.0.0", + "solana-sha256-hasher 3.0.0", +] + +[[package]] +name = "solana-nonce-account" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde971a20b8dbf60144d6a84439dda86b5466e00e2843091fe731083cda614da" +dependencies = [ + "solana-account", + "solana-hash 2.3.0", + "solana-nonce 2.2.1", + "solana-sdk-ids 2.2.1", +] + +[[package]] +name = "solana-nostd-keccak" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8ced70920435b1baa58f76e6f84bbc1110ddd1d6161ec76b6d731ae8431e9c4" +dependencies = [ + "sha3", +] + +[[package]] +name = "solana-offchain-message" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b526398ade5dea37f1f147ce55dae49aa017a5d7326606359b0445ca8d946581" +dependencies = [ + "num_enum", + "solana-hash 2.3.0", + "solana-packet", + "solana-pubkey 2.4.0", + "solana-sanitize 2.2.1", + "solana-sha256-hasher 2.3.0", + "solana-signature", + "solana-signer", +] + [[package]] name = "solana-packet" -version = "2.1.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dafc2d84e57dbfe32583fe915962bd2ca3af6be496628a871db3c3d697b38d7" +checksum = "004f2d2daf407b3ec1a1ca5ec34b3ccdfd6866dd2d3c7d0715004a96e4b6d127" dependencies = [ "bincode", - "bitflags 2.6.0", + "bitflags 2.9.4", "cfg_eval", "serde", "serde_derive", @@ -4328,208 +6310,323 @@ dependencies = [ [[package]] name = "solana-perf" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8299f1ba518f9888da8cafa861addc6ffdd639c689e3ce219ae08212c0dcd0e" +checksum = "aed1dfb7f2c51b6b948531fd0127f8c10c71a9640c9804f106b41e6435adc768" dependencies = [ "ahash", "bincode", "bv", + "bytes", "caps", "curve25519-dalek 4.1.3", "dlopen2", "fnv", - "lazy_static", "libc", "log", "nix", "rand 0.8.5", "rayon", "serde", + "solana-hash 2.3.0", + "solana-message 2.4.0", "solana-metrics", + "solana-packet", + "solana-pubkey 2.4.0", "solana-rayon-threadlimit", - "solana-sdk", - "solana-short-vec", - "solana-vote-program", + "solana-sdk-ids 2.2.1", + "solana-short-vec 2.2.1", + "solana-signature", + "solana-time-utils", +] + +[[package]] +name = "solana-poh-config" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d650c3b4b9060082ac6b0efbbb66865089c58405bfb45de449f3f2b91eccee75" +dependencies = [ + "serde", + "serde_derive", ] [[package]] name = "solana-precompile-error" -version = "2.1.0" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a30ab58b9e37cde4e5577282670f30df71b97b6b06dbdb420e9b84e57b831227" +checksum = "4d87b2c1f5de77dfe2b175ee8dd318d196aaca4d0f66f02842f80c852811f9f8" dependencies = [ "num-traits", "solana-decode-error", ] +[[package]] +name = "solana-precompiles" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36e92768a57c652edb0f5d1b30a7d0bc64192139c517967c18600debe9ae3832" +dependencies = [ + "lazy_static", + "solana-ed25519-program", + "solana-feature-set", + "solana-message 2.4.0", + "solana-precompile-error", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", + "solana-secp256k1-program", + "solana-secp256r1-program", +] + +[[package]] +name = "solana-presigner" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81a57a24e6a4125fc69510b6774cd93402b943191b6cddad05de7281491c90fe" +dependencies = [ + "solana-pubkey 2.4.0", + "solana-signature", + "solana-signer", +] + [[package]] name = "solana-program" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9040decf2f295d35da22557eeab3768ab8dfca8aed9afe668663c8fa0e97d60e" +checksum = "98eca145bd3545e2fbb07166e895370576e47a00a7d824e325390d33bf467210" dependencies = [ - "base64 0.22.1", "bincode", - "bitflags 2.6.0", "blake3", "borsh 0.10.3", - "borsh 1.5.1", + "borsh 1.5.7", "bs58", - "bv", "bytemuck", - "bytemuck_derive", "console_error_panic_hook", "console_log", - "curve25519-dalek 4.1.3", - "five8_const", "getrandom 0.2.10", - "js-sys", "lazy_static", "log", "memoffset", "num-bigint 0.4.6", "num-derive 0.4.0", "num-traits", - "parking_lot", "rand 0.8.5", "serde", "serde_bytes", "serde_derive", - "sha2 0.10.8", - "sha3", - "solana-account-info", - "solana-atomic-u64", + "solana-account-info 2.3.0", + "solana-address-lookup-table-interface 2.2.2", + "solana-atomic-u64 2.2.1", + "solana-big-mod-exp 2.2.1", "solana-bincode", - "solana-borsh", - "solana-clock", - "solana-cpi", + "solana-blake3-hasher 2.2.1", + "solana-borsh 2.2.1", + "solana-clock 2.2.2", + "solana-cpi 2.2.1", "solana-decode-error", - "solana-define-syscall", - "solana-epoch-schedule", - "solana-fee-calculator", - "solana-hash", - "solana-instruction", - "solana-last-restart-slot", - "solana-msg", - "solana-native-token", - "solana-program-entrypoint", - "solana-program-error", - "solana-program-memory", - "solana-program-option", - "solana-program-pack", - "solana-pubkey", - "solana-rent", - "solana-sanitize", - "solana-sdk-macro", - "solana-secp256k1-recover", - "solana-serde-varint", - "solana-serialize-utils", - "solana-sha256-hasher", - "solana-short-vec", - "solana-slot-hashes", - "solana-slot-history", - "solana-stable-layout", - "solana-transaction-error", - "thiserror", + "solana-define-syscall 2.3.0", + "solana-epoch-rewards 2.2.1", + "solana-epoch-schedule 2.2.1", + "solana-example-mocks 2.2.1", + "solana-feature-gate-interface", + "solana-fee-calculator 2.2.1", + "solana-hash 2.3.0", + "solana-instruction 2.3.0", + "solana-instructions-sysvar 2.2.2", + "solana-keccak-hasher 2.2.1", + "solana-last-restart-slot 2.2.1", + "solana-loader-v2-interface", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-message 2.4.0", + "solana-msg 2.2.1", + "solana-native-token 2.2.2", + "solana-nonce 2.2.1", + "solana-program-entrypoint 2.3.0", + "solana-program-error 2.2.2", + "solana-program-memory 2.3.1", + "solana-program-option 2.2.1", + "solana-program-pack 2.2.1", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sanitize 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-secp256k1-recover 2.2.1", + "solana-serde-varint 2.2.2", + "solana-serialize-utils 2.2.1", + "solana-sha256-hasher 2.3.0", + "solana-short-vec 2.2.1", + "solana-slot-hashes 2.2.1", + "solana-slot-history 2.2.1", + "solana-stable-layout 2.2.1", + "solana-stake-interface", + "solana-system-interface 1.0.0", + "solana-sysvar 2.3.0", + "solana-sysvar-id 2.2.1", + "solana-vote-interface", + "thiserror 2.0.16", "wasm-bindgen", ] +[[package]] +name = "solana-program" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91b12305dd81045d705f427acd0435a2e46444b65367d7179d7bdcfc3bc5f5eb" +dependencies = [ + "memoffset", + "solana-account-info 3.0.0", + "solana-big-mod-exp 3.0.0", + "solana-blake3-hasher 3.0.0", + "solana-borsh 3.0.0", + "solana-clock 3.0.0", + "solana-cpi 3.0.0", + "solana-define-syscall 3.0.0", + "solana-epoch-rewards 3.0.0", + "solana-epoch-schedule 3.0.0", + "solana-epoch-stake", + "solana-example-mocks 3.0.0", + "solana-fee-calculator 3.0.0", + "solana-hash 3.0.0", + "solana-instruction 3.0.0", + "solana-instruction-error", + "solana-instructions-sysvar 3.0.0", + "solana-keccak-hasher 3.0.0", + "solana-last-restart-slot 3.0.0", + "solana-msg 3.0.0", + "solana-native-token 3.0.0", + "solana-program-entrypoint 3.1.0", + "solana-program-error 3.0.0", + "solana-program-memory 3.0.0", + "solana-program-option 3.0.0", + "solana-program-pack 3.0.0", + "solana-pubkey 3.0.0", + "solana-rent 3.0.0", + "solana-sdk-ids 3.0.0", + "solana-secp256k1-recover 3.0.0", + "solana-serde-varint 3.0.0", + "solana-serialize-utils 3.1.0", + "solana-sha256-hasher 3.0.0", + "solana-short-vec 3.0.0", + "solana-slot-hashes 3.0.0", + "solana-slot-history 3.0.0", + "solana-stable-layout 3.0.0", + "solana-sysvar 3.0.0", + "solana-sysvar-id 3.0.0", +] + [[package]] name = "solana-program-entrypoint" -version = "2.1.0" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32ce041b1a0ed275290a5008ee1a4a6c48f5054c8a3d78d313c08958a06aedbd" +dependencies = [ + "solana-account-info 2.3.0", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", +] + +[[package]] +name = "solana-program-entrypoint" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6557cf5b5e91745d1667447438a1baa7823c6086e4ece67f8e6ebfa7a8f72660" +dependencies = [ + "solana-account-info 3.0.0", + "solana-define-syscall 3.0.0", + "solana-msg 3.0.0", + "solana-program-error 3.0.0", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-program-error" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee2e0217d642e2ea4bee237f37bd61bb02aec60da3647c48ff88f6556ade775" +dependencies = [ + "borsh 1.5.7", + "num-traits", + "serde", + "serde_derive", + "solana-decode-error", + "solana-instruction 2.3.0", + "solana-msg 2.2.1", + "solana-pubkey 2.4.0", +] + +[[package]] +name = "solana-program-error" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eb90f3fa3e979b912451a404508f1f90bb6e5c1d7767625f622b20016fb9fde" +checksum = "a1af32c995a7b692a915bb7414d5f8e838450cf7c70414e763d8abcae7b51f28" dependencies = [ - "solana-account-info", - "solana-msg", - "solana-program-error", - "solana-pubkey", + "borsh 1.5.7", + "serde", + "serde_derive", ] [[package]] -name = "solana-program-error" -version = "2.1.0" +name = "solana-program-memory" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd089caeef26dd07bd12b7b67d45e92faddc2fc67a960f316df7ae4776a2f3d5" +checksum = "3a5426090c6f3fd6cfdc10685322fede9ca8e5af43cd6a59e98bfe4e91671712" dependencies = [ - "borsh 1.5.1", - "num-traits", - "serde", - "serde_derive", - "solana-decode-error", - "solana-instruction", - "solana-msg", - "solana-pubkey", + "solana-define-syscall 2.3.0", ] [[package]] name = "solana-program-memory" -version = "2.1.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed4bc044dc2b49c323aeff04aec03c908a052e278c2edf2f7616f32fc0f1bcd9" +checksum = "10e5660c60749c7bfb30b447542529758e4dbcecd31b1e8af1fdc92e2bdde90a" dependencies = [ - "num-traits", - "solana-define-syscall", + "solana-define-syscall 3.0.0", ] [[package]] name = "solana-program-option" -version = "2.1.0" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc677a2e9bc616eda6dbdab834d463372b92848b2bfe4a1ed4e4b4adba3397d0" + +[[package]] +name = "solana-program-option" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3babbdffd81994c043fc9a61458ce87496218825d6e9a303de643c0a53089b9a" +checksum = "8e7b4ddb464f274deb4a497712664c3b612e3f5f82471d4e47710fc4ab1c3095" [[package]] name = "solana-program-pack" -version = "2.1.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fb28439d23e1f505e59c7a14ed5012365ab7aa0f20dc7bda048e02ff231cf6" +checksum = "319f0ef15e6e12dc37c597faccb7d62525a509fec5f6975ecb9419efddeb277b" dependencies = [ - "solana-program-error", + "solana-program-error 2.2.2", ] [[package]] -name = "solana-program-runtime" -version = "2.1.0" +name = "solana-program-pack" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1de51df173401d50c0f4cf750f5070d7a4c82125a03c1aec9622dc041b0b54" +checksum = "c169359de21f6034a63ebf96d6b380980307df17a8d371344ff04a883ec4e9d0" dependencies = [ - "base64 0.22.1", - "bincode", - "enum-iterator", - "itertools 0.12.1", - "libc", - "log", - "num-derive 0.4.0", - "num-traits", - "percentage", - "rand 0.8.5", - "serde", - "solana-compute-budget", - "solana-feature-set", - "solana-log-collector", - "solana-measure", - "solana-metrics", - "solana-sdk", - "solana-timings", - "solana-type-overrides", - "solana-vote", - "solana_rbpf", - "thiserror", + "solana-program-error 3.0.0", ] [[package]] name = "solana-pubkey" -version = "2.1.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea3215775fcedf200d47590c7e2ce9a3a46bc2b7d3f77d0eae9c6edf0a39aec" +checksum = "9b62adb9c3261a052ca1f999398c388f1daf558a1b492f60a6d9e64857db4ff1" dependencies = [ "borsh 0.10.3", - "borsh 1.5.1", - "bs58", + "borsh 1.5.7", "bytemuck", "bytemuck_derive", "curve25519-dalek 4.1.3", + "five8", "five8_const", "getrandom 0.2.10", "js-sys", @@ -4537,32 +6634,43 @@ dependencies = [ "rand 0.8.5", "serde", "serde_derive", - "solana-atomic-u64", + "solana-atomic-u64 2.2.1", "solana-decode-error", - "solana-define-syscall", - "solana-sanitize", - "solana-sha256-hasher", + "solana-define-syscall 2.3.0", + "solana-sanitize 2.2.1", + "solana-sha256-hasher 2.3.0", "wasm-bindgen", ] +[[package]] +name = "solana-pubkey" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8909d399deb0851aa524420beeb5646b115fd253ef446e35fe4504c904da3941" +dependencies = [ + "solana-address", +] + [[package]] name = "solana-pubsub-client" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d28adf5ff89c19ef3cb24d0f484afa05852697881c2e4ef12aec190d61f76d8" +checksum = "df314b22923b112c7bd90629b42af3881222b8955e3a1d4cf2b21f5ab794a0bb" dependencies = [ "crossbeam-channel", "futures-util", + "http 0.2.12", "log", - "reqwest", "semver", "serde", "serde_derive", "serde_json", - "solana-account-decoder", - "solana-rpc-client-api", - "solana-sdk", - "thiserror", + "solana-account-decoder-client-types", + "solana-clock 2.2.2", + "solana-pubkey 2.4.0", + "solana-rpc-client-types", + "solana-signature", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-tungstenite", @@ -4572,48 +6680,61 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "259c6d420c0b7620557700f13fbbdb00afbb1b82274485c27ba30dd660ea921b" +checksum = "022865e50402d978b90cc3090d6d2a098ed9af549ce69a7deed92cf203f3a4a3" dependencies = [ "async-lock", "async-trait", "futures", "itertools 0.12.1", - "lazy_static", "log", "quinn", "quinn-proto", - "rustls 0.23.16", + "rustls 0.23.32", "solana-connection-cache", + "solana-keypair", "solana-measure", "solana-metrics", "solana-net-utils", + "solana-pubkey 2.4.0", + "solana-quic-definitions", "solana-rpc-client-api", - "solana-sdk", + "solana-signer", "solana-streamer", - "thiserror", + "solana-tls-utils", + "solana-transaction-error 2.2.1", + "thiserror 2.0.16", "tokio", ] +[[package]] +name = "solana-quic-definitions" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf0d4d5b049eb1d0c35f7b18f305a27c8986fc5c0c9b383e97adaa35334379e" +dependencies = [ + "solana-keypair", +] + [[package]] name = "solana-rayon-threadlimit" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c69806ad1a7b0986f750134e13e55d83919631d81a2328a588615740e14ed0a" +checksum = "a99a753bb24fd7f697d92343a6f6b50cd1e9e1e5e6267b9224821ab3972939e8" dependencies = [ - "lazy_static", "num_cpus", ] [[package]] name = "solana-remote-wallet" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f36cf8ad0090276b5e9c73512df889b84092761ed733a26781b164c9e95f544" +checksum = "72aeed3f2ad4ff61adfd97d0dfde9fb73b5bf1ece93384690e2119ed49b6f0f2" dependencies = [ "console", "dialoguer", + "hidapi", "log", "num-derive 0.4.0", "num-traits", @@ -4621,275 +6742,625 @@ dependencies = [ "qstring", "semver", "solana-derivation-path", - "solana-sdk", - "thiserror", + "solana-offchain-message", + "solana-pubkey 2.4.0", + "solana-signature", + "solana-signer", + "thiserror 2.0.16", "uriparse", ] [[package]] name = "solana-rent" -version = "2.1.0" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1aea8fdea9de98ca6e8c2da5827707fb3842833521b528a713810ca685d2480" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-rent" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b702d8c43711e3c8a9284a4f1bbc6a3de2553deb25b0c8142f9a44ef0ce5ddc1" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 3.0.0", + "solana-sdk-macro 3.0.0", + "solana-sysvar-id 3.0.0", +] + +[[package]] +name = "solana-rent-collector" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "127e6dfa51e8c8ae3aa646d8b2672bc4ac901972a338a9e1cd249e030564fb9d" +dependencies = [ + "serde", + "serde_derive", + "solana-account", + "solana-clock 2.2.2", + "solana-epoch-schedule 2.2.1", + "solana-genesis-config", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", +] + +[[package]] +name = "solana-rent-debits" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f6f9113c6003492e74438d1288e30cffa8ccfdc2ef7b49b9e816d8034da18cd" +dependencies = [ + "solana-pubkey 2.4.0", + "solana-reward-info", +] + +[[package]] +name = "solana-reserved-account-keys" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4b22ea19ca2a3f28af7cd047c914abf833486bf7a7c4a10fc652fff09b385b1" +dependencies = [ + "lazy_static", + "solana-feature-set", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", +] + +[[package]] +name = "solana-reward-info" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aab3f4a270196c38d62c3bb3c7a2f07732af2c772b50da49c9b1e2c9d2ace286" +checksum = "18205b69139b1ae0ab8f6e11cdcb627328c0814422ad2482000fa2ca54ae4a2f" dependencies = [ "serde", "serde_derive", - "solana-sdk-macro", ] [[package]] name = "solana-rpc-client" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b05822aceeb484074a72d82a1b289da9fc3383f9ba3f55ce4bfd003bf9d62e6" +checksum = "9238867c44e246ddd0427b8e8e21de1b98c6e63a243ae36c7d8429d2e0b29390" dependencies = [ "async-trait", "base64 0.22.1", "bincode", "bs58", + "futures", "indicatif", "log", - "reqwest", + "reqwest 0.12.23", "reqwest-middleware", "semver", "serde", "serde_derive", "serde_json", + "solana-account", "solana-account-decoder-client-types", + "solana-clock 2.2.2", + "solana-commitment-config", + "solana-epoch-info", + "solana-epoch-schedule 2.2.1", + "solana-feature-gate-interface", + "solana-hash 2.3.0", + "solana-instruction 2.3.0", + "solana-message 2.4.0", + "solana-pubkey 2.4.0", "solana-rpc-client-api", - "solana-sdk", + "solana-signature", + "solana-transaction", + "solana-transaction-error 2.2.1", "solana-transaction-status-client-types", "solana-version", - "solana-vote-program", + "solana-vote-interface", "tokio", ] [[package]] name = "solana-rpc-client-api" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb9c6e64f01cfafef9b2d43d6adb02979bb22f579ec8ee88b77796259acce92e" +checksum = "735b5dc6f2ec3cfb1a39f1327e5855c741edaa8aa7eb1613e6d918cda4cf3c29" dependencies = [ "anyhow", - "base64 0.22.1", - "bs58", "jsonrpc-core", - "reqwest", + "reqwest 0.12.23", "reqwest-middleware", - "semver", "serde", "serde_derive", "serde_json", "solana-account-decoder-client-types", - "solana-inline-spl", - "solana-sdk", + "solana-clock 2.2.2", + "solana-rpc-client-types", + "solana-signer", + "solana-transaction-error 2.2.1", "solana-transaction-status-client-types", - "solana-version", - "thiserror", + "thiserror 2.0.16", ] [[package]] name = "solana-rpc-client-nonce-utils" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f0ab2d1ca3769c5058c689b438d35eb1cb7d2a32fc4b2b7c16fe72fa187927c" +checksum = "32cbcb994c698ffaea792ec0dba3ae84259c53e7dc464cc6b2321a3d593c7f61" dependencies = [ + "solana-account", + "solana-commitment-config", + "solana-hash 2.3.0", + "solana-message 2.4.0", + "solana-nonce 2.2.1", + "solana-pubkey 2.4.0", "solana-rpc-client", - "solana-sdk", - "thiserror", + "solana-sdk-ids 2.2.1", + "thiserror 2.0.16", +] + +[[package]] +name = "solana-rpc-client-types" +version = "2.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b96eeec383718c1a4dbbebc4039029ae779d7e6ec5586b6a330803132d04f4f" +dependencies = [ + "base64 0.22.1", + "bs58", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account", + "solana-account-decoder-client-types", + "solana-clock 2.2.2", + "solana-commitment-config", + "solana-fee-calculator 2.2.1", + "solana-inflation", + "solana-pubkey 2.4.0", + "solana-transaction-error 2.2.1", + "solana-transaction-status-client-types", + "solana-version", + "spl-generic-token", + "thiserror 2.0.16", ] [[package]] name = "solana-sanitize" -version = "2.1.0" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61f1bc1357b8188d9c4a3af3fc55276e56987265eb7ad073ae6f8180ee54cecf" + +[[package]] +name = "solana-sanitize" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "203b90994371db8cade8e885f74ec9f68ee02a32b25d514594158b2551a4e5ed" +checksum = "dcf09694a0fc14e5ffb18f9b7b7c0f15ecb6eac5b5610bf76a1853459d19daf9" [[package]] name = "solana-sdk" -version = "2.1.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524604d94185c189616296e5b7da1014cc96d1e446bd2b26f247f00708b9225a" +checksum = "8cc0e4a7635b902791c44b6581bfb82f3ada32c5bc0929a64f39fe4bb384c86a" dependencies = [ "bincode", - "bitflags 2.6.0", - "borsh 1.5.1", "bs58", - "bytemuck", - "bytemuck_derive", - "byteorder", - "chrono", - "digest 0.10.7", - "ed25519-dalek", - "ed25519-dalek-bip32", "getrandom 0.1.16", - "hmac 0.12.1", - "itertools 0.12.1", "js-sys", - "lazy_static", - "libsecp256k1", - "log", - "memmap2", - "num-derive 0.4.0", - "num-traits", - "num_enum", - "pbkdf2 0.11.0", - "rand 0.7.3", - "rand 0.8.5", "serde", - "serde_bytes", - "serde_derive", "serde_json", - "serde_with", - "sha2 0.10.8", - "sha3", - "siphasher", "solana-account", "solana-bn254", + "solana-client-traits", + "solana-cluster-type", + "solana-commitment-config", + "solana-compute-budget-interface", "solana-decode-error", "solana-derivation-path", - "solana-feature-set", - "solana-inflation", - "solana-instruction", - "solana-native-token", - "solana-packet", - "solana-precompile-error", - "solana-program", - "solana-program-memory", - "solana-pubkey", - "solana-sanitize", - "solana-sdk-macro", - "solana-secp256k1-recover", - "solana-serde-varint", - "solana-short-vec", - "solana-signature", - "solana-transaction-error", - "thiserror", - "wasm-bindgen", + "solana-ed25519-program", + "solana-epoch-info", + "solana-epoch-rewards-hasher", + "solana-feature-set", + "solana-fee-structure", + "solana-genesis-config", + "solana-hard-forks", + "solana-inflation", + "solana-instruction 2.3.0", + "solana-keypair", + "solana-message 2.4.0", + "solana-native-token 2.2.2", + "solana-nonce-account", + "solana-offchain-message", + "solana-packet", + "solana-poh-config", + "solana-precompile-error", + "solana-precompiles", + "solana-presigner", + "solana-program 2.3.0", + "solana-program-memory 2.3.1", + "solana-pubkey 2.4.0", + "solana-quic-definitions", + "solana-rent-collector", + "solana-rent-debits", + "solana-reserved-account-keys", + "solana-reward-info", + "solana-sanitize 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-secp256k1-program", + "solana-secp256k1-recover 2.2.1", + "solana-secp256r1-program", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-serde", + "solana-serde-varint 2.2.2", + "solana-short-vec 2.2.1", + "solana-shred-version", + "solana-signature", + "solana-signer", + "solana-system-transaction", + "solana-time-utils", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error 2.2.1", + "solana-validator-exit", + "thiserror 2.0.16", + "wasm-bindgen", +] + +[[package]] +name = "solana-sdk-ids" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5d8b9cc68d5c88b062a33e23a6466722467dde0035152d8fb1afbcdf350a5f" +dependencies = [ + "solana-pubkey 2.4.0", +] + +[[package]] +name = "solana-sdk-ids" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1b6d6aaf60669c592838d382266b173881c65fb1cdec83b37cb8ce7cb89f9ad" +dependencies = [ + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-sdk-macro" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86280da8b99d03560f6ab5aca9de2e38805681df34e0bb8f238e69b29433b9df" +dependencies = [ + "bs58", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "solana-sdk-macro" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6430000e97083460b71d9fbadc52a2ab2f88f53b3a4c5e58c5ae3640a0e8c00" +dependencies = [ + "bs58", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "solana-secp256k1-program" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f19833e4bc21558fe9ec61f239553abe7d05224347b57d65c2218aeeb82d6149" +dependencies = [ + "bincode", + "digest 0.10.7", + "libsecp256k1", + "serde", + "serde_derive", + "sha3", + "solana-feature-set", + "solana-instruction 2.3.0", + "solana-precompile-error", + "solana-sdk-ids 2.2.1", + "solana-signature", +] + +[[package]] +name = "solana-secp256k1-recover" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baa3120b6cdaa270f39444f5093a90a7b03d296d362878f7a6991d6de3bbe496" +dependencies = [ + "borsh 1.5.7", + "libsecp256k1", + "solana-define-syscall 2.3.0", + "thiserror 2.0.16", +] + +[[package]] +name = "solana-secp256k1-recover" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "394a4470477d66296af5217970a905b1c5569032a7732c367fb69e5666c8607e" +dependencies = [ + "k256", + "solana-define-syscall 3.0.0", + "thiserror 2.0.16", +] + +[[package]] +name = "solana-secp256r1-program" +version = "2.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce0ae46da3071a900f02d367d99b2f3058fe2e90c5062ac50c4f20cfedad8f0f" +dependencies = [ + "bytemuck", + "openssl", + "solana-feature-set", + "solana-instruction 2.3.0", + "solana-precompile-error", + "solana-sdk-ids 2.2.1", +] + +[[package]] +name = "solana-security-txt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" + +[[package]] +name = "solana-seed-derivable" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beb82b5adb266c6ea90e5cf3967235644848eac476c5a1f2f9283a143b7c97f" +dependencies = [ + "solana-derivation-path", ] [[package]] -name = "solana-sdk-macro" -version = "2.1.0" +name = "solana-seed-phrase" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd2265b93dce9d3dcf9f395abf1a85b5e06e4da4aa60ca147620003ac3abc67" +checksum = "36187af2324f079f65a675ec22b31c24919cb4ac22c79472e85d819db9bbbc15" dependencies = [ - "bs58", - "proc-macro2", - "quote", - "syn 2.0.86", + "hmac 0.12.1", + "pbkdf2 0.11.0", + "sha2 0.10.8", ] [[package]] -name = "solana-secp256k1-recover" -version = "2.1.0" +name = "solana-serde" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2eef5a00a75648273c3fb6e3d85b0c8c02fcc1e36c4271664dcc39b6b128d41" +checksum = "1931484a408af466e14171556a47adaa215953c7f48b24e5f6b0282763818b04" dependencies = [ - "borsh 1.5.1", - "libsecp256k1", - "solana-define-syscall", - "thiserror", + "serde", ] [[package]] -name = "solana-security-txt" -version = "1.1.1" +name = "solana-serde-varint" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" +checksum = "2a7e155eba458ecfb0107b98236088c3764a09ddf0201ec29e52a0be40857113" +dependencies = [ + "serde", +] [[package]] name = "solana-serde-varint" -version = "2.1.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aeb51d3c20e2a61db0ef72617f3b8c9207a342a867af454a95f17add9f6c262" +checksum = "3e5174c57d5ff3c1995f274d17156964664566e2cde18a07bba1586d35a70d3b" dependencies = [ "serde", ] [[package]] name = "solana-serialize-utils" -version = "2.1.0" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "817a284b63197d2b27afdba829c5ab34231da4a9b4e763466a003c40ca4f535e" +dependencies = [ + "solana-instruction 2.3.0", + "solana-pubkey 2.4.0", + "solana-sanitize 2.2.1", +] + +[[package]] +name = "solana-serialize-utils" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cfb0b57c6a431fb15ff33053caadb6c36aed4e1ce74bea9adfc459a710b3626" +checksum = "56e41dd8feea239516c623a02f0a81c2367f4b604d7965237fed0751aeec33ed" dependencies = [ - "solana-instruction", - "solana-pubkey", - "solana-sanitize", + "solana-instruction-error", + "solana-pubkey 3.0.0", + "solana-sanitize 3.0.1", ] [[package]] name = "solana-sha256-hasher" -version = "2.1.0" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa3feb32c28765f6aa1ce8f3feac30936f16c5c3f7eb73d63a5b8f6f8ecdc44" +dependencies = [ + "sha2 0.10.8", + "solana-define-syscall 2.3.0", + "solana-hash 2.3.0", +] + +[[package]] +name = "solana-sha256-hasher" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd115f3a1136314b0183235080d29023530c3a0a5df60505fdb7ea620eff9fd6" +checksum = "a9b912ba6f71cb202c0c3773ec77bf898fa9fe0c78691a2d6859b3b5b8954719" dependencies = [ "sha2 0.10.8", - "solana-define-syscall", - "solana-hash", + "solana-define-syscall 3.0.0", + "solana-hash 3.0.0", ] [[package]] name = "solana-short-vec" -version = "2.1.0" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c54c66f19b9766a56fa0057d060de8378676cb64987533fa088861858fc5a69" +dependencies = [ + "serde", +] + +[[package]] +name = "solana-short-vec" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08e55330b694db1139dcdf2a1ea7781abe8bd994dec2ab29e36abfd06e4e9274" +checksum = "b69d029da5428fc1c57f7d49101b2077c61f049d4112cd5fb8456567cc7d2638" dependencies = [ "serde", ] +[[package]] +name = "solana-shred-version" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afd3db0461089d1ad1a78d9ba3f15b563899ca2386351d38428faa5350c60a98" +dependencies = [ + "solana-hard-forks", + "solana-hash 2.3.0", + "solana-sha256-hasher 2.3.0", +] + [[package]] name = "solana-signature" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ad9784d110f195a3a4fe423479d18f05b01a1c380a1430644a3b3038fdbe2f0" +checksum = "64c8ec8e657aecfc187522fc67495142c12f35e55ddeca8698edbb738b8dbd8c" dependencies = [ - "bs58", "ed25519-dalek", - "generic-array", + "five8", "rand 0.8.5", "serde", + "serde-big-array", "serde_derive", - "solana-sanitize", + "solana-sanitize 2.2.1", +] + +[[package]] +name = "solana-signer" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c41991508a4b02f021c1342ba00bcfa098630b213726ceadc7cb032e051975b" +dependencies = [ + "solana-pubkey 2.4.0", + "solana-signature", + "solana-transaction-error 2.2.1", ] [[package]] name = "solana-slot-hashes" -version = "2.1.0" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8691982114513763e88d04094c9caa0376b867a29577939011331134c301ce" +dependencies = [ + "serde", + "serde_derive", + "solana-hash 2.3.0", + "solana-sdk-ids 2.2.1", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-slot-hashes" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d216c0ebf00e95acaf2b1e227e6cc900a5ce50fb81fa0743272851e88a788d" +checksum = "80a293f952293281443c04f4d96afd9d547721923d596e92b4377ed2360f1746" dependencies = [ "serde", "serde_derive", - "solana-hash", + "solana-hash 3.0.0", + "solana-sdk-ids 3.0.0", + "solana-sysvar-id 3.0.0", ] [[package]] name = "solana-slot-history" -version = "2.1.0" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97ccc1b2067ca22754d5283afb2b0126d61eae734fc616d23871b0943b0d935e" +dependencies = [ + "bv", + "serde", + "serde_derive", + "solana-sdk-ids 2.2.1", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-slot-history" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88cbcdf767891c6a40116a5ef8f7241000f074ece4ba80c8f00b4f62705fc8a4" +checksum = "f914f6b108f5bba14a280b458d023e3621c9973f27f015a4d755b50e88d89e97" dependencies = [ "bv", "serde", "serde_derive", + "solana-sdk-ids 3.0.0", + "solana-sysvar-id 3.0.0", ] [[package]] name = "solana-stable-layout" -version = "2.1.0" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f14f7d02af8f2bc1b5efeeae71bc1c2b7f0f65cd75bcc7d8180f2c762a57f54" +dependencies = [ + "solana-instruction 2.3.0", + "solana-pubkey 2.4.0", +] + +[[package]] +name = "solana-stable-layout" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1da74507795b6e8fb60b7c7306c0c36e2c315805d16eaaf479452661234685ac" +dependencies = [ + "solana-instruction 3.0.0", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-stake-interface" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a5305ca88fb5deb219cd88f04e24f3a131769417d7fcb11a8da1126a8f98d23" +checksum = "5269e89fde216b4d7e1d1739cf5303f8398a1ff372a81232abbee80e554a838c" dependencies = [ - "solana-instruction", - "solana-pubkey", + "borsh 0.10.3", + "borsh 1.5.7", + "num-traits", + "serde", + "serde_derive", + "solana-clock 2.2.2", + "solana-cpi 2.2.1", + "solana-decode-error", + "solana-instruction 2.3.0", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "solana-system-interface 1.0.0", + "solana-sysvar-id 2.2.1", ] [[package]] name = "solana-streamer" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff771524872781eca074e0ba221d72b07fa0800cc1a7ffa400a9eb3e125fb922" +checksum = "1faa9bfb0bc556b77d836cacf347c4e1754a0334e8b9946dbed49ead4e1c0eb2" dependencies = [ "async-channel", "bytes", @@ -4899,7 +7370,7 @@ dependencies = [ "futures-util", "governor", "histogram", - "indexmap 2.6.0", + "indexmap 2.11.4", "itertools 0.12.1", "libc", "log", @@ -4909,102 +7380,338 @@ dependencies = [ "quinn", "quinn-proto", "rand 0.8.5", - "rustls 0.23.16", + "rustls 0.23.32", "smallvec", - "socket2 0.5.7", + "socket2 0.5.10", + "solana-keypair", "solana-measure", "solana-metrics", + "solana-net-utils", + "solana-packet", "solana-perf", - "solana-sdk", + "solana-pubkey 2.4.0", + "solana-quic-definitions", + "solana-signature", + "solana-signer", + "solana-time-utils", + "solana-tls-utils", + "solana-transaction-error 2.2.1", "solana-transaction-metrics-tracker", - "thiserror", + "thiserror 2.0.16", "tokio", "tokio-util", "x509-parser", ] +[[package]] +name = "solana-svm-feature-set" +version = "2.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c343731bf4a594a615c2aa32a63a0f42f39581e7975114ed825133e30ab68346" + +[[package]] +name = "solana-system-interface" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94d7c18cb1a91c6be5f5a8ac9276a1d7c737e39a21beba9ea710ab4b9c63bc90" +dependencies = [ + "js-sys", + "num-traits", + "serde", + "serde_derive", + "solana-decode-error", + "solana-instruction 2.3.0", + "solana-pubkey 2.4.0", + "wasm-bindgen", +] + +[[package]] +name = "solana-system-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e1790547bfc3061f1ee68ea9d8dc6c973c02a163697b24263a8e9f2e6d4afa2" +dependencies = [ + "num-traits", + "solana-msg 3.0.0", + "solana-program-error 3.0.0", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-system-transaction" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bd98a25e5bcba8b6be8bcbb7b84b24c2a6a8178d7fb0e3077a916855ceba91a" +dependencies = [ + "solana-hash 2.3.0", + "solana-keypair", + "solana-message 2.4.0", + "solana-pubkey 2.4.0", + "solana-signer", + "solana-system-interface 1.0.0", + "solana-transaction", +] + +[[package]] +name = "solana-sysvar" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8c3595f95069f3d90f275bb9bd235a1973c4d059028b0a7f81baca2703815db" +dependencies = [ + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info 2.3.0", + "solana-clock 2.2.2", + "solana-define-syscall 2.3.0", + "solana-epoch-rewards 2.2.1", + "solana-epoch-schedule 2.2.1", + "solana-fee-calculator 2.2.1", + "solana-hash 2.3.0", + "solana-instruction 2.3.0", + "solana-instructions-sysvar 2.2.2", + "solana-last-restart-slot 2.2.1", + "solana-program-entrypoint 2.3.0", + "solana-program-error 2.2.2", + "solana-program-memory 2.3.1", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sanitize 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-slot-hashes 2.2.1", + "solana-slot-history 2.2.1", + "solana-stake-interface", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-sysvar" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63205e68d680bcc315337dec311b616ab32fea0a612db3b883ce4de02e0953f9" +dependencies = [ + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info 3.0.0", + "solana-clock 3.0.0", + "solana-define-syscall 3.0.0", + "solana-epoch-rewards 3.0.0", + "solana-epoch-schedule 3.0.0", + "solana-fee-calculator 3.0.0", + "solana-hash 3.0.0", + "solana-instruction 3.0.0", + "solana-last-restart-slot 3.0.0", + "solana-program-entrypoint 3.1.0", + "solana-program-error 3.0.0", + "solana-program-memory 3.0.0", + "solana-pubkey 3.0.0", + "solana-rent 3.0.0", + "solana-sdk-ids 3.0.0", + "solana-sdk-macro 3.0.0", + "solana-slot-hashes 3.0.0", + "solana-slot-history 3.0.0", + "solana-sysvar-id 3.0.0", +] + +[[package]] +name = "solana-sysvar-id" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5762b273d3325b047cfda250787f8d796d781746860d5d0a746ee29f3e8812c1" +dependencies = [ + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", +] + +[[package]] +name = "solana-sysvar-id" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5051bc1a16d5d96a96bc33b5b2ec707495c48fe978097bdaba68d3c47987eb32" +dependencies = [ + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.0.0", +] + [[package]] name = "solana-thin-client" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10314ae3e0889cf38140902862d2c2ea481895c82c19f51dc4457b7dfa3aa6d0" +checksum = "7cc60d1502f5eeb2e5f3286b34f567d3c076e6da5a753a002ef8889fda670ecf" dependencies = [ "bincode", "log", "rayon", + "solana-account", + "solana-client-traits", + "solana-clock 2.2.2", + "solana-commitment-config", "solana-connection-cache", + "solana-epoch-info", + "solana-hash 2.3.0", + "solana-instruction 2.3.0", + "solana-keypair", + "solana-message 2.4.0", + "solana-pubkey 2.4.0", "solana-rpc-client", "solana-rpc-client-api", - "solana-sdk", + "solana-signature", + "solana-signer", + "solana-system-interface 1.0.0", + "solana-transaction", + "solana-transaction-error 2.2.1", ] [[package]] -name = "solana-timings" -version = "2.1.0" +name = "solana-time-utils" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6af261afb0e8c39252a04d026e3ea9c405342b08c871a2ad8aa5448e068c784c" + +[[package]] +name = "solana-tls-utils" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a8e2f926d488c1e2a65cbc05544dcb68cfa88deb4d50f89db5bfbda7ff2419" +checksum = "5629f315f8e64b7336e5c8e10ff48d350ca1ce321f4132238705f0acbeeaf843" dependencies = [ - "eager", - "enum-iterator", - "solana-sdk", + "rustls 0.23.32", + "solana-keypair", + "solana-pubkey 2.4.0", + "solana-signer", + "x509-parser", ] [[package]] name = "solana-tpu-client" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516cbed8800cd36fb3ecc9a65df1e76bf8251929aa32e9b10497e8d6612de605" +checksum = "268c9aaf276cc863b1f683ab0e7d97aee2d52502ddf9fd02d8564fc8fb9f2ba8" dependencies = [ "async-trait", "bincode", "futures-util", - "indexmap 2.6.0", + "indexmap 2.11.4", "indicatif", "log", "rayon", + "solana-client-traits", + "solana-clock 2.2.2", + "solana-commitment-config", "solana-connection-cache", + "solana-epoch-schedule 2.2.1", "solana-measure", + "solana-message 2.4.0", + "solana-net-utils", + "solana-pubkey 2.4.0", "solana-pubsub-client", + "solana-quic-definitions", "solana-rpc-client", "solana-rpc-client-api", - "solana-sdk", - "thiserror", + "solana-signature", + "solana-signer", + "solana-transaction", + "solana-transaction-error 2.2.1", + "thiserror 2.0.16", "tokio", ] +[[package]] +name = "solana-transaction" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abec848d081beb15a324c633cd0e0ab33033318063230389895cae503ec9b544" +dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-bincode", + "solana-feature-set", + "solana-hash 2.3.0", + "solana-instruction 2.3.0", + "solana-keypair", + "solana-message 2.4.0", + "solana-precompiles", + "solana-pubkey 2.4.0", + "solana-sanitize 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-short-vec 2.2.1", + "solana-signature", + "solana-signer", + "solana-system-interface 1.0.0", + "solana-transaction-error 2.2.1", + "wasm-bindgen", +] + +[[package]] +name = "solana-transaction-context" +version = "2.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a816015e792c953f755a333c1ae3a1c3b1e5cde52a5f98015ed26d5adea70e63" +dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-account", + "solana-instruction 2.3.0", + "solana-instructions-sysvar 2.2.2", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", +] + [[package]] name = "solana-transaction-error" -version = "2.1.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a4bea6d80b34fe6e785d19bf928fe103928d1f6c9935ec23bb6a9d4d7a33d2" +checksum = "222a9dc8fdb61c6088baab34fc3a8b8473a03a7a5fd404ed8dd502fa79b67cb1" dependencies = [ "serde", "serde_derive", - "solana-instruction", - "solana-sanitize", + "solana-instruction 2.3.0", + "solana-sanitize 2.2.1", +] + +[[package]] +name = "solana-transaction-error" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4222065402340d7e6aec9dc3e54d22992ddcf923d91edcd815443c2bfca3144a" +dependencies = [ + "solana-instruction-error", + "solana-sanitize 3.0.1", ] [[package]] name = "solana-transaction-metrics-tracker" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0b668c986a83e6b2eb8f130039045b54abc37ee821853250755386d26c1c668" +checksum = "63e77b3b3f4790dcf6cb945cfce4210cb8a22ccf74cfdff84b726650b698bf62" dependencies = [ "base64 0.22.1", "bincode", - "lazy_static", "log", "rand 0.8.5", + "solana-packet", "solana-perf", - "solana-sdk", - "solana-short-vec", + "solana-short-vec 2.2.1", + "solana-signature", ] [[package]] name = "solana-transaction-status-client-types" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fb35fb678fec581e9bdf6350d2c7f5829951a6280038fc06949b1589a9605e1" +checksum = "24dfa59c12442f2283eb07d3c2fefff5862d4200579093b0a990b0c262bc003e" dependencies = [ "base64 0.22.1", "bincode", @@ -5013,89 +7720,82 @@ dependencies = [ "serde_derive", "serde_json", "solana-account-decoder-client-types", - "solana-sdk", + "solana-commitment-config", + "solana-message 2.4.0", + "solana-reward-info", "solana-signature", - "thiserror", -] - -[[package]] -name = "solana-type-overrides" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2066f25d460d63801f91436c2640aaba4f2dc95aa18fe1e76f7f2c063e981d4e" -dependencies = [ - "lazy_static", - "rand 0.8.5", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error 2.2.1", + "thiserror 2.0.16", ] [[package]] name = "solana-udp-client" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ec0cbc2d5e3379fafb2c1493f2358f07c09e76e2081c44e3a8c36da12fbd40" +checksum = "6a11eb463af8c3de38b6452a51c885231188462647eb8e95ca8344c18aceaf47" dependencies = [ "async-trait", "solana-connection-cache", + "solana-keypair", "solana-net-utils", - "solana-sdk", "solana-streamer", - "thiserror", + "solana-transaction-error 2.2.1", + "thiserror 2.0.16", "tokio", ] [[package]] -name = "solana-version" -version = "2.1.0" +name = "solana-validator-exit" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7310708b642fb83c04f44934509f4f149ffd69d0cd4cf76d9645c991177d7ea0" -dependencies = [ - "semver", - "serde", - "serde_derive", - "solana-feature-set", - "solana-sanitize", - "solana-serde-varint", -] +checksum = "7bbf6d7a3c0b28dd5335c52c0e9eae49d0ae489a8f324917faf0ded65a812c1d" [[package]] -name = "solana-vote" -version = "2.1.0" +name = "solana-version" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab46788981765ee706094ca53ad8421aae0286a6b948e892fa7db88992a5373" +checksum = "cadb7e1261069a748647abc07f611a5ced461390447aa1fe083eb733796e038b" dependencies = [ - "itertools 0.12.1", - "log", + "agave-feature-set", + "rand 0.8.5", + "semver", "serde", "serde_derive", - "solana-sdk", - "thiserror", + "solana-sanitize 2.2.1", + "solana-serde-varint 2.2.2", ] [[package]] -name = "solana-vote-program" -version = "2.1.0" +name = "solana-vote-interface" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637cadc921725d1804a451ea7d2dff83310a12b75e0b6c83a8bb67ebc02d10f1" +checksum = "b80d57478d6599d30acc31cc5ae7f93ec2361a06aefe8ea79bc81739a08af4c3" dependencies = [ "bincode", - "log", "num-derive 0.4.0", "num-traits", "serde", "serde_derive", - "solana-feature-set", - "solana-metrics", - "solana-program", - "solana-program-runtime", - "solana-sdk", - "thiserror", + "solana-clock 2.2.2", + "solana-decode-error", + "solana-hash 2.3.0", + "solana-instruction 2.3.0", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-serde-varint 2.2.2", + "solana-serialize-utils 2.2.1", + "solana-short-vec 2.2.1", + "solana-system-interface 1.0.0", ] [[package]] name = "solana-zk-sdk" -version = "2.1.0" +version = "2.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18c2d96f65cb033f4dc16d3a1b085f8af0ea38012c514a8f65b9b6d75bc9339f" +checksum = "1fbc771177d65034eaa27dd66f809ca1c52beebaa92eefd23d560c394dd006f2" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -5105,7 +7805,6 @@ dependencies = [ "curve25519-dalek 4.1.3", "itertools 0.12.1", "js-sys", - "lazy_static", "merlin", "num-derive 0.4.0", "num-traits", @@ -5115,64 +7814,19 @@ dependencies = [ "serde_json", "sha3", "solana-derivation-path", - "solana-program", - "solana-sdk", + "solana-instruction 2.3.0", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature", + "solana-signer", "subtle", - "thiserror", + "thiserror 2.0.16", "wasm-bindgen", "zeroize", ] -[[package]] -name = "solana-zk-token-sdk" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed293089d8eebd6b5c1b53ee4ad6817889fea254274ddb34cb01ad35a2f817cb" -dependencies = [ - "aes-gcm-siv", - "base64 0.22.1", - "bincode", - "bytemuck", - "bytemuck_derive", - "byteorder", - "curve25519-dalek 4.1.3", - "itertools 0.12.1", - "lazy_static", - "merlin", - "num-derive 0.4.0", - "num-traits", - "rand 0.8.5", - "serde", - "serde_derive", - "serde_json", - "sha3", - "solana-curve25519", - "solana-derivation-path", - "solana-program", - "solana-sdk", - "subtle", - "thiserror", - "zeroize", -] - -[[package]] -name = "solana_rbpf" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c1941b5ef0c3ce8f2ac5dd984d0fb1a97423c4ff2a02eec81e3913f02e2ac2b" -dependencies = [ - "byteorder", - "combine 3.8.1", - "hash32", - "libc", - "log", - "rand 0.8.5", - "rustc-demangle", - "scroll", - "thiserror", - "winapi", -] - [[package]] name = "solang-parser" version = "0.3.3" @@ -5183,7 +7837,7 @@ dependencies = [ "lalrpop", "lalrpop-util", "phf", - "thiserror", + "thiserror 1.0.66", "unicode-xid", ] @@ -5208,20 +7862,30 @@ dependencies = [ "lock_api", ] +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "spl-associated-token-account" version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76fee7d65013667032d499adc3c895e286197a35a0d3a4643c80e7fd3e9969e3" dependencies = [ - "borsh 1.5.1", + "borsh 1.5.7", "num-derive 0.4.0", "num-traits", - "solana-program", + "solana-program 2.3.0", "spl-associated-token-account-client", "spl-token 7.0.0", "spl-token-2022 6.0.0", - "thiserror", + "thiserror 1.0.66", ] [[package]] @@ -5230,19 +7894,8 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6f8349dbcbe575f354f9a533a21f272f3eb3808a49e2fdc1c34393b88ba76cb" dependencies = [ - "solana-instruction", - "solana-pubkey", -] - -[[package]] -name = "spl-discriminator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a38ea8b6dedb7065887f12d62ed62c1743aa70749e8558f963609793f6fb12bc" -dependencies = [ - "bytemuck", - "solana-program", - "spl-discriminator-derive", + "solana-instruction 2.3.0", + "solana-pubkey 2.4.0", ] [[package]] @@ -5252,8 +7905,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a20542d4c8264856d205c0090512f374dbf7b3124479a3d93ab6184ae3631aa" dependencies = [ "bytemuck", - "solana-program-error", - "solana-sha256-hasher", + "solana-program-error 2.2.2", + "solana-sha256-hasher 2.3.0", "spl-discriminator-derive", ] @@ -5265,7 +7918,7 @@ checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" dependencies = [ "quote", "spl-discriminator-syn", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] @@ -5277,104 +7930,116 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.86", - "thiserror", + "syn 2.0.106", + "thiserror 1.0.66", ] [[package]] name = "spl-elgamal-registry" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a157622a63a4d12fbd8b347fd75ee442cb913137fa98647824c992fb049a15b" +checksum = "ce0f668975d2b0536e8a8fd60e56a05c467f06021dae037f1d0cfed0de2e231d" dependencies = [ "bytemuck", - "solana-program", + "solana-program 2.3.0", "solana-zk-sdk", - "spl-pod 0.5.0", - "spl-token-confidential-transfer-proof-extraction", + "spl-pod", + "spl-token-confidential-transfer-proof-extraction 0.2.1", ] [[package]] -name = "spl-memo" -version = "5.0.0" +name = "spl-elgamal-registry" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0dba2f2bb6419523405d21c301a32c9f9568354d4742552e7972af801f4bdb3" +checksum = "65edfeed09cd4231e595616aa96022214f9c9d2be02dea62c2b30d5695a6833a" dependencies = [ - "solana-program", + "bytemuck", + "solana-account-info 2.3.0", + "solana-cpi 2.2.1", + "solana-instruction 2.3.0", + "solana-msg 2.2.1", + "solana-program-entrypoint 2.3.0", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-system-interface 1.0.0", + "solana-sysvar 2.3.0", + "solana-zk-sdk", + "spl-pod", + "spl-token-confidential-transfer-proof-extraction 0.3.0", ] [[package]] -name = "spl-memo" -version = "6.0.0" +name = "spl-generic-token" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f09647c0974e33366efeb83b8e2daebb329f0420149e74d3a4bd2c08cf9f7cb" +checksum = "741a62a566d97c58d33f9ed32337ceedd4e35109a686e31b1866c5dfa56abddc" dependencies = [ - "solana-account-info", - "solana-instruction", - "solana-msg", - "solana-program-entrypoint", - "solana-program-error", - "solana-pubkey", + "bytemuck", + "solana-pubkey 2.4.0", ] [[package]] -name = "spl-pod" -version = "0.3.1" +name = "spl-memo" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c704c88fc457fa649ba3aabe195c79d885c3f26709efaddc453c8de352c90b87" +checksum = "9f09647c0974e33366efeb83b8e2daebb329f0420149e74d3a4bd2c08cf9f7cb" dependencies = [ - "borsh 1.5.1", - "bytemuck", - "bytemuck_derive", - "solana-program", - "solana-zk-token-sdk", - "spl-program-error 0.5.0", + "solana-account-info 2.3.0", + "solana-instruction 2.3.0", + "solana-msg 2.2.1", + "solana-program-entrypoint 2.3.0", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", ] [[package]] name = "spl-pod" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a7d5950993e1ff2680bd989df298eeb169367fb2f9deeef1f132de6e4e8016" +checksum = "d994afaf86b779104b4a95ba9ca75b8ced3fdb17ee934e38cb69e72afbe17799" dependencies = [ - "borsh 1.5.1", + "borsh 1.5.7", "bytemuck", "bytemuck_derive", "num-derive 0.4.0", "num-traits", "solana-decode-error", - "solana-msg", - "solana-program-error", - "solana-program-option", - "solana-pubkey", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-program-option 2.2.1", + "solana-pubkey 2.4.0", "solana-zk-sdk", - "thiserror", + "thiserror 2.0.16", ] [[package]] name = "spl-program-error" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7b28bed65356558133751cc32b48a7a5ddfc59ac4e941314630bbed1ac10532" +checksum = "9d39b5186f42b2b50168029d81e58e800b690877ef0b30580d107659250da1d1" dependencies = [ "num-derive 0.4.0", "num-traits", - "solana-program", - "spl-program-error-derive", - "thiserror", + "solana-program 2.3.0", + "spl-program-error-derive 0.4.1", + "thiserror 1.0.66", ] [[package]] name = "spl-program-error" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d39b5186f42b2b50168029d81e58e800b690877ef0b30580d107659250da1d1" +checksum = "9cdebc8b42553070b75aa5106f071fef2eb798c64a7ec63375da4b1f058688c6" dependencies = [ "num-derive 0.4.0", "num-traits", - "solana-program", - "spl-program-error-derive", - "thiserror", + "solana-decode-error", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "spl-program-error-derive 0.5.0", + "thiserror 2.0.16", ] [[package]] @@ -5386,21 +8051,19 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] -name = "spl-tlv-account-resolution" -version = "0.7.0" +name = "spl-program-error-derive" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a75a5f0fcc58126693ed78a17042e9dc53f07e357d6be91789f7d62aff61a4" +checksum = "2a2539e259c66910d78593475540e8072f0b10f0f61d7607bbf7593899ed52d0" dependencies = [ - "bytemuck", - "solana-program", - "spl-discriminator 0.3.0", - "spl-pod 0.3.1", - "spl-program-error 0.5.0", - "spl-type-length-value 0.5.0", + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.106", ] [[package]] @@ -5412,106 +8075,201 @@ dependencies = [ "bytemuck", "num-derive 0.4.0", "num-traits", - "solana-account-info", + "solana-account-info 2.3.0", "solana-decode-error", - "solana-instruction", - "solana-msg", - "solana-program-error", - "solana-pubkey", - "spl-discriminator 0.4.0", - "spl-pod 0.5.0", + "solana-instruction 2.3.0", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "spl-discriminator", + "spl-pod", "spl-program-error 0.6.0", "spl-type-length-value 0.7.0", - "thiserror", + "thiserror 1.0.66", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1408e961215688715d5a1063cbdcf982de225c45f99c82b4f7d7e1dd22b998d7" +dependencies = [ + "bytemuck", + "num-derive 0.4.0", + "num-traits", + "solana-account-info 2.3.0", + "solana-decode-error", + "solana-instruction 2.3.0", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "spl-discriminator", + "spl-pod", + "spl-program-error 0.7.0", + "spl-type-length-value 0.8.0", + "thiserror 2.0.16", ] [[package]] name = "spl-token" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a0f06ac7f23dc0984931b1fe309468f14ea58e32660439c1cef19456f5d0e3" +checksum = "ed320a6c934128d4f7e54fe00e16b8aeaecf215799d060ae14f93378da6dc834" dependencies = [ "arrayref", "bytemuck", "num-derive 0.4.0", "num-traits", "num_enum", - "solana-program", - "thiserror", + "solana-program 2.3.0", + "thiserror 1.0.66", ] [[package]] name = "spl-token" -version = "7.0.0" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed320a6c934128d4f7e54fe00e16b8aeaecf215799d060ae14f93378da6dc834" +checksum = "053067c6a82c705004f91dae058b11b4780407e9ccd6799dc9e7d0fab5f242da" dependencies = [ "arrayref", "bytemuck", "num-derive 0.4.0", "num-traits", "num_enum", - "solana-program", - "thiserror", + "solana-account-info 2.3.0", + "solana-cpi 2.2.1", + "solana-decode-error", + "solana-instruction 2.3.0", + "solana-msg 2.2.1", + "solana-program-entrypoint 2.3.0", + "solana-program-error 2.2.2", + "solana-program-memory 2.3.1", + "solana-program-option 2.2.1", + "solana-program-pack 2.2.1", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-sysvar 2.3.0", + "thiserror 2.0.16", ] [[package]] name = "spl-token-2022" -version = "4.0.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c10f3483e48679619c76598d4e4aebb955bc49b0a5cc63323afbf44135c9bf" +checksum = "5b27f7405010ef816587c944536b0eafbcc35206ab6ba0f2ca79f1d28e488f4f" dependencies = [ "arrayref", "bytemuck", "num-derive 0.4.0", "num-traits", "num_enum", - "solana-program", + "solana-program 2.3.0", "solana-security-txt", - "solana-zk-token-sdk", - "spl-memo 5.0.0", - "spl-pod 0.3.1", - "spl-token 6.0.0", - "spl-token-group-interface 0.3.0", - "spl-token-metadata-interface 0.4.0", - "spl-transfer-hook-interface 0.7.0", - "spl-type-length-value 0.5.0", - "thiserror", + "solana-zk-sdk", + "spl-elgamal-registry 0.1.1", + "spl-memo", + "spl-pod", + "spl-token 7.0.0", + "spl-token-confidential-transfer-ciphertext-arithmetic 0.2.1", + "spl-token-confidential-transfer-proof-extraction 0.2.1", + "spl-token-confidential-transfer-proof-generation 0.2.0", + "spl-token-group-interface 0.5.0", + "spl-token-metadata-interface 0.6.0", + "spl-transfer-hook-interface 0.9.0", + "spl-type-length-value 0.7.0", + "thiserror 1.0.66", ] [[package]] name = "spl-token-2022" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b27f7405010ef816587c944536b0eafbcc35206ab6ba0f2ca79f1d28e488f4f" +checksum = "9048b26b0df0290f929ff91317c83db28b3ef99af2b3493dd35baa146774924c" dependencies = [ "arrayref", "bytemuck", "num-derive 0.4.0", "num-traits", "num_enum", - "solana-program", + "solana-program 2.3.0", "solana-security-txt", "solana-zk-sdk", - "spl-elgamal-registry", - "spl-memo 6.0.0", - "spl-pod 0.5.0", + "spl-elgamal-registry 0.1.1", + "spl-memo", + "spl-pod", "spl-token 7.0.0", - "spl-token-confidential-transfer-ciphertext-arithmetic", - "spl-token-confidential-transfer-proof-extraction", - "spl-token-confidential-transfer-proof-generation", + "spl-token-confidential-transfer-ciphertext-arithmetic 0.2.1", + "spl-token-confidential-transfer-proof-extraction 0.2.1", + "spl-token-confidential-transfer-proof-generation 0.3.0", "spl-token-group-interface 0.5.0", "spl-token-metadata-interface 0.6.0", "spl-transfer-hook-interface 0.9.0", "spl-type-length-value 0.7.0", - "thiserror", + "thiserror 2.0.16", +] + +[[package]] +name = "spl-token-2022" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f0dfbb079eebaee55e793e92ca5f433744f4b71ee04880bfd6beefba5973e5" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.0", + "num-traits", + "num_enum", + "solana-account-info 2.3.0", + "solana-clock 2.2.2", + "solana-cpi 2.2.1", + "solana-decode-error", + "solana-instruction 2.3.0", + "solana-msg 2.2.1", + "solana-native-token 2.2.2", + "solana-program-entrypoint 2.3.0", + "solana-program-error 2.2.2", + "solana-program-memory 2.3.1", + "solana-program-option 2.2.1", + "solana-program-pack 2.2.1", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-security-txt", + "solana-system-interface 1.0.0", + "solana-sysvar 2.3.0", + "solana-zk-sdk", + "spl-elgamal-registry 0.2.0", + "spl-memo", + "spl-pod", + "spl-token 8.0.0", + "spl-token-confidential-transfer-ciphertext-arithmetic 0.3.1", + "spl-token-confidential-transfer-proof-extraction 0.3.0", + "spl-token-confidential-transfer-proof-generation 0.4.1", + "spl-token-group-interface 0.6.0", + "spl-token-metadata-interface 0.7.0", + "spl-transfer-hook-interface 0.10.0", + "spl-type-length-value 0.8.0", + "thiserror 2.0.16", ] [[package]] name = "spl-token-confidential-transfer-ciphertext-arithmetic" -version = "0.2.0" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170378693c5516090f6d37ae9bad2b9b6125069be68d9acd4865bbe9fc8499fd" +dependencies = [ + "base64 0.22.1", + "bytemuck", + "solana-curve25519", + "solana-zk-sdk", +] + +[[package]] +name = "spl-token-confidential-transfer-ciphertext-arithmetic" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1f1bf731fc65546330a7929a9735679add70f828dd076a4e69b59d3afb5423c" +checksum = "cddd52bfc0f1c677b41493dafa3f2dbbb4b47cf0990f08905429e19dc8289b35" dependencies = [ "base64 0.22.1", "bytemuck", @@ -5521,16 +8279,36 @@ dependencies = [ [[package]] name = "spl-token-confidential-transfer-proof-extraction" -version = "0.2.0" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff2d6a445a147c9d6dd77b8301b1e116c8299601794b558eafa409b342faf96" +dependencies = [ + "bytemuck", + "solana-curve25519", + "solana-program 2.3.0", + "solana-zk-sdk", + "spl-pod", + "thiserror 2.0.16", +] + +[[package]] +name = "spl-token-confidential-transfer-proof-extraction" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "383937e637ccbe546f736d5115344351ebd4d2a076907582335261da58236816" +checksum = "fe2629860ff04c17bafa9ba4bed8850a404ecac81074113e1f840dbd0ebb7bd6" dependencies = [ "bytemuck", + "solana-account-info 2.3.0", "solana-curve25519", - "solana-program", + "solana-instruction 2.3.0", + "solana-instructions-sysvar 2.2.2", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", "solana-zk-sdk", - "spl-pod 0.5.0", - "thiserror", + "spl-pod", + "thiserror 2.0.16", ] [[package]] @@ -5541,20 +8319,29 @@ checksum = "8627184782eec1894de8ea26129c61303f1f0adeed65c20e0b10bc584f09356d" dependencies = [ "curve25519-dalek 4.1.3", "solana-zk-sdk", - "thiserror", + "thiserror 1.0.66", ] [[package]] -name = "spl-token-group-interface" +name = "spl-token-confidential-transfer-proof-generation" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8752b85a5ecc1d9f3a43bce3dd9a6a053673aacf5deb513d1cbb88d3534ffd" +checksum = "0e3597628b0d2fe94e7900fd17cdb4cfbb31ee35c66f82809d27d86e44b2848b" dependencies = [ - "bytemuck", - "solana-program", - "spl-discriminator 0.3.0", - "spl-pod 0.3.1", - "spl-program-error 0.5.0", + "curve25519-dalek 4.1.3", + "solana-zk-sdk", + "thiserror 2.0.16", +] + +[[package]] +name = "spl-token-confidential-transfer-proof-generation" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa27b9174bea869a7ebf31e0be6890bce90b1a4288bc2bbf24bd413f80ae3fde" +dependencies = [ + "curve25519-dalek 4.1.3", + "solana-zk-sdk", + "thiserror 2.0.16", ] [[package]] @@ -5567,27 +8354,32 @@ dependencies = [ "num-derive 0.4.0", "num-traits", "solana-decode-error", - "solana-instruction", - "solana-msg", - "solana-program-error", - "solana-pubkey", - "spl-discriminator 0.4.0", - "spl-pod 0.5.0", - "thiserror", + "solana-instruction 2.3.0", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "spl-discriminator", + "spl-pod", + "thiserror 1.0.66", ] [[package]] -name = "spl-token-metadata-interface" -version = "0.4.0" +name = "spl-token-group-interface" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c2318ddff97e006ed9b1291ebec0750a78547f870f62a69c56fe3b46a5d8fc" +checksum = "5597b4cd76f85ce7cd206045b7dc22da8c25516573d42d267c8d1fd128db5129" dependencies = [ - "borsh 1.5.1", - "solana-program", - "spl-discriminator 0.3.0", - "spl-pod 0.3.1", - "spl-program-error 0.5.0", - "spl-type-length-value 0.5.0", + "bytemuck", + "num-derive 0.4.0", + "num-traits", + "solana-decode-error", + "solana-instruction 2.3.0", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "spl-discriminator", + "spl-pod", + "thiserror 2.0.16", ] [[package]] @@ -5596,35 +8388,40 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfb9c89dbc877abd735f05547dcf9e6e12c00c11d6d74d8817506cab4c99fdbb" dependencies = [ - "borsh 1.5.1", + "borsh 1.5.7", "num-derive 0.4.0", "num-traits", - "solana-borsh", + "solana-borsh 2.2.1", "solana-decode-error", - "solana-instruction", - "solana-msg", - "solana-program-error", - "solana-pubkey", - "spl-discriminator 0.4.0", - "spl-pod 0.5.0", + "solana-instruction 2.3.0", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "spl-discriminator", + "spl-pod", "spl-type-length-value 0.7.0", - "thiserror", + "thiserror 1.0.66", ] [[package]] -name = "spl-transfer-hook-interface" +name = "spl-token-metadata-interface" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a110f33d941275d9f868b96daaa993f1e73b6806cc8836e43075b4d3ad8338a7" +checksum = "304d6e06f0de0c13a621464b1fd5d4b1bebf60d15ca71a44d3839958e0da16ee" dependencies = [ - "arrayref", - "bytemuck", - "solana-program", - "spl-discriminator 0.3.0", - "spl-pod 0.3.1", - "spl-program-error 0.5.0", - "spl-tlv-account-resolution 0.7.0", - "spl-type-length-value 0.5.0", + "borsh 1.5.7", + "num-derive 0.4.0", + "num-traits", + "solana-borsh 2.2.1", + "solana-decode-error", + "solana-instruction 2.3.0", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "spl-discriminator", + "spl-pod", + "spl-type-length-value 0.8.0", + "thiserror 2.0.16", ] [[package]] @@ -5637,32 +8434,44 @@ dependencies = [ "bytemuck", "num-derive 0.4.0", "num-traits", - "solana-account-info", - "solana-cpi", + "solana-account-info 2.3.0", + "solana-cpi 2.2.1", "solana-decode-error", - "solana-instruction", - "solana-msg", - "solana-program-error", - "solana-pubkey", - "spl-discriminator 0.4.0", - "spl-pod 0.5.0", + "solana-instruction 2.3.0", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "spl-discriminator", + "spl-pod", "spl-program-error 0.6.0", "spl-tlv-account-resolution 0.9.0", "spl-type-length-value 0.7.0", - "thiserror", + "thiserror 1.0.66", ] [[package]] -name = "spl-type-length-value" -version = "0.5.0" +name = "spl-transfer-hook-interface" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdcd73ec187bc409464c60759232e309f83b52a18a9c5610bf281c9c6432918c" +checksum = "a7e905b849b6aba63bde8c4badac944ebb6c8e6e14817029cbe1bc16829133bd" dependencies = [ + "arrayref", "bytemuck", - "solana-program", - "spl-discriminator 0.3.0", - "spl-pod 0.3.1", - "spl-program-error 0.5.0", + "num-derive 0.4.0", + "num-traits", + "solana-account-info 2.3.0", + "solana-cpi 2.2.1", + "solana-decode-error", + "solana-instruction 2.3.0", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "spl-discriminator", + "spl-pod", + "spl-program-error 0.7.0", + "spl-tlv-account-resolution 0.10.0", + "spl-type-length-value 0.8.0", + "thiserror 2.0.16", ] [[package]] @@ -5674,15 +8483,39 @@ dependencies = [ "bytemuck", "num-derive 0.4.0", "num-traits", - "solana-account-info", + "solana-account-info 2.3.0", + "solana-decode-error", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "spl-discriminator", + "spl-pod", + "thiserror 1.0.66", +] + +[[package]] +name = "spl-type-length-value" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d417eb548214fa822d93f84444024b4e57c13ed6719d4dcc68eec24fb481e9f5" +dependencies = [ + "bytemuck", + "num-derive 0.4.0", + "num-traits", + "solana-account-info 2.3.0", "solana-decode-error", - "solana-msg", - "solana-program-error", - "spl-discriminator 0.4.0", - "spl-pod 0.5.0", - "thiserror", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "spl-discriminator", + "spl-pod", + "thiserror 2.0.16", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "string_cache" version = "0.8.7" @@ -5702,12 +8535,6 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -5733,9 +8560,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.86" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89275301d38033efb81a6e60e3497e734dfcc62571f2854bf4b16690398824c" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -5743,33 +8570,41 @@ dependencies = [ ] [[package]] -name = "syn_derive" -version = "0.1.8" +name = "sync_wrapper" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.86", -] +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "sync_wrapper" -version = "0.1.2" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] [[package]] name = "synstructure" version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", - "unicode-xid", + "syn 2.0.106", ] [[package]] @@ -5779,7 +8614,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.3", "system-configuration-sys", ] @@ -5804,15 +8639,6 @@ dependencies = [ "xattr", ] -[[package]] -name = "task-local-extensions" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba323866e5d033818e3240feeb9f7db2c4296674e4d9e16b97b7bf8f490434e8" -dependencies = [ - "pin-utils", -] - [[package]] name = "tempfile" version = "3.8.0" @@ -5852,7 +8678,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" dependencies = [ - "unicode-width", + "unicode-width 0.1.11", ] [[package]] @@ -5861,7 +8687,16 @@ version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.66", +] + +[[package]] +name = "thiserror" +version = "2.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +dependencies = [ + "thiserror-impl 2.0.16", ] [[package]] @@ -5872,7 +8707,18 @@ checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", ] [[package]] @@ -5919,7 +8765,7 @@ dependencies = [ "rand 0.7.3", "rustc-hash 1.1.0", "sha2 0.9.9", - "thiserror", + "thiserror 1.0.66", "unicode-normalization", "wasm-bindgen", "zeroize", @@ -5934,6 +8780,16 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -5951,32 +8807,33 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.32.0" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.7", + "slab", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", ] [[package]] @@ -5989,11 +8846,21 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls 0.23.32", + "tokio", +] + [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -6010,23 +8877,22 @@ dependencies = [ "log", "rustls 0.21.12", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", "tungstenite", "webpki-roots 0.25.2", ] [[package]] name = "tokio-util" -version = "0.7.9" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -6077,7 +8943,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.11.4", "serde", "serde_spanned", "toml_datetime", @@ -6090,7 +8956,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.11.4", "serde", "serde_spanned", "toml_datetime", @@ -6103,16 +8969,55 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.11.4", "toml_datetime", "winnow", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.4", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -6150,13 +9055,13 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http", + "http 0.2.12", "httparse", "log", "rand 0.8.5", "rustls 0.21.12", "sha1", - "thiserror", + "thiserror 1.0.66", "url", "utf-8", "webpki-roots 0.24.0", @@ -6177,12 +9082,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - [[package]] name = "unicode-ident" version = "1.0.12" @@ -6210,6 +9109,12 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +[[package]] +name = "unicode-width" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" + [[package]] name = "unicode-xid" version = "0.2.4" @@ -6226,15 +9131,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "unreachable" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -dependencies = [ - "void", -] - [[package]] name = "unsafe-libyaml" version = "0.2.11" @@ -6265,13 +9161,14 @@ dependencies = [ [[package]] name = "url" -version = "2.5.2" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -6280,12 +9177,24 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "vec_map" version = "0.8.2" @@ -6298,12 +9207,6 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - [[package]] name = "walkdir" version = "2.4.0" @@ -6335,29 +9238,48 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", "wasm-bindgen-shared", ] @@ -6375,9 +9297,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6385,22 +9307,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" @@ -6412,6 +9337,25 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4ffd8df1c57e87c325000a3d6ef93db75279dc3a231125aac571650f22b12a" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webpki-roots" version = "0.24.0" @@ -6429,9 +9373,9 @@ checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" [[package]] name = "webpki-roots" -version = "0.26.6" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] @@ -6476,6 +9420,21 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -6491,7 +9450,31 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", ] [[package]] @@ -6511,19 +9494,26 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -6532,9 +9522,15 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" @@ -6544,9 +9540,15 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" @@ -6556,9 +9558,21 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" @@ -6568,9 +9582,15 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" @@ -6580,9 +9600,15 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" @@ -6592,9 +9618,15 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" @@ -6604,9 +9636,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" @@ -6627,6 +9659,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + [[package]] name = "x509-parser" version = "0.14.0" @@ -6641,7 +9685,7 @@ dependencies = [ "nom", "oid-registry", "rusticata-macros", - "thiserror", + "thiserror 1.0.66", "time", ] @@ -6654,13 +9698,46 @@ dependencies = [ "libc", ] +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "synstructure 0.13.2", +] + [[package]] name = "zerocopy" version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ - "zerocopy-derive", + "zerocopy-derive 0.7.32", +] + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive 0.8.27", ] [[package]] @@ -6671,7 +9748,39 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "synstructure 0.13.2", ] [[package]] @@ -6691,14 +9800,47 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.106", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", ] [[package]] name = "zstd" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ "zstd-safe", ] diff --git a/lang/Cargo.toml b/lang/Cargo.toml index 1a6e38a58d..7fdb5af473 100644 --- a/lang/Cargo.toml +++ b/lang/Cargo.toml @@ -37,6 +37,19 @@ idl-build = [ init-if-needed = ["anchor-derive-accounts/init-if-needed"] interface-instructions = ["anchor-attribute-program/interface-instructions"] lazy-account = ["anchor-attribute-account/lazy-account", "anchor-derive-serde/lazy-account"] +compressed-mint = [] +compressed-mint-light = [ + "compressed-mint", + "light-sdk", + "light-sdk-types", + "light-hasher", + "light-macros", + "light-sdk-macros", + "light-compressed-account", + "light-compressed-token-sdk", + "light-ctoken-types", + "light-compressible" +] [dependencies] anchor-attribute-access-control = { path = "./attribute/access-control", version = "0.31.1" } @@ -58,3 +71,14 @@ borsh = "0.10.3" bytemuck = "1" solana-program = "2" thiserror = "1" + +# Light Protocol dependencies (optional) +light-sdk = { path = "../../light-protocol/sdk-libs/sdk", features = ["anchor", "anchor-discriminator-compat", "v2"], optional = true } +light-sdk-types = { path = "../../light-protocol/sdk-libs/sdk-types", features = ["v2"], optional = true } +light-hasher = { path = "../../light-protocol/program-libs/hasher", features = ["solana"], optional = true } +light-macros = { path = "../../light-protocol/program-libs/macros", features = ["solana"], optional = true } +light-sdk-macros = { path = "../../light-protocol/sdk-libs/macros", features = ["anchor-discriminator-compat"], optional = true } +light-compressed-account = { path = "../../light-protocol/program-libs/compressed-account", features = ["anchor"], optional = true } +light-compressed-token-sdk = { path = "../../light-protocol/sdk-libs/compressed-token-sdk", features = ["anchor"], optional = true } +light-ctoken-types = { path = "../../light-protocol/program-libs/ctoken-types", features = ["anchor"], optional = true } +light-compressible = { path = "../../light-protocol/program-libs/compressible", optional = true } diff --git a/lang/src/accounts/cmint.rs b/lang/src/accounts/cmint.rs new file mode 100644 index 0000000000..157cd3ca11 --- /dev/null +++ b/lang/src/accounts/cmint.rs @@ -0,0 +1,99 @@ +use crate::{ + AccountInfo, Accounts, AccountsFinalize, Key, Result, ToAccountInfo, ToAccountInfos, + ToAccountMetas, +}; +use solana_program::instruction::AccountMeta; +use solana_program::pubkey::Pubkey; +use std::cell::RefCell; +use std::collections::BTreeSet; + +#[derive(Clone)] +pub struct MintAction { + pub recipient: Pubkey, + pub amount: u64, +} + +/// CMint is a compressed mint account wrapper. +/// It queues mint actions to be executed in a single batched invoke at finalize. +pub struct CMint<'info> { + info: AccountInfo<'info>, + actions: RefCell>, + // Constraints from account macro + pub authority: Option, + pub decimals: Option, + pub mint_signer_seeds: Option>>, + pub mint_signer_bump: Option, + pub program_authority_seeds: Option>>, + pub program_authority_bump: Option, +} + +impl<'info> CMint<'info> { + pub fn mint_to(&self, recipient: &Pubkey, amount: u64) -> Result<()> { + self.actions.borrow_mut().push(MintAction { + recipient: *recipient, + amount, + }); + Ok(()) + } + + pub fn take_actions(&self) -> Vec { + let mut b = self.actions.borrow_mut(); + let actions = b.clone(); + b.clear(); + actions + } +} + +impl<'info> ToAccountInfo<'info> for CMint<'info> { + fn to_account_info(&self) -> AccountInfo<'info> { + self.info.clone() + } +} + +impl<'info> ToAccountInfos<'info> for CMint<'info> { + fn to_account_infos(&self) -> Vec> { + vec![self.info.clone()] + } +} + +impl<'info> ToAccountMetas for CMint<'info> { + fn to_account_metas(&self, is_signer: Option) -> Vec { + let signer = is_signer.unwrap_or(false); + vec![AccountMeta::new(self.key(), signer)] + } +} + +impl<'info> Key for CMint<'info> { + fn key(&self) -> Pubkey { + *self.info.key + } +} + +impl<'info> Accounts<'info, ()> for CMint<'info> { + fn try_accounts( + _program_id: &Pubkey, + accounts: &mut &'info [AccountInfo<'info>], + _ix_data: &[u8], + _bumps: &mut (), + _reallocs: &mut BTreeSet, + ) -> Result { + if accounts.is_empty() { + return Err(crate::error::ErrorCode::AccountNotEnoughKeys.into()); + } + let account = &accounts[0]; + *accounts = &accounts[1..]; + Ok(CMint { + info: account.clone(), + actions: RefCell::new(Vec::new()), + authority: None, + decimals: None, + mint_signer_seeds: None, + mint_signer_bump: None, + program_authority_seeds: None, + program_authority_bump: None, + }) + } +} + +// Note: the outer Accounts struct finalize will consume actions and perform the batched CPI. +impl<'info> AccountsFinalize<'info> for CMint<'info> {} diff --git a/lang/src/accounts/mod.rs b/lang/src/accounts/mod.rs index 7f92e3cd15..08394eb6d3 100644 --- a/lang/src/accounts/mod.rs +++ b/lang/src/accounts/mod.rs @@ -13,5 +13,9 @@ pub mod system_account; pub mod sysvar; pub mod unchecked_account; +// Compressed mint account type (feature-gated until stabilized) +#[cfg(feature = "compressed-mint")] +pub mod cmint; + #[cfg(feature = "lazy-account")] pub mod lazy_account; diff --git a/lang/src/compressed_mint.rs b/lang/src/compressed_mint.rs new file mode 100644 index 0000000000..7165000bcd --- /dev/null +++ b/lang/src/compressed_mint.rs @@ -0,0 +1,337 @@ +#![allow(clippy::needless_pass_by_value)] +use crate::accounts::cmint::{CMint, MintAction}; +use crate::solana_program::account_info::AccountInfo; +use crate::solana_program::pubkey::Pubkey; +use crate::Result; + +#[cfg(not(feature = "compressed-mint-light"))] +/// Finalizes a compressed mint by executing any queued actions in a single batch. +/// +/// Note: This is a placeholder implementation. Integrations should provide a +/// proper implementation that performs a single invoke_signed for create-mint +/// (if required) and all queued mint_to actions using the Light SDK. +pub fn finalize_cmint<'info>( + _mint: &CMint<'info>, + _actions: Vec, + _remaining: &[AccountInfo<'info>], + _ix_data: &[u8], +) -> Result<()> { + // Default no-op to keep core crate free of Light SDK dependency. + Ok(()) +} + +#[cfg(not(feature = "compressed-mint-light"))] +/// Context for batched compressed operations (CPDAs and CMints) - stub version +pub struct CompressedBatchContext { + pub cpda_indices: Vec, + pub cmint_index: Option, +} + +#[cfg(not(feature = "compressed-mint-light"))] +/// Stub for finalize_compressed_batch when feature is not enabled +pub fn finalize_compressed_batch<'info>( + _batch_context: &CompressedBatchContext, + _mint: Option<&CMint<'info>>, + _actions: Vec, + _remaining: &[AccountInfo<'info>], + _ix_data: &[u8], +) -> Result<()> { + // Default no-op to keep core crate free of Light SDK dependency. + Ok(()) +} + +#[cfg(feature = "compressed-mint-light")] +/// Context for batched compressed operations (CPDAs and CMints) +pub struct CompressedBatchContext { + pub cpda_indices: Vec, + pub cmint_index: Option, +} + +#[cfg(feature = "compressed-mint-light")] +/// Finalizes compressed operations including CPDAs and CMints in a single batched CPI. +pub fn finalize_compressed_batch<'info>( + batch_context: &CompressedBatchContext, + mint: Option<&CMint<'info>>, + mint_actions: Vec, + remaining: &[AccountInfo<'info>], + ix_data: &[u8], +) -> Result<()> { + use crate::error::ErrorCode; + use crate::solana_program::program::invoke_signed; + use borsh::BorshDeserialize; + use light_compressed_token_sdk::instructions::create_mint_action_cpi; + use light_compressed_token_sdk::instructions::CreateMintInputs; + use light_compressed_token_sdk::instructions::MintActionType; + use light_sdk::cpi::{CompressedCpiContext, CpiAccountsSmall}; + use light_sdk::instruction::{borsh_compat::ValidityProof, PackedAddressTreeInfo}; + use light_sdk_types::CpiAccountsConfig; + + // Constants from the user's program + const POOL_LP_MINT_SEED: &[u8] = b"pool_lp_mint"; + const AUTH_SEED: &[u8] = b"amm_authority"; + + // Parse compression params from instruction data + // Expected structure: InitializeCompressionParams at end of ix_data + #[derive(BorshDeserialize)] + struct InitializeCompressionParams { + pub proof: ValidityProof, + pub tree_info: PackedAddressTreeInfo, + } + + // Try to deserialize compression params from the end of ix_data + let compression_params = if ix_data.len() > 8 { + // Skip the discriminator (8 bytes) and any other instruction params + // This is a simplified approach - in production you'd need to know exact offset + let mut slice = &ix_data[8..]; + InitializeCompressionParams::try_from_slice(&mut slice) + .map_err(|_| ErrorCode::InvalidInstructionData)? + } else { + return Err(ErrorCode::InvalidInstructionData.into()); + }; + + // Build CpiAccountsSmall from remaining accounts + // Expected order based on user's manual implementation: + // 0: compressed_token_program + // 1: compressed_token_program_cpi_authority + // 2: authority (pool authority) + // 3: payer + // 4: pool_state (if needed for seeds) + // 5: system_program + // 6+: CPDA accounts (if any) + // N+: recipient accounts for mint_to actions + + if remaining.len() < 6 { + return Err(ErrorCode::AccountNotEnoughKeys.into()); + } + + let compressed_token_program = &remaining[0]; + let compressed_token_program_cpi_authority = &remaining[1]; + let authority = &remaining[2]; + let payer = &remaining[3]; + let pool_state = &remaining[4]; + let system_program = &remaining[5]; + + // Build CPI accounts + let cpi_accounts = CpiAccountsSmall { + light_system_program: compressed_token_program.clone(), + cpi_signer: compressed_token_program_cpi_authority.clone(), + remaining_accounts: &[], + }; + + // Start building the CPI context chain + let mut cpi_context: Option = None; + + // First, add all CPDA compress operations + for (i, cpda_index) in batch_context.cpda_indices.iter().enumerate() { + // For CPDAs, we're just marking them for compression + // The actual PDA account info should be in remaining_accounts + let cpda_account_index = 6 + i; // CPDAs start after the standard accounts + if cpda_account_index >= remaining.len() { + return Err(ErrorCode::AccountNotEnoughKeys.into()); + } + + // Build compress PDA context + cpi_context = Some(if let Some(prev_context) = cpi_context { + // Chain with previous context + CompressedCpiContext::cpi_compress_pda(&cpi_accounts, &prev_context, *cpda_index) + } else { + // First context in chain + CompressedCpiContext::first_cpi_compress_pda(&cpi_accounts, *cpda_index) + }); + } + + // Then add CMint operation if present + if let (Some(mint), Some(cmint_index)) = (mint, batch_context.cmint_index) { + // Get the mint signer info + let lp_mint_signer = mint.as_ref(); + + // Derive the SPL mint address from the signer + let (lp_mint, _) = Pubkey::find_program_address( + &[lp_mint_signer.key.as_ref()], + &light_compressed_token_sdk::ID, + ); + + // Derive the compressed mint address + let compressed_mint_address = + light_compressed_token_sdk::instructions::derive_compressed_mint_from_spl_mint( + &lp_mint, + ); + + // Build mint inputs from cmint constraints + let mint_inputs = CreateMintInputs { + authority: mint.authority.unwrap_or(*authority.key), + decimals: mint.decimals.unwrap_or(9), + mint_seed: Some(lp_mint_signer.key.to_bytes()), + mint_creation_index: Some(cmint_index), + proof: Some(compression_params.proof.clone()), + }; + + // Convert queued actions to MintActionType + let mut mint_action_types = vec![]; + for action in &mint_actions { + mint_action_types.push(MintActionType::MintToCToken { + recipient: action.recipient, + amount: action.amount, + }); + } + + // Add mint to context chain + cpi_context = Some(if let Some(prev_context) = cpi_context { + // Chain with previous context (CPDAs) + CompressedCpiContext::cpi_create_mint( + &cpi_accounts, + &mint_inputs, + &mint_action_types, + &prev_context, + cmint_index, + ) + } else { + // Only CMint, no CPDAs + CompressedCpiContext::first_cpi_create_mint( + &cpi_accounts, + &mint_inputs, + &mint_action_types, + cmint_index, + ) + }); + } + + // If we have any compressed operations, execute the batched CPI + if let Some(final_context) = cpi_context { + // Build the instruction using the final chained context + let ix = if mint.is_some() && !mint_actions.is_empty() { + // If we have mint actions, use create_mint_action_cpi + let mint_action_types: Vec = mint_actions + .iter() + .map(|action| MintActionType::MintToCToken { + recipient: action.recipient, + amount: action.amount, + }) + .collect(); + + // Get compressed mint address (we know mint exists here) + let lp_mint_signer = mint.unwrap().as_ref(); + let (lp_mint, _) = Pubkey::find_program_address( + &[lp_mint_signer.key.as_ref()], + &light_compressed_token_sdk::ID, + ); + let compressed_mint_address = + light_compressed_token_sdk::instructions::derive_compressed_mint_from_spl_mint( + &lp_mint, + ); + + create_mint_action_cpi( + &final_context, + &compressed_mint_address, + &mint_action_types, + Some(compression_params.tree_info), + ) + } else { + // CPDAs only - use system program compress instruction + light_sdk::instructions::create_compress_pda_cpi( + &final_context, + Some(compression_params.tree_info), + ) + }; + + // Build account infos for the CPI + let mut account_infos = vec![ + compressed_token_program.clone(), + compressed_token_program_cpi_authority.clone(), + authority.clone(), + payer.clone(), + system_program.clone(), + ]; + + // Add CPDA accounts + let cpda_start_index = 6; + for i in 0..batch_context.cpda_indices.len() { + let cpda_index = cpda_start_index + i; + if cpda_index >= remaining.len() { + return Err(ErrorCode::AccountNotEnoughKeys.into()); + } + account_infos.push(remaining[cpda_index].clone()); + } + + // Add recipient accounts for mint_to actions + if mint.is_some() { + let recipient_start = cpda_start_index + batch_context.cpda_indices.len(); + for (i, action) in mint_actions.iter().enumerate() { + let recipient_index = recipient_start + i; + if recipient_index >= remaining.len() { + return Err(ErrorCode::AccountNotEnoughKeys.into()); + } + let recipient_account = &remaining[recipient_index]; + // Verify the recipient key matches + if recipient_account.key != &action.recipient { + return Err(ErrorCode::ConstraintAddress.into()); + } + account_infos.push(recipient_account.clone()); + } + } + + // Prepare signer seeds from cmint constraints + let mut all_signer_seeds = vec![]; + + if let Some(mint) = mint { + // Add mint signer seeds if provided + if let (Some(seeds), Some(bump)) = (&mint.mint_signer_seeds, mint.mint_signer_bump) { + let mut mint_seeds: Vec<&[u8]> = seeds.iter().map(|s| s.as_slice()).collect(); + mint_seeds.push(&[bump]); + all_signer_seeds.push(mint_seeds); + } + + // Add program authority seeds if provided + if let (Some(seeds), Some(bump)) = + (&mint.program_authority_seeds, mint.program_authority_bump) + { + let mut auth_seeds: Vec<&[u8]> = seeds.iter().map(|s| s.as_slice()).collect(); + auth_seeds.push(&[bump]); + all_signer_seeds.push(auth_seeds); + } + } + + // Convert to the format invoke_signed expects + let signer_seeds: Vec<&[&[u8]]> = all_signer_seeds.iter().map(|s| s.as_slice()).collect(); + + // Execute the CPI with signer seeds + invoke_signed(&ix, &account_infos, &signer_seeds)?; + } + + Ok(()) +} + +#[cfg(feature = "compressed-mint-light")] +/// Finalizes a compressed mint by executing any queued actions in a single batch. +/// This is a compatibility wrapper that calls the batched version. +pub fn finalize_cmint<'info>( + mint: &CMint<'info>, + actions: Vec, + remaining: &[AccountInfo<'info>], + ix_data: &[u8], +) -> Result<()> { + // For backward compatibility, assume CMint index is 0 when called directly + let batch_context = CompressedBatchContext { + cpda_indices: vec![], + cmint_index: Some(0), + }; + + finalize_compressed_batch(&batch_context, Some(mint), actions, remaining, ix_data) +} + +// Stub for prepare_accounts_for_empty_compression_on_init +// This is for the 'compressible' flag (prepare for later compression, no auto-close) +#[cfg(feature = "compressed-mint-light")] +pub fn prepare_accounts_for_empty_compression_on_init( + _accounts: &[&T], + _compressed_addresses: &[[u8; 32]], + _new_address_params: &[light_sdk::instruction::NewAddressParams], + _output_state_tree_indices: &[u8], + _cpi_accounts: &light_sdk::cpi::CpiAccountsSmall, + _address_space: &[Pubkey], + _rent_recipient: &AccountInfo, +) -> Result> { + // TODO: Implement prepare_accounts_for_empty_compression_on_init + // This should prepare accounts for future compression without immediately compressing + unimplemented!("prepare_accounts_for_empty_compression_on_init not yet implemented. Use compress_on_init for now.") +} diff --git a/lang/src/lib.rs b/lang/src/lib.rs index dd4d3b64b8..942fc33353 100644 --- a/lang/src/lib.rs +++ b/lang/src/lib.rs @@ -46,6 +46,12 @@ pub mod idl; pub mod system_program; mod vec; +// Compressed mint runtime helpers (no-op by default) +#[cfg(feature = "compressed-mint")] +pub mod compressed_mint; +#[cfg(feature = "compressed-mint")] +pub use compressed_mint::CompressedBatchContext; + #[cfg(feature = "lazy-account")] mod lazy; @@ -126,6 +132,27 @@ pub trait Accounts<'info, B>: ToAccountMetas + ToAccountInfos<'info> + Sized { ) -> Result; } +/// A finalize procedure hook that runs after the user handler and before exit. +/// Programs or account wrapper types can optionally implement this to perform +/// deferred operations that must happen at the end of the instruction. +pub trait AccountsFinalize<'info>: ToAccountMetas + ToAccountInfos<'info> { + /// `program_id` is the currently executing program. + /// `remaining_accounts` are the accounts not deserialized into the `Accounts` struct. + /// `ix_data` is the raw instruction data for the handler. + fn finalize( + &self, + _program_id: &Pubkey, + _remaining_accounts: &[AccountInfo<'info>], + _ix_data: &[u8], + ) -> Result<()> { + // no-op by default + Ok(()) + } +} + +// Provide a blanket impl so all account field types satisfy AccountsFinalize by default. +// Removed blanket impl to avoid conflicting impls for Accounts structs generated by derive. + /// Associated bump seeds for `Accounts`. pub trait Bumps { /// Struct to hold account bump seeds. @@ -401,6 +428,8 @@ impl Key for Pubkey { /// The prelude contains all commonly used components of the crate. /// All programs should include it via `anchor_lang::prelude::*;`. pub mod prelude { + #[cfg(feature = "compressed-mint")] + pub use super::accounts::cmint::CMint; pub use super::{ access_control, account, accounts::account::Account, accounts::account_loader::AccountLoader, accounts::interface::Interface, @@ -412,9 +441,9 @@ pub mod prelude { require_keys_eq, require_keys_neq, require_neq, solana_program::bpf_loader_upgradeable::UpgradeableLoaderState, source, system_program::System, zero_copy, AccountDeserialize, AccountSerialize, Accounts, - AccountsClose, AccountsExit, AnchorDeserialize, AnchorSerialize, Discriminator, Id, - InitSpace, Key, Lamports, Owner, ProgramData, Result, Space, ToAccountInfo, ToAccountInfos, - ToAccountMetas, + AccountsClose, AccountsExit, AccountsFinalize, AnchorDeserialize, AnchorSerialize, + Discriminator, Id, InitSpace, Key, Lamports, Owner, ProgramData, Result, Space, + ToAccountInfo, ToAccountInfos, ToAccountMetas, }; pub use anchor_attribute_error::*; pub use borsh; diff --git a/lang/syn/src/codegen/accounts/constraints.rs b/lang/syn/src/codegen/accounts/constraints.rs index 5625c51172..418997e940 100644 --- a/lang/syn/src/codegen/accounts/constraints.rs +++ b/lang/syn/src/codegen/accounts/constraints.rs @@ -86,6 +86,7 @@ pub fn linearize(c_group: &ConstraintGroup) -> Vec { token_account, mint, realloc, + cmint: _, } = c_group.clone(); let mut constraints = Vec::new(); @@ -725,6 +726,7 @@ fn generate_constraint_init_group( decimals, freeze_authority, token_program, + compressed, group_pointer_authority, group_pointer_group_address, group_member_pointer_authority, @@ -736,6 +738,7 @@ fn generate_constraint_init_group( transfer_hook_authority, transfer_hook_program_id, } => { + let is_compressed = compressed.unwrap_or(false); let token_program = match token_program { Some(t) => t.to_token_stream(), None => quote! {token_program}, @@ -929,104 +932,118 @@ fn generate_constraint_init_group( seeds_with_bump, ); - quote! { - // Define the bump and pda variable. - #find_pda - - let #field: #ty_decl = ({ #[inline(never)] || { - // Checks that all the required accounts for this operation are present. - #optional_checks - - let owner_program = AsRef::::as_ref(&#field).owner; - if !#if_needed || owner_program == &anchor_lang::solana_program::system_program::ID { - // Define payer variable. - #payer_optional_check + if is_compressed { + // Compressed mint path: do not create or initialize a traditional SPL mint. + // We only deserialize the provided account info and skip SPL checks. + quote! { + // Define the bump and pda variable (still computed if seeds are present). + #find_pda - // Create the account with the system program. - #create_account + let #field: #ty_decl = ({ #[inline(never)] || { + let pa: #ty_decl = #from_account_info_unchecked; + Ok(pa) + }})()?; + } + } else { + quote! { + // Define the bump and pda variable. + #find_pda + + let #field: #ty_decl = ({ #[inline(never)] || { + // Checks that all the required accounts for this operation are present. + #optional_checks + + let owner_program = AsRef::::as_ref(&#field).owner; + if !#if_needed || owner_program == &anchor_lang::solana_program::system_program::ID { + // Define payer variable. + #payer_optional_check + + // Create the account with the system program. + #create_account + + // Initialize extensions. + if let Some(extensions) = #extensions { + for e in extensions { + match e { + ::anchor_spl::token_interface::spl_token_2022::extension::ExtensionType::GroupPointer => { + ::anchor_spl::token_interface::group_pointer_initialize(anchor_lang::context::CpiContext::new(#token_program.to_account_info(), ::anchor_spl::token_interface::GroupPointerInitialize { + token_program_id: #token_program.to_account_info(), + mint: #field.to_account_info(), + }), #group_pointer_authority, #group_pointer_group_address)?; + }, + ::anchor_spl::token_interface::spl_token_2022::extension::ExtensionType::GroupMemberPointer => { + ::anchor_spl::token_interface::group_member_pointer_initialize(anchor_lang::context::CpiContext::new(#token_program.to_account_info(), ::anchor_spl::token_interface::GroupMemberPointerInitialize { + token_program_id: #token_program.to_account_info(), + mint: #field.to_account_info(), + }), #group_member_pointer_authority, #group_member_pointer_member_address)?; + }, + ::anchor_spl::token_interface::spl_token_2022::extension::ExtensionType::MetadataPointer => { + ::anchor_spl::token_interface::metadata_pointer_initialize(anchor_lang::context::CpiContext::new(#token_program.to_account_info(), ::anchor_spl::token_interface::MetadataPointerInitialize { + token_program_id: #token_program.to_account_info(), + mint: #field.to_account_info(), + }), #metadata_pointer_authority, #metadata_pointer_metadata_address)?; + }, + ::anchor_spl::token_interface::spl_token_2022::extension::ExtensionType::MintCloseAuthority => { + ::anchor_spl::token_interface::mint_close_authority_initialize(anchor_lang::context::CpiContext::new(#token_program.to_account_info(), ::anchor_spl::token_interface::MintCloseAuthorityInitialize { + token_program_id: #token_program.to_account_info(), + mint: #field.to_account_info(), + }), #close_authority)?; + }, + ::anchor_spl::token_interface::spl_token_2022::extension::ExtensionType::TransferHook => { + ::anchor_spl::token_interface::transfer_hook_initialize(anchor_lang::context::CpiContext::new(#token_program.to_account_info(), ::anchor_spl::token_interface::TransferHookInitialize { + token_program_id: #token_program.to_account_info(), + mint: #field.to_account_info(), + }), #transfer_hook_authority, #transfer_hook_program_id)?; + }, + ::anchor_spl::token_interface::spl_token_2022::extension::ExtensionType::NonTransferable => { + ::anchor_spl::token_interface::non_transferable_mint_initialize(anchor_lang::context::CpiContext::new(#token_program.to_account_info(), ::anchor_spl::token_interface::NonTransferableMintInitialize { + token_program_id: #token_program.to_account_info(), + mint: #field.to_account_info(), + }))?; + }, + ::anchor_spl::token_interface::spl_token_2022::extension::ExtensionType::PermanentDelegate => { + ::anchor_spl::token_interface::permanent_delegate_initialize(anchor_lang::context::CpiContext::new(#token_program.to_account_info(), ::anchor_spl::token_interface::PermanentDelegateInitialize { + token_program_id: #token_program.to_account_info(), + mint: #field.to_account_info(), + }), #permanent_delegate.unwrap())?; + }, + // All extensions specified by the user should be implemented. + // If this line runs, it means there is a bug in the codegen. + _ => unimplemented!("{e:?}"), + } + }; + } - // Initialize extensions. - if let Some(extensions) = #extensions { - for e in extensions { - match e { - ::anchor_spl::token_interface::spl_token_2022::extension::ExtensionType::GroupPointer => { - ::anchor_spl::token_interface::group_pointer_initialize(anchor_lang::context::CpiContext::new(#token_program.to_account_info(), ::anchor_spl::token_interface::GroupPointerInitialize { - token_program_id: #token_program.to_account_info(), - mint: #field.to_account_info(), - }), #group_pointer_authority, #group_pointer_group_address)?; - }, - ::anchor_spl::token_interface::spl_token_2022::extension::ExtensionType::GroupMemberPointer => { - ::anchor_spl::token_interface::group_member_pointer_initialize(anchor_lang::context::CpiContext::new(#token_program.to_account_info(), ::anchor_spl::token_interface::GroupMemberPointerInitialize { - token_program_id: #token_program.to_account_info(), - mint: #field.to_account_info(), - }), #group_member_pointer_authority, #group_member_pointer_member_address)?; - }, - ::anchor_spl::token_interface::spl_token_2022::extension::ExtensionType::MetadataPointer => { - ::anchor_spl::token_interface::metadata_pointer_initialize(anchor_lang::context::CpiContext::new(#token_program.to_account_info(), ::anchor_spl::token_interface::MetadataPointerInitialize { - token_program_id: #token_program.to_account_info(), - mint: #field.to_account_info(), - }), #metadata_pointer_authority, #metadata_pointer_metadata_address)?; - }, - ::anchor_spl::token_interface::spl_token_2022::extension::ExtensionType::MintCloseAuthority => { - ::anchor_spl::token_interface::mint_close_authority_initialize(anchor_lang::context::CpiContext::new(#token_program.to_account_info(), ::anchor_spl::token_interface::MintCloseAuthorityInitialize { - token_program_id: #token_program.to_account_info(), - mint: #field.to_account_info(), - }), #close_authority)?; - }, - ::anchor_spl::token_interface::spl_token_2022::extension::ExtensionType::TransferHook => { - ::anchor_spl::token_interface::transfer_hook_initialize(anchor_lang::context::CpiContext::new(#token_program.to_account_info(), ::anchor_spl::token_interface::TransferHookInitialize { - token_program_id: #token_program.to_account_info(), - mint: #field.to_account_info(), - }), #transfer_hook_authority, #transfer_hook_program_id)?; - }, - ::anchor_spl::token_interface::spl_token_2022::extension::ExtensionType::NonTransferable => { - ::anchor_spl::token_interface::non_transferable_mint_initialize(anchor_lang::context::CpiContext::new(#token_program.to_account_info(), ::anchor_spl::token_interface::NonTransferableMintInitialize { - token_program_id: #token_program.to_account_info(), - mint: #field.to_account_info(), - }))?; - }, - ::anchor_spl::token_interface::spl_token_2022::extension::ExtensionType::PermanentDelegate => { - ::anchor_spl::token_interface::permanent_delegate_initialize(anchor_lang::context::CpiContext::new(#token_program.to_account_info(), ::anchor_spl::token_interface::PermanentDelegateInitialize { - token_program_id: #token_program.to_account_info(), - mint: #field.to_account_info(), - }), #permanent_delegate.unwrap())?; - }, - // All extensions specified by the user should be implemented. - // If this line runs, it means there is a bug in the codegen. - _ => unimplemented!("{e:?}"), - } + // Initialize the mint account. + let cpi_program = #token_program.to_account_info(); + let accounts = ::anchor_spl::token_interface::InitializeMint2 { + mint: #field.to_account_info(), }; + let cpi_ctx = anchor_lang::context::CpiContext::new(cpi_program, accounts); + ::anchor_spl::token_interface::initialize_mint2(cpi_ctx, #decimals, &#owner.key(), #freeze_authority)?; } - // Initialize the mint account. - let cpi_program = #token_program.to_account_info(); - let accounts = ::anchor_spl::token_interface::InitializeMint2 { - mint: #field.to_account_info(), - }; - let cpi_ctx = anchor_lang::context::CpiContext::new(cpi_program, accounts); - ::anchor_spl::token_interface::initialize_mint2(cpi_ctx, #decimals, &#owner.key(), #freeze_authority)?; - } - - let pa: #ty_decl = #from_account_info_unchecked; - if #if_needed { - if pa.mint_authority != anchor_lang::solana_program::program_option::COption::Some(#owner.key()) { - return Err(anchor_lang::error::Error::from(anchor_lang::error::ErrorCode::ConstraintMintMintAuthority).with_account_name(#name_str)); - } - if pa.freeze_authority - .as_ref() - .map(|fa| #freeze_authority.as_ref().map(|expected_fa| fa != *expected_fa).unwrap_or(true)) - .unwrap_or(#freeze_authority.is_some()) { - return Err(anchor_lang::error::Error::from(anchor_lang::error::ErrorCode::ConstraintMintFreezeAuthority).with_account_name(#name_str)); - } - if pa.decimals != #decimals { - return Err(anchor_lang::error::Error::from(anchor_lang::error::ErrorCode::ConstraintMintDecimals).with_account_name(#name_str).with_values((pa.decimals, #decimals))); - } - if owner_program != &#token_program.key() { - return Err(anchor_lang::error::Error::from(anchor_lang::error::ErrorCode::ConstraintMintTokenProgram).with_account_name(#name_str).with_pubkeys((*owner_program, #token_program.key()))); + let pa: #ty_decl = #from_account_info_unchecked; + if #if_needed { + if pa.mint_authority != anchor_lang::solana_program::program_option::COption::Some(#owner.key()) { + return Err(anchor_lang::error::Error::from(anchor_lang::error::ErrorCode::ConstraintMintMintAuthority).with_account_name(#name_str)); + } + if pa.freeze_authority + .as_ref() + .map(|fa| #freeze_authority.as_ref().map(|expected_fa| fa != *expected_fa).unwrap_or(true)) + .unwrap_or(#freeze_authority.is_some()) { + return Err(anchor_lang::error::Error::from(anchor_lang::error::ErrorCode::ConstraintMintFreezeAuthority).with_account_name(#name_str)); + } + if pa.decimals != #decimals { + return Err(anchor_lang::error::Error::from(anchor_lang::error::ErrorCode::ConstraintMintDecimals).with_account_name(#name_str).with_values((pa.decimals, #decimals))); + } + if owner_program != &#token_program.key() { + return Err(anchor_lang::error::Error::from(anchor_lang::error::ErrorCode::ConstraintMintTokenProgram).with_account_name(#name_str).with_pubkeys((*owner_program, #token_program.key()))); + } } - } - Ok(pa) - }})()?; + Ok(pa) + }})()?; + } } } InitKind::Program { owner } | InitKind::Interface { owner } => { diff --git a/lang/syn/src/codegen/accounts/exit.rs b/lang/syn/src/codegen/accounts/exit.rs index 06bdea1e8e..43f882aca2 100644 --- a/lang/syn/src/codegen/accounts/exit.rs +++ b/lang/syn/src/codegen/accounts/exit.rs @@ -62,7 +62,378 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { } }) .collect(); + + // Scan for compressible Account fields and CMints to assign indices + let mut compressible_fields = Vec::new(); + let mut compress_on_init_fields = Vec::new(); + let mut cmint_field = None; + + for af in &accs.fields { + if let AccountField::Field(f) = af { + // Check if this is a compressible Account + if matches!(&f.ty, Ty::Account(_)) { + if let Some(init) = &f.constraints.init { + if init.compressible { + compressible_fields.push(&f.ident); + } else if init.compress_on_init { + compress_on_init_fields.push(&f.ident); + } + } + } else if matches!(&f.ty, Ty::CMint(_)) { + if cmint_field.is_none() { + cmint_field = Some(&f.ident); + } + } + } + } + + // Check for conflicting compression modes + if !compressible_fields.is_empty() && !compress_on_init_fields.is_empty() { + return syn::Error::new( + proc_macro2::Span::call_site(), + "Cannot mix 'compressible' and 'compress_on_init' flags on different accounts. Use either all 'compressible' or all 'compress_on_init'." + ).to_compile_error(); + } + + // Determine which fields to process + let fields_to_process = if !compress_on_init_fields.is_empty() { + &compress_on_init_fields + } else if !compressible_fields.is_empty() { + &compressible_fields + } else { + &Vec::new() + }; + + // Generate the batched finalize for compressed operations + let compressed_finalize = if !fields_to_process.is_empty() || cmint_field.is_some() { + use quote::format_ident; + + // Build per-compressible account blocks + let mut compress_blocks: Vec = Vec::new(); + let mut new_address_params_idents: Vec = Vec::new(); + + for (index, ident) in fields_to_process.iter().enumerate() { + let idx_lit = index as u8; + // Build the corresponding "_address_tree_info" identifier from ix args + let info_ident = format_ident!("{}_address_tree_info", ident); + + // Resolve the account type for generic prepare function + let acc_ty_path = match accs + .fields + .iter() + .find_map(|af| match af { + AccountField::Field(f) if &f.ident == *ident => { + match &f.ty { + Ty::Account(account_ty) => Some(account_ty.account_type_path.clone()), + _ => None, + } + } + _ => None, + }) { + Some(p) => p, + None => panic!("Invariant: compressible Account type path not found"), + }; + + // Handle boxed vs unboxed Account + let acc_expr = match accs + .fields + .iter() + .find_map(|af| match af { + AccountField::Field(f) if &f.ident == *ident => { + match &f.ty { + Ty::Account(account_ty) => { + if account_ty.boxed { Some(quote! { &*self.#ident }) } else { Some(quote! { &self.#ident }) } + } + _ => None, + } + } + _ => None, + }) { + Some(expr) => expr, + None => panic!("Invariant: compressible Account expr not found"), + }; + + let new_addr_params_ident = format_ident!("{}_new_address_params", ident); + let compressed_address_ident = format_ident!("{}_compressed_address", ident); + let compressed_infos_ident = format_ident!("{}_compressed_infos", ident); + new_address_params_idents.push(quote! { #new_addr_params_ident }); + + // Different preparation based on compression mode + let prepare_fn = if !compress_on_init_fields.is_empty() { + quote! { prepare_accounts_for_compression_on_init } + } else { + quote! { prepare_accounts_for_empty_compression_on_init } + }; + + compress_blocks.push(quote! { + // Build new address params for #ident + let #new_addr_params_ident = compression_params.#info_ident + .into_new_address_params_assigned_packed( + self.#ident.key().to_bytes(), + true, + Some(#idx_lit), + ); + + // Derive compressed address for #ident + let #compressed_address_ident = light_compressed_account::address::derive_address( + &self.#ident.key().to_bytes(), + &cpi_accounts + .get_tree_address(#new_addr_params_ident.address_merkle_tree_account_index) + .unwrap() + .key + .to_bytes(), + &crate::ID.to_bytes(), + ); + + // Prepare accounts for compression for #ident + let #compressed_infos_ident = light_sdk::compressible::#prepare_fn::<#acc_ty_path>( + &[#acc_expr], + &[#compressed_address_ident], + &[#new_addr_params_ident], + &[compression_params.output_state_tree_index], + &cpi_accounts, + &address_space, + &self.rent_recipient, + )?; + all_compressed_infos.extend(#compressed_infos_ident); + }); + } + + let compressible_count = fields_to_process.len() as u32; + let cmint_index = if cmint_field.is_some() { + quote! { Some(#compressible_count) } + } else { + quote! { None } + }; + + let mint_ident = cmint_field.cloned(); + + // Build mint actions extraction and mint creation block + let cmint_block = if let Some(cmint_ident) = mint_ident { + quote! { + // Drain queued CMint actions + let __mint_actions = self.#cmint_ident.take_actions(); + + if !__mint_actions.is_empty() { + // Tree accounts indices + let output_state_queue_idx: u8 = 0; + let address_tree_idx: u8 = 1; + let output_state_queue = *cpi_accounts.tree_accounts().unwrap()[output_state_queue_idx as usize].key; + let address_tree_pubkey = *cpi_accounts.tree_accounts().unwrap()[address_tree_idx as usize].key; + + // Derive compressed mint address from SPL mint addr (self.#cmint_ident is used as SPL mint key) + let mint_compressed_address = light_compressed_token_sdk::instructions::derive_compressed_mint_from_spl_mint( + &self.#cmint_ident.key(), + &address_tree_pubkey, + ); + + // Build compressed mint with context + let compressed_mint_with_context = light_ctoken_types::instructions::mint_action::CompressedMintWithContext::new( + mint_compressed_address, + compression_params.lp_mint_address_tree_info.root_index, + self.#cmint_ident.decimals.unwrap_or(9), + Some(self.authority.key().into()), + Some(self.authority.key().into()), + self.#cmint_ident.key().into(), + ); + + // Build actions + let actions: Vec = __mint_actions + .iter() + .map(|a| light_compressed_token_sdk::instructions::MintActionType::MintToCToken { + account: a.recipient, + amount: a.amount, + }) + .collect(); + + // Create mint inputs + let inputs = light_compressed_token_sdk::instructions::CreateMintInputs { + compressed_mint_inputs: compressed_mint_with_context, + mint_seed: self.#cmint_ident.key(), + mint_bump: compression_params.lp_mint_bump, + authority: self.authority.key().into(), + payer: self.creator.key(), + proof: compression_params.proof.0.map(|p| light_compressed_token_sdk::CompressedProof::from(p)), + address_tree: address_tree_pubkey, + output_queue: output_state_queue, + actions, + }; + + // Build instruction + let mint_action_instruction: anchor_lang::solana_program::instruction::Instruction = + light_compressed_token_sdk::instructions::create_mint_action_cpi( + light_compressed_token_sdk::instructions::MintActionInputs::new_create_mint(inputs), + Some(light_ctoken_types::instructions::mint_action::CpiContext::last_cpi_create_mint( + address_tree_idx, + output_state_queue_idx, + #compressible_count, + )), + Some(cpi_accounts.cpi_context().unwrap().key()), + )?; + + // Accounts for CPI + let mut account_infos = cpi_accounts.to_account_infos(); + account_infos.extend([ + self.compressed_token_program_cpi_authority.clone(), + self.compressed_token_program.clone(), + self.authority.clone(), + self.creator.clone(), + // recipients + self.lp_vault.clone(), + self.creator_lp_token.clone(), + ]); + + // Signer seeds + let mut signer_seeds: Vec<&[&[u8]]> = Vec::new(); + if let (Some(seeds), Some(bump)) = (&self.#cmint_ident.mint_signer_seeds, self.#cmint_ident.mint_signer_bump) { + let mut s: Vec<&[u8]> = seeds.iter().map(|v| v.as_slice()).collect(); + s.push(&[bump]); + signer_seeds.push(Box::leak(s.into_boxed_slice())); + } + if let (Some(seeds), Some(bump)) = (&self.#cmint_ident.program_authority_seeds, self.#cmint_ident.program_authority_bump) { + let mut s: Vec<&[u8]> = seeds.iter().map(|v| v.as_slice()).collect(); + s.push(&[bump]); + signer_seeds.push(Box::leak(s.into_boxed_slice())); + } + + anchor_lang::solana_program::program::invoke_signed( + &mint_action_instruction, + &account_infos, + &signer_seeds, + )?; + } + } + } else { + quote! {} + }; + + // Build the full compressed finalize block + quote! { + #[cfg(feature = "compressed-mint")] + { + use borsh::BorshDeserialize; + + // Build CPI accounts with CPI context signer + let cpi_accounts = light_sdk::cpi::CpiAccountsSmall::new_with_config( + &self.creator, + _remaining, + light_sdk_types::CpiAccountsConfig::new_with_cpi_context(crate::LIGHT_CPI_SIGNER), + ); + + // Load compression config + let compression_config = light_sdk::compressible::CompressibleConfig::load_checked(&self.compression_config, &crate::ID)?; + let address_space = compression_config.address_space; + + // Parse compression params from ix_data + #[derive(BorshDeserialize)] + struct InitializeCompressionParams { + pub pool_address_tree_info: light_sdk::instruction::PackedAddressTreeInfo, + pub observation_address_tree_info: light_sdk::instruction::PackedAddressTreeInfo, + pub lp_mint_address_tree_info: light_sdk::instruction::PackedAddressTreeInfo, + pub lp_mint_bump: u8, + pub creator_lp_token_bump: u8, + pub proof: light_sdk::instruction::borsh_compat::ValidityProof, + pub output_state_tree_index: u8, + } + let compression_params = { + let mut slice = &_ix_data[8..]; + InitializeCompressionParams::try_from_slice(&mut slice) + .map_err(|_| anchor_lang::error::ErrorCode::InvalidInstructionData)? + }; + + // Collect compressed infos for all compressible accounts + let mut all_compressed_infos = Vec::new(); + #(#compress_blocks)* + + // Invoke ONE system-program batched CPI for all CPDAs + let cpi_inputs = light_sdk::cpi::CpiInputs::new_first_cpi( + all_compressed_infos, + vec![#(#new_address_params_idents),*], + ); + let cpi_context = cpi_accounts.cpi_context().unwrap(); + let cpi_context_accounts = light_sdk_types::cpi_context_write::CpiContextWriteAccounts { + fee_payer: cpi_accounts.fee_payer(), + authority: cpi_accounts.authority().unwrap(), + cpi_context, + cpi_signer: crate::LIGHT_CPI_SIGNER, + }; + cpi_inputs.invoke_light_system_program_cpi_context(cpi_context_accounts)?; + + // Then chain CMint creation and mint_to actions as last CPI + #cmint_block + } + } + } else { + quote! {} + }; + + // Generate auto-close for compress_on_init fields + let auto_close_block = if !compress_on_init_fields.is_empty() { + let close_statements: Vec<_> = compress_on_init_fields.iter().map(|ident| { + quote! { + self.#ident.close(self.rent_recipient.clone())?; + } + }).collect(); + + quote! { + // Auto-close accounts marked with compress_on_init + #(#close_statements)* + } + } else { + quote! {} + }; + + // Regular finalize for non-compressed accounts + let on_finalize: Vec = accs + .fields + .iter() + .map(|af: &AccountField| match af { + AccountField::CompositeField(s) => { + let name = &s.ident; + let name_str = name.to_string(); + quote! { + // Composite fields do not implement finalize by default. + } + } + AccountField::Field(f) => { + let ident = &f.ident; + let name_str = ident.to_string(); + match &f.ty { + Ty::AccountInfo | Ty::UncheckedAccount | Ty::Signer | + Ty::SystemAccount | Ty::ProgramData | Ty::CMint(_) => { + // Skip these - CMint handled in batched finalize + quote! {} + } + Ty::Account(_) if f.constraints.init.as_ref().map(|i| i.compressible).unwrap_or(false) => { + // Skip compressible accounts - handled in batched finalize + quote! {} + } + _ => quote! { + anchor_lang::AccountsFinalize::finalize(&self.#ident, program_id, _remaining, _ix_data) + .map_err(|e| e.with_account_name(#name_str))?; + }, + } + } + }) + .collect(); quote! { + #[automatically_derived] + impl<#combined_generics> anchor_lang::AccountsFinalize<#trait_generics> for #name<#struct_generics> #where_clause{ + fn finalize( + &self, + program_id: &anchor_lang::solana_program::pubkey::Pubkey, + _remaining: &[anchor_lang::solana_program::account_info::AccountInfo<#trait_generics>], + _ix_data: &[u8], + ) -> anchor_lang::Result<()> { + // Finalize all nested/composite fields first, then each field. + #(#on_finalize)* + // Run compressed operations (CPDAs + CMint) in a single batched CPI + #compressed_finalize + #auto_close_block + Ok(()) + } + } + #[automatically_derived] impl<#combined_generics> anchor_lang::AccountsExit<#trait_generics> for #name<#struct_generics> #where_clause{ fn exit(&self, program_id: &anchor_lang::solana_program::pubkey::Pubkey) -> anchor_lang::Result<()> { diff --git a/lang/syn/src/codegen/accounts/try_accounts.rs b/lang/syn/src/codegen/accounts/try_accounts.rs index 17a5b5870a..077d354343 100644 --- a/lang/syn/src/codegen/accounts/try_accounts.rs +++ b/lang/syn/src/codegen/accounts/try_accounts.rs @@ -68,11 +68,66 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { } else { let name = f.ident.to_string(); let typed_name = f.typed_ident(); - quote! { - #[cfg(feature = "anchor-debug")] - ::solana_program::log::sol_log(stringify!(#typed_name)); - let #typed_name = anchor_lang::Accounts::try_accounts(__program_id, __accounts, __ix_data, __bumps, __reallocs) - .map_err(|e| e.with_account_name(#name))?; + + // Special handling for CMint fields to populate constraints + if matches!(&f.ty, crate::Ty::CMint(_)) { + let ident = &f.ident; + let cmint_setup = if let Some(cmint_group) = &f.constraints.cmint { + let authority = cmint_group.authority.as_ref().map(|a| quote! { + #ident.authority = Some(#a); + }); + let decimals = cmint_group.decimals.map(|d| quote! { + #ident.decimals = Some(#d); + }); + let mint_signer_seeds = cmint_group.mint_signer_seeds.as_ref().map(|seeds| { + let seed_bytes: Vec<_> = seeds.iter().map(|s| quote! { + anchor_lang::ToAccountInfo::to_account_info(&#s).key.to_bytes().to_vec() + }).collect(); + quote! { + #ident.mint_signer_seeds = Some(vec![#(#seed_bytes),*]); + } + }); + let mint_signer_bump = cmint_group.mint_signer_bump.as_ref().map(|b| quote! { + #ident.mint_signer_bump = Some(#b); + }); + let program_authority_seeds = cmint_group.program_authority_seeds.as_ref().map(|seeds| { + let seed_bytes: Vec<_> = seeds.iter().map(|s| quote! { + anchor_lang::ToAccountInfo::to_account_info(&#s).key.to_bytes().to_vec() + }).collect(); + quote! { + #ident.program_authority_seeds = Some(vec![#(#seed_bytes),*]); + } + }); + let program_authority_bump = cmint_group.program_authority_bump.as_ref().map(|b| quote! { + #ident.program_authority_bump = Some(#b); + }); + + quote! { + #authority + #decimals + #mint_signer_seeds + #mint_signer_bump + #program_authority_seeds + #program_authority_bump + } + } else { + quote! {} + }; + + quote! { + #[cfg(feature = "anchor-debug")] + ::solana_program::log::sol_log(stringify!(#typed_name)); + let mut #typed_name = anchor_lang::Accounts::try_accounts(__program_id, __accounts, __ix_data, __bumps, __reallocs) + .map_err(|e| e.with_account_name(#name))?; + #cmint_setup + } + } else { + quote! { + #[cfg(feature = "anchor-debug")] + ::solana_program::log::sol_log(stringify!(#typed_name)); + let #typed_name = anchor_lang::Accounts::try_accounts(__program_id, __accounts, __ix_data, __bumps, __reallocs) + .map_err(|e| e.with_account_name(#name))?; + } } } } diff --git a/lang/syn/src/codegen/program/handlers.rs b/lang/syn/src/codegen/program/handlers.rs index 1eb6d0214f..083b6c4de8 100644 --- a/lang/syn/src/codegen/program/handlers.rs +++ b/lang/syn/src/codegen/program/handlers.rs @@ -158,7 +158,8 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { // Maybe set Solana return data. #maybe_set_return_data - // Exit routine. + // Finalize then exit routine. + anchor_lang::AccountsFinalize::finalize(&__accounts, __program_id, __remaining_accounts, __ix_data)?; __accounts.exit(__program_id) } } diff --git a/lang/syn/src/lib.rs b/lang/syn/src/lib.rs index 33bc08b7cd..624c1baf66 100644 --- a/lang/syn/src/lib.rs +++ b/lang/syn/src/lib.rs @@ -466,6 +466,7 @@ impl Field { Ty::Account(_) => quote! { anchor_lang::accounts::account::Account }, + Ty::CMint(_) => quote! { anchor_lang::accounts::cmint::CMint }, Ty::LazyAccount(_) => quote! { anchor_lang::accounts::lazy_account::LazyAccount }, @@ -495,6 +496,7 @@ impl Field { Ty::UncheckedAccount => quote! { UncheckedAccount }, + Ty::CMint(_) => quote! { CMint }, Ty::Signer => quote! { Signer }, @@ -571,6 +573,7 @@ pub struct CompositeField { pub enum Ty { AccountInfo, UncheckedAccount, + CMint(CMintTy), AccountLoader(AccountLoaderTy), Sysvar(SysvarTy), Account(AccountTy), @@ -637,6 +640,16 @@ pub struct InterfaceTy { pub account_type_path: TypePath, } +#[derive(Debug, PartialEq, Eq)] +pub struct CMintTy { + pub authority: Option, + pub decimals: Option, + pub mint_signer_seeds: Option>, + pub mint_signer_bump: Option, + pub program_authority_seeds: Option>, + pub program_authority_bump: Option, +} + #[derive(Debug)] pub struct Error { pub name: String, @@ -691,6 +704,8 @@ pub struct ConstraintGroup { pub token_account: Option, pub mint: Option, pub realloc: Option, + // CMint constraints + pub cmint: Option, } impl ConstraintGroup { @@ -763,6 +778,8 @@ pub enum ConstraintToken { MintFreezeAuthority(Context), MintDecimals(Context), MintTokenProgram(Context), + // New: mint::compressed = true/false + MintCompressed(Context), Bump(Context), ProgramSeed(Context), Realloc(Context), @@ -783,6 +800,13 @@ pub enum ConstraintToken { ExtensionTokenHookAuthority(Context), ExtensionTokenHookProgramId(Context), ExtensionPermanentDelegate(Context), + // CMint constraints + CMintAuthority(Context), + CMintDecimals(Context), + CMintSignerSeeds(Context), + CMintSignerBump(Context), + CMintProgramAuthoritySeeds(Context), + CMintProgramAuthorityBump(Context), } impl Parse for ConstraintToken { @@ -794,6 +818,8 @@ impl Parse for ConstraintToken { #[derive(Debug, Clone)] pub struct ConstraintInit { pub if_needed: bool, + pub compressible: bool, + pub compress_on_init: bool, } #[derive(Debug, Clone)] @@ -871,6 +897,8 @@ pub struct ConstraintInitGroup { pub payer: Expr, pub space: Option, pub kind: InitKind, + pub compressible: bool, + pub compress_on_init: bool, } #[derive(Debug, Clone)] @@ -956,6 +984,8 @@ pub enum InitKind { freeze_authority: Option, decimals: Expr, token_program: Option, + // New flag to trigger cMint flow + compressed: Option, // extensions group_pointer_authority: Option, group_pointer_group_address: Option, @@ -1045,6 +1075,51 @@ pub struct ConstraintMintDecimals { pub decimals: Expr, } +#[derive(Debug, Clone)] +pub struct ConstraintMintCompressed { + pub compressed: bool, +} + +#[derive(Debug, Clone)] +pub struct ConstraintCMintAuthority { + pub authority: Expr, +} + +#[derive(Debug, Clone)] +pub struct ConstraintCMintDecimals { + pub decimals: u8, +} + +#[derive(Debug, Clone)] +pub struct ConstraintCMintSignerSeeds { + pub seeds: Vec, +} + +#[derive(Debug, Clone)] +pub struct ConstraintCMintSignerBump { + pub bump: Expr, +} + +#[derive(Debug, Clone)] +pub struct ConstraintCMintProgramAuthoritySeeds { + pub seeds: Vec, +} + +#[derive(Debug, Clone)] +pub struct ConstraintCMintProgramAuthorityBump { + pub bump: Expr, +} + +#[derive(Debug, Clone)] +pub struct ConstraintCMintGroup { + pub authority: Option, + pub decimals: Option, + pub mint_signer_seeds: Option>, + pub mint_signer_bump: Option, + pub program_authority_seeds: Option>, + pub program_authority_bump: Option, +} + #[derive(Debug, Clone)] pub struct ConstraintTokenBump { pub bump: Option, @@ -1075,6 +1150,8 @@ pub struct ConstraintTokenMintGroup { pub mint_authority: Option, pub freeze_authority: Option, pub token_program: Option, + // New: compressed mint flag (cMint) + pub compressed: Option, pub group_pointer_authority: Option, pub group_pointer_group_address: Option, pub group_member_pointer_authority: Option, diff --git a/lang/syn/src/parser/accounts/constraints.rs b/lang/syn/src/parser/accounts/constraints.rs index 39617ea486..5fe6e790e8 100644 --- a/lang/syn/src/parser/accounts/constraints.rs +++ b/lang/syn/src/parser/accounts/constraints.rs @@ -28,12 +28,26 @@ pub fn parse_token(stream: ParseStream) -> ParseResult { let c = match kw.as_str() { "init" => ConstraintToken::Init(Context::new( ident.span(), - ConstraintInit { if_needed: false }, + ConstraintInit { if_needed: false, compressible: false, compress_on_init: false }, )), "init_if_needed" => ConstraintToken::Init(Context::new( ident.span(), - ConstraintInit { if_needed: true }, + ConstraintInit { if_needed: true, compressible: false, compress_on_init: false }, )), + "compressible" => { + // For prepare-only compression (no auto-close) + ConstraintToken::Init(Context::new( + ident.span(), + ConstraintInit { if_needed: false, compressible: true, compress_on_init: false }, + )) + } + "compress_on_init" => { + // For immediate compression with auto-close + ConstraintToken::Init(Context::new( + ident.span(), + ConstraintInit { if_needed: false, compressible: false, compress_on_init: true }, + )) + } "zero" => ConstraintToken::Zeroed(Context::new(ident.span(), ConstraintZeroed {})), "mut" => ConstraintToken::Mut(Context::new( ident.span(), @@ -86,6 +100,15 @@ pub fn parse_token(stream: ParseStream) -> ParseResult { token_program: stream.parse()?, }, )), + "compressed" => { + let lit_bool: syn::LitBool = stream.parse()?; + ConstraintToken::MintCompressed(Context::new( + span, + ConstraintMintCompressed { + compressed: lit_bool.value, + }, + )) + } _ => return Err(ParseError::new(ident.span(), "Invalid attribute")), } } @@ -293,6 +316,63 @@ pub fn parse_token(stream: ParseStream) -> ParseResult { _ => return Err(ParseError::new(ident.span(), "Invalid attribute")), } } + "cmint" => { + stream.parse::()?; + stream.parse::()?; + let kw = stream.call(Ident::parse_any)?.to_string(); + stream.parse::()?; + + let span = ident + .span() + .join(stream.span()) + .unwrap_or_else(|| ident.span()); + + match kw.as_str() { + "authority" => ConstraintToken::CMintAuthority(Context::new( + span, + ConstraintCMintAuthority { + authority: stream.parse()?, + }, + )), + "decimals" => ConstraintToken::CMintDecimals(Context::new( + span, + ConstraintCMintDecimals { + decimals: stream.parse::()?.base10_parse()?, + }, + )), + "mint_signer_seeds" => { + let seeds_stream; + let bracket = bracketed!(seeds_stream in stream); + let seeds: Punctuated = seeds_stream.parse_terminated(Expr::parse)?; + ConstraintToken::CMintSignerSeeds(Context::new( + span.join(bracket.span).unwrap_or(span), + ConstraintCMintSignerSeeds { seeds: seeds.into_iter().collect() }, + )) + } + "mint_signer_bump" => ConstraintToken::CMintSignerBump(Context::new( + span, + ConstraintCMintSignerBump { + bump: stream.parse()?, + }, + )), + "program_authority_seeds" => { + let seeds_stream; + let bracket = bracketed!(seeds_stream in stream); + let seeds: Punctuated = seeds_stream.parse_terminated(Expr::parse)?; + ConstraintToken::CMintProgramAuthoritySeeds(Context::new( + span.join(bracket.span).unwrap_or(span), + ConstraintCMintProgramAuthoritySeeds { seeds: seeds.into_iter().collect() }, + )) + } + "program_authority_bump" => ConstraintToken::CMintProgramAuthorityBump(Context::new( + span, + ConstraintCMintProgramAuthorityBump { + bump: stream.parse()?, + }, + )), + _ => return Err(ParseError::new(ident.span(), "Invalid cmint attribute")), + } + } "associated_token" => { stream.parse::()?; stream.parse::()?; @@ -525,6 +605,7 @@ pub struct ConstraintGroupBuilder<'ty> { pub mint_freeze_authority: Option>, pub mint_decimals: Option>, pub mint_token_program: Option>, + pub mint_compressed: Option>, pub extension_group_pointer_authority: Option>, pub extension_group_pointer_group_address: Option>, @@ -543,6 +624,13 @@ pub struct ConstraintGroupBuilder<'ty> { pub realloc: Option>, pub realloc_payer: Option>, pub realloc_zero: Option>, + // CMint constraints + pub cmint_authority: Option>, + pub cmint_decimals: Option>, + pub cmint_signer_seeds: Option>, + pub cmint_signer_bump: Option>, + pub cmint_program_authority_seeds: Option>, + pub cmint_program_authority_bump: Option>, } impl<'ty> ConstraintGroupBuilder<'ty> { @@ -573,6 +661,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { mint_freeze_authority: None, mint_decimals: None, mint_token_program: None, + mint_compressed: None, extension_group_pointer_authority: None, extension_group_pointer_group_address: None, extension_group_member_pointer_authority: None, @@ -588,6 +677,12 @@ impl<'ty> ConstraintGroupBuilder<'ty> { realloc: None, realloc_payer: None, realloc_zero: None, + cmint_authority: None, + cmint_decimals: None, + cmint_signer_seeds: None, + cmint_signer_bump: None, + cmint_program_authority_seeds: None, + cmint_program_authority_bump: None, } } @@ -618,8 +713,20 @@ impl<'ty> ConstraintGroupBuilder<'ty> { }; // Rent exempt if not explicitly skipped. if self.rent_exempt.is_none() { + // For compressed mints, we do not create a system account, so skip rent check by default. + let is_compressed_mint = self.mint_decimals.is_some() + && self + .mint_compressed + .as_ref() + .map(|c| c.inner.compressed) + .unwrap_or(false); + let rent_policy = if is_compressed_mint { + ConstraintRentExempt::Skip + } else { + ConstraintRentExempt::Enforce + }; self.rent_exempt - .replace(Context::new(i.span(), ConstraintRentExempt::Enforce)); + .replace(Context::new(i.span(), rent_policy)); } if self.payer.is_none() { return Err(ParseError::new( @@ -785,6 +892,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { mint_freeze_authority, mint_decimals, mint_token_program, + mint_compressed, extension_group_pointer_authority, extension_group_pointer_group_address, extension_group_member_pointer_authority, @@ -800,6 +908,12 @@ impl<'ty> ConstraintGroupBuilder<'ty> { realloc, realloc_payer, realloc_zero, + cmint_authority, + cmint_decimals, + cmint_signer_seeds, + cmint_signer_bump, + cmint_program_authority_seeds, + cmint_program_authority_bump, } = self; // Converts Option> -> Option. @@ -884,6 +998,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { &mint_authority, &mint_freeze_authority, &mint_token_program, + &mint_compressed, &extension_group_pointer_authority, &extension_group_pointer_group_address, &extension_group_member_pointer_authority, @@ -910,6 +1025,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { None, None, None, + None, ) => None, _ => Some(ConstraintTokenMintGroup { decimals: mint_decimals @@ -924,6 +1040,9 @@ impl<'ty> ConstraintGroupBuilder<'ty> { token_program: mint_token_program .as_ref() .map(|a| a.clone().into_inner().token_program), + compressed: mint_compressed + .as_ref() + .map(|a| a.clone().into_inner().compressed), // extensions group_pointer_authority: extension_group_pointer_authority .as_ref() @@ -961,6 +1080,8 @@ impl<'ty> ConstraintGroupBuilder<'ty> { Ok(ConstraintGroup { init: init.as_ref().map(|i| Ok(ConstraintInitGroup { if_needed: i.if_needed, + compressible: i.compressible, + compress_on_init: i.compress_on_init, seeds: seeds.clone(), payer: into_inner!(payer.clone()).unwrap().target, space: space.clone().map(|s| s.space.clone()), @@ -994,6 +1115,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { }, freeze_authority: mint_freeze_authority.map(|fa| fa.into_inner().mint_freeze_auth), token_program: mint_token_program.map(|tp| tp.into_inner().token_program), + compressed: mint_compressed.map(|mc| mc.into_inner().compressed), // extensions group_pointer_authority: extension_group_pointer_authority.map(|gpa| gpa.into_inner().authority), group_pointer_group_address: extension_group_pointer_group_address.map(|gpga| gpga.into_inner().group_address), @@ -1031,6 +1153,20 @@ impl<'ty> ConstraintGroupBuilder<'ty> { seeds, token_account: if !is_init {token_account} else {None}, mint: if !is_init {mint} else {None}, + cmint: if cmint_authority.is_some() || cmint_decimals.is_some() || + cmint_signer_seeds.is_some() || cmint_signer_bump.is_some() || + cmint_program_authority_seeds.is_some() || cmint_program_authority_bump.is_some() { + Some(ConstraintCMintGroup { + authority: cmint_authority.map(|c| c.into_inner().authority), + decimals: cmint_decimals.map(|c| c.into_inner().decimals), + mint_signer_seeds: cmint_signer_seeds.map(|c| c.into_inner().seeds), + mint_signer_bump: cmint_signer_bump.map(|c| c.into_inner().bump), + program_authority_seeds: cmint_program_authority_seeds.map(|c| c.into_inner().seeds), + program_authority_bump: cmint_program_authority_bump.map(|c| c.into_inner().bump), + }) + } else { + None + }, }) } @@ -1062,6 +1198,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { ConstraintToken::MintFreezeAuthority(c) => self.add_mint_freeze_authority(c), ConstraintToken::MintDecimals(c) => self.add_mint_decimals(c), ConstraintToken::MintTokenProgram(c) => self.add_mint_token_program(c), + ConstraintToken::MintCompressed(c) => self.add_mint_compressed(c), ConstraintToken::Bump(c) => self.add_bump(c), ConstraintToken::ProgramSeed(c) => self.add_program_seed(c), ConstraintToken::Realloc(c) => self.add_realloc(c), @@ -1093,11 +1230,32 @@ impl<'ty> ConstraintGroupBuilder<'ty> { ConstraintToken::ExtensionPermanentDelegate(c) => { self.add_extension_permanent_delegate(c) } + ConstraintToken::CMintAuthority(c) => self.add_cmint_authority(c), + ConstraintToken::CMintDecimals(c) => self.add_cmint_decimals(c), + ConstraintToken::CMintSignerSeeds(c) => self.add_cmint_signer_seeds(c), + ConstraintToken::CMintSignerBump(c) => self.add_cmint_signer_bump(c), + ConstraintToken::CMintProgramAuthoritySeeds(c) => self.add_cmint_program_authority_seeds(c), + ConstraintToken::CMintProgramAuthorityBump(c) => self.add_cmint_program_authority_bump(c), } } fn add_init(&mut self, c: Context) -> ParseResult<()> { - if self.init.is_some() { + if let Some(existing) = &mut self.init { + // Merge compressible flag if adding compressible to existing init + if c.inner.compressible && !existing.inner.compressible && !existing.inner.compress_on_init { + existing.inner.compressible = true; + return Ok(()); + } + // Merge compress_on_init flag if adding to existing init + if c.inner.compress_on_init && !existing.inner.compressible && !existing.inner.compress_on_init { + existing.inner.compress_on_init = true; + return Ok(()); + } + // Merge init with existing compressible/compress_on_init + if !c.inner.compressible && !c.inner.compress_on_init && (existing.inner.compressible || existing.inner.compress_on_init) { + existing.inner.if_needed = c.inner.if_needed; + return Ok(()); + } return Err(ParseError::new(c.span(), "init already provided")); } if self.zeroed.is_some() { @@ -1438,6 +1596,65 @@ impl<'ty> ConstraintGroupBuilder<'ty> { Ok(()) } + fn add_mint_compressed(&mut self, c: Context) -> ParseResult<()> { + if self.mint_compressed.is_some() { + return Err(ParseError::new( + c.span(), + "mint compressed already provided", + )); + } + self.mint_compressed.replace(c); + Ok(()) + } + + fn add_cmint_authority(&mut self, c: Context) -> ParseResult<()> { + if self.cmint_authority.is_some() { + return Err(ParseError::new(c.span(), "cmint authority already provided")); + } + self.cmint_authority.replace(c); + Ok(()) + } + + fn add_cmint_decimals(&mut self, c: Context) -> ParseResult<()> { + if self.cmint_decimals.is_some() { + return Err(ParseError::new(c.span(), "cmint decimals already provided")); + } + self.cmint_decimals.replace(c); + Ok(()) + } + + fn add_cmint_signer_seeds(&mut self, c: Context) -> ParseResult<()> { + if self.cmint_signer_seeds.is_some() { + return Err(ParseError::new(c.span(), "cmint mint_signer_seeds already provided")); + } + self.cmint_signer_seeds.replace(c); + Ok(()) + } + + fn add_cmint_signer_bump(&mut self, c: Context) -> ParseResult<()> { + if self.cmint_signer_bump.is_some() { + return Err(ParseError::new(c.span(), "cmint mint_signer_bump already provided")); + } + self.cmint_signer_bump.replace(c); + Ok(()) + } + + fn add_cmint_program_authority_seeds(&mut self, c: Context) -> ParseResult<()> { + if self.cmint_program_authority_seeds.is_some() { + return Err(ParseError::new(c.span(), "cmint program_authority_seeds already provided")); + } + self.cmint_program_authority_seeds.replace(c); + Ok(()) + } + + fn add_cmint_program_authority_bump(&mut self, c: Context) -> ParseResult<()> { + if self.cmint_program_authority_bump.is_some() { + return Err(ParseError::new(c.span(), "cmint program_authority_bump already provided")); + } + self.cmint_program_authority_bump.replace(c); + Ok(()) + } + fn add_mut(&mut self, c: Context) -> ParseResult<()> { if self.mutable.is_some() { return Err(ParseError::new(c.span(), "mut already provided")); diff --git a/lang/syn/src/parser/accounts/mod.rs b/lang/syn/src/parser/accounts/mod.rs index a4994c05ca..ece154a5f0 100644 --- a/lang/syn/src/parser/accounts/mod.rs +++ b/lang/syn/src/parser/accounts/mod.rs @@ -332,6 +332,7 @@ fn is_field_primitive(f: &syn::Field) -> ParseResult { "Sysvar" | "AccountInfo" | "UncheckedAccount" + | "CMint" | "AccountLoader" | "Account" | "LazyAccount" @@ -351,6 +352,7 @@ fn parse_ty(f: &syn::Field) -> ParseResult<(Ty, bool)> { "Sysvar" => Ty::Sysvar(parse_sysvar(&path)?), "AccountInfo" => Ty::AccountInfo, "UncheckedAccount" => Ty::UncheckedAccount, + "CMint" => Ty::CMint(parse_cmint_ty(&path)?), "AccountLoader" => Ty::AccountLoader(parse_program_account_loader(&path)?), "Account" => Ty::Account(parse_account_ty(&path)?), "LazyAccount" => Ty::LazyAccount(parse_lazy_account_ty(&path)?), @@ -590,3 +592,16 @@ fn parse_sysvar(path: &syn::Path) -> ParseResult { }; Ok(ty) } + +fn parse_cmint_ty(_path: &syn::Path) -> ParseResult { + // CMint doesn't take type parameters, just parse the constraints from #[account(...)] + // The constraints will be parsed separately in the constraints parser + Ok(CMintTy { + authority: None, + decimals: None, + mint_signer_seeds: None, + mint_signer_bump: None, + program_authority_seeds: None, + program_authority_bump: None, + }) +} From 302dc4e49dc3f350b68812454f4e3a932efebd2b Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Sat, 27 Sep 2025 08:35:04 -0400 Subject: [PATCH 04/20] first run --- CALLER_UPDATE_GUIDE.md | 160 ++++++++++ CMINT_EXAMPLE.md | 101 ++++++ COMPLETE_CPDA_CMINT_USAGE.md | 163 ++++++++++ CONSTRAINT_VALUES_USED.md | 98 ++++++ CPDA_CMINT_USAGE.md | 115 +++++++ FINAL_CALLER_INSTRUCTIONS.md | 79 +++++ FINAL_CMINT_CPDA_CONSTRAINTS.md | 165 ++++++++++ MINT_SIGNER_IMPLEMENTATION.md | 101 ++++++ UPDATE_CALLER_PROGRAM.md | 143 +++++++++ lang/Cargo.toml | 4 +- lang/src/accounts/account.rs | 6 + lang/src/accounts/account_info.rs | 4 + lang/src/accounts/account_loader.rs | 4 + lang/src/accounts/boxed.rs | 11 + lang/src/accounts/cmint.rs | 8 +- lang/src/accounts/interface.rs | 4 + lang/src/accounts/interface_account.rs | 6 + lang/src/accounts/lazy_account.rs | 7 + lang/src/accounts/option.rs | 14 + lang/src/accounts/program.rs | 4 + lang/src/accounts/signer.rs | 4 + lang/src/accounts/system_account.rs | 4 + lang/src/accounts/sysvar.rs | 4 + lang/src/accounts/unchecked_account.rs | 4 + lang/src/compressed_mint.rs | 22 +- lang/syn/src/codegen/accounts/constraints.rs | 1 + lang/syn/src/codegen/accounts/exit.rs | 297 +++++++++++++----- lang/syn/src/codegen/accounts/try_accounts.rs | 123 ++++++-- lang/syn/src/lib.rs | 76 ++++- lang/syn/src/parser/accounts/constraints.rs | 269 +++++++++++++--- spl/Cargo.toml | 2 +- 31 files changed, 1843 insertions(+), 160 deletions(-) create mode 100644 CALLER_UPDATE_GUIDE.md create mode 100644 CMINT_EXAMPLE.md create mode 100644 COMPLETE_CPDA_CMINT_USAGE.md create mode 100644 CONSTRAINT_VALUES_USED.md create mode 100644 CPDA_CMINT_USAGE.md create mode 100644 FINAL_CALLER_INSTRUCTIONS.md create mode 100644 FINAL_CMINT_CPDA_CONSTRAINTS.md create mode 100644 MINT_SIGNER_IMPLEMENTATION.md create mode 100644 UPDATE_CALLER_PROGRAM.md diff --git a/CALLER_UPDATE_GUIDE.md b/CALLER_UPDATE_GUIDE.md new file mode 100644 index 0000000000..408405ecb7 --- /dev/null +++ b/CALLER_UPDATE_GUIDE.md @@ -0,0 +1,160 @@ +# Updating the Caller Program to Use CMint + +## Step 1: Update the Account Type + +Change `lp_mint` from `UncheckedAccount` to `CMint`: + +```rust +// BEFORE: +/// CHECK: checked via mint_signer. +pub lp_mint: UncheckedAccount<'info>, + +// AFTER: +#[account( + cmint::authority = authority, + cmint::decimals = 9, + cmint::mint_signer = lp_mint_signer, // Seeds auto-extracted! +)] +pub lp_mint: CMint<'info>, +``` + +## Step 2: Add Import + +Add the CMint import at the top of the file: + +```rust +use anchor_lang::accounts::CMint; +``` + +## Step 3: Update Instruction Logic + +In your instruction handler, use the CMint's methods: + +```rust +pub fn initialize<'info>( + ctx: Context<'_, '_, '_, 'info, Initialize<'info>>, + init_amount_0: u64, + init_amount_1: u64, + mut open_time: u64, + compression_params: InitializeCompressionParams, +) -> Result<()> { + // ... existing logic ... + + // Queue mint actions (these will be batched) + ctx.accounts.lp_mint.add_mint_action( + MintActionType::MintToCToken { + account: ctx.accounts.creator_lp_token.key(), + amount: user_lp_amount, + } + )?; + + ctx.accounts.lp_mint.add_mint_action( + MintActionType::MintToCToken { + account: ctx.accounts.lp_vault.key(), + amount: vault_lp_amount, + } + )?; + + // ... rest of logic ... + + // Note: The finalize method is called automatically by Anchor! + // It will batch all mint actions and compressed PDAs into a single CPI +} +``` + +## Step 4: Remove Manual CPI Code + +Remove the manual `create_and_mint_lp` function call since it's now handled automatically: + +```rust +// REMOVE THIS: +create_and_mint_lp( + ctx.accounts.creator.to_account_info(), + ctx.accounts.authority.to_account_info(), + &ctx.accounts.lp_mint.key(), + ctx.accounts.lp_vault.to_account_info(), + ctx.accounts.creator_lp_token.to_account_info(), + ctx.accounts.lp_mint_signer.to_account_info(), + &pool_state_key, + ctx.accounts.compressed_token_program_cpi_authority.to_account_info(), + ctx.accounts.compressed_token_program.to_account_info(), + ctx.bumps.lp_mint_signer, + &compression_params, + &cpi_accounts, + user_lp_amount, + vault_lp_amount, + pool_auth_bump, +)?; +``` + +## Step 5: Ensure Proper Account Ordering + +Make sure accounts are in the correct order for the CPI. The CMint finalize will expect: + +- compressed_token_program_cpi_authority +- compressed_token_program +- authority (from cmint::authority) +- mint_signer (from cmint::mint_signer) +- creator (fee payer) +- Recipients for mint actions (creator_lp_token, lp_vault) + +## Full Example + +```rust +#[derive(Accounts)] +pub struct Initialize<'info> { + #[account(mut)] + pub creator: Signer<'info>, + + pub amm_config: Box>, + + #[account( + seeds = [AUTH_SEED.as_bytes()], + bump, + )] + pub authority: UncheckedAccount<'info>, + + #[account( + init, + seeds = [ + POOL_SEED.as_bytes(), + amm_config.key().as_ref(), + token_0_mint.key().as_ref(), + token_1_mint.key().as_ref(), + ], + bump, + payer = creator, + space = PoolState::INIT_SPACE, + compress_on_init, // Compress immediately + )] + pub pool_state: Box>, + + // ... other accounts ... + + #[account( + seeds = [ + POOL_LP_MINT_SEED.as_bytes(), + pool_state.key().as_ref(), + ], + bump, + )] + pub lp_mint_signer: UncheckedAccount<'info>, + + #[account( + cmint::authority = authority, + cmint::decimals = 9, + cmint::mint_signer = lp_mint_signer, // Auto-extracts seeds! + )] + pub lp_mint: CMint<'info>, + + // ... rest of accounts ... +} +``` + +## Benefits + +1. **No Redundant Seeds**: Seeds are defined once on `lp_mint_signer` and auto-extracted +2. **Type Safety**: `CMint` type ensures proper handling +3. **Automatic Batching**: All mint actions and compressions batched into single CPI +4. **Cleaner Code**: Less manual CPI management +5. **Anchor-Native**: Follows Anchor's patterns and conventions diff --git a/CMINT_EXAMPLE.md b/CMINT_EXAMPLE.md new file mode 100644 index 0000000000..02ddc39365 --- /dev/null +++ b/CMINT_EXAMPLE.md @@ -0,0 +1,101 @@ +# CMint with Auto-Extracted Seeds + +## Before (Redundant Seeds) + +```rust +#[derive(Accounts)] +pub struct Initialize<'info> { + // ... other accounts ... + + /// Signer PDA used to derive lp_mint and its compressed address + #[account( + seeds = [ + POOL_LP_MINT_SEED.as_bytes(), + pool_state.key().as_ref(), + ], + bump, + )] + pub lp_mint_signer: UncheckedAccount<'info>, + + /// The compressed mint + #[account( + cmint::authority = authority, + cmint::decimals = 9, + cmint::mint_signer = lp_mint_signer, + cmint::mint_signer_seeds = [ // REDUNDANT! Already defined on lp_mint_signer + POOL_LP_MINT_SEED.as_bytes(), + pool_state.key().as_ref(), + ], + cmint::mint_signer_bump, // REDUNDANT! Already defined on lp_mint_signer + )] + pub lp_mint: CMint<'info>, + + // ... other accounts ... +} +``` + +## After (Auto-Extracted Seeds) + +```rust +#[derive(Accounts)] +pub struct Initialize<'info> { + // ... other accounts ... + + /// Signer PDA used to derive lp_mint and its compressed address + #[account( + seeds = [ + POOL_LP_MINT_SEED.as_bytes(), + pool_state.key().as_ref(), + ], + bump, + )] + pub lp_mint_signer: UncheckedAccount<'info>, + + /// The compressed mint - seeds are auto-extracted from lp_mint_signer! + #[account( + cmint::authority = authority, + cmint::decimals = 9, + cmint::mint_signer = lp_mint_signer, // Seeds and bump auto-extracted from here! + // NO NEED for cmint::mint_signer_seeds or cmint::mint_signer_bump + )] + pub lp_mint: CMint<'info>, + + // ... other accounts ... +} +``` + +## How It Works + +When you specify `cmint::mint_signer = lp_mint_signer`, Anchor will: + +1. Look up the `lp_mint_signer` account in your struct +2. Extract its `seeds` and `bump` constraints +3. Automatically use those for the CMint's mint_signer_seeds and mint_signer_bump +4. Pass the correct AccountInfo and seeds to the compressed token CPI + +This follows Anchor's philosophy of reducing redundancy and making the framework more ergonomic. + +## Key Relationships + +``` +mint_signer (PDA) → used as mint_seed → spl_mint (PDA) → compressed_mint +``` + +- `mint_signer`: The PDA that acts as the seed for deriving the SPL mint +- `spl_mint` (lp_mint): Derived from mint_signer, represents the SPL mint address +- `compressed_mint`: Derived from spl_mint address + +## Manual Override Still Possible + +If needed, you can still manually specify seeds (they will override the auto-extraction): + +```rust +#[account( + cmint::authority = authority, + cmint::decimals = 9, + cmint::mint_signer = lp_mint_signer, + cmint::mint_signer_seeds = [...], // Manual override + cmint::mint_signer_bump = ..., // Manual override +)] +pub lp_mint: CMint<'info>, +``` diff --git a/COMPLETE_CPDA_CMINT_USAGE.md b/COMPLETE_CPDA_CMINT_USAGE.md new file mode 100644 index 0000000000..e800802460 --- /dev/null +++ b/COMPLETE_CPDA_CMINT_USAGE.md @@ -0,0 +1,163 @@ +# Complete CPDA and CMint Constraint System + +## The Proper Anchor Way + +We now have a complete constraint system that follows Anchor's `#[instruction(...)]` pattern perfectly. + +## CPDA (Compressed PDA) Constraints + +For accounts that should be compressed: + +```rust +#[derive(Accounts)] +#[instruction(params: InitializeCompressionParams)] +pub struct Initialize<'info> { + // For immediate compression with auto-close + #[account( + init, + seeds = [...], + bump, + payer = creator, + space = PoolState::INIT_SPACE, + compress_on_init, // This flag triggers immediate compression + cpda::address_tree_info = params.pool_address_tree_info, + cpda::proof = params.proof, + cpda::output_state_tree_index = params.output_state_tree_index, + )] + pub pool_state: Box>, + + // Another compressed PDA + #[account( + init, + seeds = [...], + bump, + payer = creator, + space = ObservationState::INIT_SPACE, + compress_on_init, // Immediate compression + cpda::address_tree_info = params.observation_address_tree_info, + cpda::proof = params.proof, + cpda::output_state_tree_index = params.output_state_tree_index, + )] + pub observation_state: Box>, + + // For compressible (prepare only, no auto-close) + #[account( + init, + seeds = [...], + bump, + payer = creator, + space = SomeState::INIT_SPACE, + cpda::address_tree_info = params.some_address_tree_info, + cpda::proof = params.proof, + cpda::output_state_tree_index = params.output_state_tree_index, + // NO compress_on_init - this will only prepare for future compression + )] + pub some_state: Box>, +} +``` + +## CMint (Compressed Mint) Constraints + +```rust + #[account( + cmint::authority = authority.key(), + cmint::decimals = 9, + cmint::payer = creator, + cmint::mint_signer = lp_mint_signer, + cmint::address_tree_info = params.lp_mint_address_tree_info, + cmint::proof = params.proof, + )] + pub lp_mint: CMint<'info>, + + #[account( + seeds = [POOL_LP_MINT_SEED.as_bytes(), pool_state.key().as_ref()], + bump, + )] + pub lp_mint_signer: UncheckedAccount<'info>, +``` + +## Instruction Data Structure + +```rust +#[derive(AnchorSerialize, AnchorDeserialize)] +pub struct InitializeCompressionParams { + // Standard params + pub init_amount_0: u64, + pub init_amount_1: u64, + pub open_time: u64, + + // CPDA params - one for each compressed account + pub pool_address_tree_info: PackedAddressTreeInfo, + pub observation_address_tree_info: PackedAddressTreeInfo, + + // CMint params + pub lp_mint_address_tree_info: PackedAddressTreeInfo, + pub lp_mint_bump: u8, + pub creator_lp_token_bump: u8, + + // Shared compression params + pub proof: ValidityProof, + pub output_state_tree_index: u8, +} +``` + +## Key Features + +### 1. **`compress_on_init` Flag** + +- When present: Account is compressed immediately and auto-closed +- When absent: Account is only prepared for future compression + +### 2. **Explicit Data Mapping** + +- `cpda::address_tree_info` - Maps to instruction data field +- `cpda::proof` - Maps to instruction data field +- `cpda::output_state_tree_index` - Maps to instruction data field + +### 3. **CMint Integration** + +- All CMint constraints work as before +- `cmint::mint_signer` links to the signer PDA +- Seeds are auto-extracted from the linked account + +### 4. **Automatic Batching** + +- All compression happens in one `invoke_signed` +- CMint creation and minting batched together +- Auto-close for `compress_on_init` accounts + +## What Happens Automatically + +1. **For `compress_on_init` accounts:** + + - Compressed immediately during instruction + - Auto-closed after compression + - Rent reclaimed to `rent_recipient` + +2. **For regular CPDA accounts (no `compress_on_init`):** + + - Prepared for compression + - Can be compressed later when inactive + - No auto-close + +3. **For CMint:** + - Created with all mint actions + - Batched with CPDA compression + - Single CPI for everything + +## Required Supporting Accounts + +These must be present (detected by name): + +- `compression_config` +- `rent_recipient` +- `compressed_token_program` +- `compressed_token_program_cpi_authority` + +## Benefits + +✅ **100% Orthodox Anchor** - Follows established patterns +✅ **Explicit Intent** - Clear data flow via constraints +✅ **Type Safety** - Compile-time validation +✅ **Flexible** - Mix compress_on_init and compressible +✅ **Clean** - No manual compression code needed diff --git a/CONSTRAINT_VALUES_USED.md b/CONSTRAINT_VALUES_USED.md new file mode 100644 index 0000000000..bda811b79b --- /dev/null +++ b/CONSTRAINT_VALUES_USED.md @@ -0,0 +1,98 @@ +# All Constraint Values Are Now Actually Used! + +## ✅ Fixed: No More Hardcoded Values + +### CMint Values Actually Used in Generated Code: + +1. **Tree Indices** - From constraints, not hardcoded: + +```rust +// BEFORE (hardcoded): +let output_state_queue_idx: u8 = 0; +let address_tree_idx: u8 = 1; + +// AFTER (from constraints): +let output_state_tree_index = #cmint_output_tree_expr; // From cmint::output_state_tree_index +let address_tree_info = #cmint_address_tree_info_expr; // From cmint::address_tree_info +let address_tree_idx = address_tree_info.address_merkle_tree_pubkey_index; +let address_queue_idx = address_tree_info.address_queue_pubkey_index; +``` + +2. **Root Index** - From address_tree_info: + +```rust +// Uses the actual root_index from the constraint +compressed_mint_with_context = CompressedMintWithContext::new( + mint_compressed_address, + address_tree_info.root_index, // From cmint::address_tree_info + ... +); +``` + +3. **Authority** - From constraint: + +```rust +authority: #cmint_authority_expr.into(), // From cmint::authority +``` + +4. **Payer** - From constraint: + +```rust +payer: #cmint_payer_expr, // From cmint::payer +``` + +5. **Proof** - From constraint: + +```rust +proof: #cmint_proof_expr.0.map(|p| ...), // From cmint::proof +``` + +6. **Mint Bump** - From constraint or instruction data: + +```rust +mint_bump: #cmint_bump_expr, // From mint_signer_bump if available +``` + +7. **CpiContext Indices** - Actually used: + +```rust +CpiContext::last_cpi_create_mint( + address_tree_idx, // From address_tree_info + output_state_tree_index, // From cmint::output_state_tree_index + #compressible_count, +) +``` + +## Complete Constraint Usage + +When you specify: + +```rust +#[account( + cmint::authority = authority.key(), + cmint::payer = creator, + cmint::proof = params.proof, + cmint::address_tree_info = params.lp_mint_address_tree_info, + cmint::output_state_tree_index = params.output_state_tree_index, +)] +pub lp_mint: CMint<'info>, +``` + +ALL these values are actually extracted and used: + +- `authority` → Used in CreateMintInputs +- `payer` → Used in CreateMintInputs +- `proof` → Used in CreateMintInputs +- `address_tree_info` → Used for tree indices AND root_index +- `output_state_tree_index` → Used for output queue selection + +## No More Magic Numbers! + +Everything is now driven by your constraints. The generated code: + +1. Extracts indices from your `PackedAddressTreeInfo` +2. Uses the correct tree accounts based on those indices +3. Passes the right values to all CPI calls +4. No hardcoded 0s and 1s! + +This is 100% data-driven from your constraints! diff --git a/CPDA_CMINT_USAGE.md b/CPDA_CMINT_USAGE.md new file mode 100644 index 0000000000..601e5db8cd --- /dev/null +++ b/CPDA_CMINT_USAGE.md @@ -0,0 +1,115 @@ +# Using CPDA and CMint Constraints with #[instruction(...)] + +## The Anchor Way: Explicit Instruction Data + +Instead of auto-generating compression code that guesses field names, we now require explicit instruction data mapping using Anchor's `#[instruction(...)]` pattern. + +## Example Usage + +```rust +#[derive(Accounts)] +#[instruction(params: InitializeParams)] // Access instruction data +pub struct Initialize<'info> { + #[account(mut)] + pub creator: Signer<'info>, + + // Compressed PDA with explicit data mapping + #[account( + init, + seeds = [...], + bump, + payer = creator, + space = PoolState::INIT_SPACE, + cpda::address_tree_info = params.pool_address_tree_info, + cpda::proof = params.proof, + )] + pub pool_state: Box>, + + // Another compressed PDA + #[account( + init, + seeds = [...], + bump, + payer = creator, + space = ObservationState::INIT_SPACE, + cpda::address_tree_info = params.observation_address_tree_info, + cpda::proof = params.proof, + )] + pub observation_state: Box>, + + // Compressed Mint with explicit data + #[account( + cmint::authority = authority, + cmint::decimals = 9, + cmint::payer = creator, + cmint::mint_signer = lp_mint_signer, + cmint::address_tree_info = params.lp_mint_address_tree_info, + cmint::proof = params.proof, + )] + pub lp_mint: CMint<'info>, + + // ... other accounts ... +} + +#[derive(AnchorSerialize, AnchorDeserialize)] +pub struct InitializeParams { + // Standard params + pub init_amount_0: u64, + pub init_amount_1: u64, + pub open_time: u64, + + // Compression params for CPDAs + pub pool_address_tree_info: PackedAddressTreeInfo, + pub observation_address_tree_info: PackedAddressTreeInfo, + + // Compression params for CMint + pub lp_mint_address_tree_info: PackedAddressTreeInfo, + pub lp_mint_bump: u8, + pub creator_lp_token_bump: u8, + + // Shared proof + pub proof: ValidityProof, + pub output_state_tree_index: u8, +} + +pub fn initialize( + ctx: Context, + params: InitializeParams, +) -> Result<()> { + // Your logic here + + // Queue mint actions for CMint + ctx.accounts.lp_mint.mint_to(&recipient1, amount1)?; + ctx.accounts.lp_mint.mint_to(&recipient2, amount2)?; + + // Everything is batched and executed automatically at the end! + Ok(()) +} +``` + +## Key Benefits + +1. **Explicit Data Mapping**: No guessing field names - you explicitly map instruction data to constraints +2. **Type Safety**: Anchor validates that the instruction data matches what's expected +3. **Orthodox Anchor**: This follows Anchor's established patterns perfectly +4. **Clear Intent**: Anyone reading the code knows exactly where compression params come from + +## What Happens Automatically + +When you use `cpda::` and `cmint::` constraints: + +1. Anchor generates the batched CPI code +2. All compressed PDAs are initialized and compressed in one batch +3. CMint is created with all queued mint actions +4. Everything happens in a single `invoke_signed` at the end + +## Required Accounts + +For this to work, you still need these accounts in your struct: + +- `compression_config`: The compression configuration account +- `compressed_token_program`: The compressed token program +- `compressed_token_program_cpi_authority`: The CPI authority +- And other Light Protocol required accounts + +But now they're detected by name automatically! diff --git a/FINAL_CALLER_INSTRUCTIONS.md b/FINAL_CALLER_INSTRUCTIONS.md new file mode 100644 index 0000000000..2ac2880d41 --- /dev/null +++ b/FINAL_CALLER_INSTRUCTIONS.md @@ -0,0 +1,79 @@ +# Final Instructions for Using CMint in Your Caller Program + +## Current Status + +✅ The Anchor fork now supports: + +- `CMint` account type +- Auto-extraction of seeds from linked accounts +- Generic bumps support for `CMint` +- Proper type generation + +## What You Need to Do + +### 1. Keep Your Current Accounts Struct + +Your `Initialize` struct is correct with: + +```rust +#[account( + seeds = [POOL_LP_MINT_SEED.as_bytes(), pool_state.key().as_ref()], + bump, +)] +pub lp_mint_signer: UncheckedAccount<'info>, + +#[account( + cmint::authority = authority.key(), + cmint::decimals = 9, + cmint::mint_signer = lp_mint_signer, // Seeds auto-extracted! +)] +pub lp_mint: CMint<'info>, +``` + +### 2. Use mint_to in Your Instruction + +```rust +// Queue mint actions (batched automatically) +ctx.accounts.lp_mint.mint_to( + &ctx.accounts.creator_lp_token.key(), + user_lp_amount, +)?; + +ctx.accounts.lp_mint.mint_to( + &ctx.accounts.lp_vault.key(), + vault_lp_amount, +)?; +``` + +### 3. Manual Finalization (Temporary) + +Since auto-generation is disabled for now, you need to manually handle the batched CPI at the end of your instruction. This involves: + +1. Setting up `CpiAccountsSmall` +2. Calling the compression functions for PDAs +3. Creating and executing the mint CPI + +**Note**: The auto-generation is temporarily disabled because it needs to detect all the required fields dynamically. For now, you'll need to keep your manual compression code. + +## What's Working + +- ✅ `CMint` type with proper lifetime support +- ✅ Auto-extraction of seeds from `lp_mint_signer` +- ✅ `mint_to` method to queue actions +- ✅ Proper constraint parsing + +## What's Not Yet Auto-Generated + +- ❌ Automatic CpiAccountsSmall setup +- ❌ Automatic compression of PDAs with `compress_on_init` +- ❌ Automatic batched CPI execution + +## Next Steps + +To fully automate, we need to: + +1. Detect required fields dynamically (compression_config, rent_recipient, etc.) +2. Generate the CpiAccountsSmall setup based on available fields +3. Generate the batched CPI only when all requirements are met + +For now, keep your manual implementation for the compression and CPI parts, but use the `CMint` type for better type safety and the auto-extracted seeds feature. diff --git a/FINAL_CMINT_CPDA_CONSTRAINTS.md b/FINAL_CMINT_CPDA_CONSTRAINTS.md new file mode 100644 index 0000000000..d5f8fd42e2 --- /dev/null +++ b/FINAL_CMINT_CPDA_CONSTRAINTS.md @@ -0,0 +1,165 @@ +# Complete CMint and CPDA Constraint System + +## ✅ All Constraints Now Available + +### CMint Constraints + +```rust +#[account( + cmint::authority = authority.key(), // Authority for the mint + cmint::decimals = 9, // Mint decimals + cmint::payer = creator, // Who pays for creation + cmint::mint_signer = lp_mint_signer, // Linked signer PDA + cmint::address_tree_info = params.lp_mint_address_tree_info, // Tree info from ix data + cmint::proof = params.proof, // Proof from ix data + cmint::output_state_tree_index = params.output_state_tree_index, // Output tree index +)] +pub lp_mint: CMint<'info>, +``` + +### CPDA Constraints + +```rust +#[account( + init, + seeds = [...], + bump, + payer = creator, + space = PoolState::INIT_SPACE, + compress_on_init, // Optional: triggers immediate compression + auto-close + cpda::address_tree_info = params.pool_address_tree_info, + cpda::proof = params.proof, + cpda::output_state_tree_index = params.output_state_tree_index, +)] +pub pool_state: Box>, +``` + +## Complete Example + +```rust +#[derive(Accounts)] +#[instruction(params: InitializeCompressionParams)] +pub struct Initialize<'info> { + #[account(mut)] + pub creator: Signer<'info>, + + #[account( + seeds = [b"authority"], + bump, + )] + pub authority: UncheckedAccount<'info>, + + // Compressed PDA with immediate compression + #[account( + init, + seeds = [ + POOL_SEED.as_bytes(), + amm_config.key().as_ref(), + token_0_mint.key().as_ref(), + token_1_mint.key().as_ref(), + ], + bump, + payer = creator, + space = PoolState::INIT_SPACE, + compress_on_init, + cpda::address_tree_info = params.pool_address_tree_info, + cpda::proof = params.proof, + cpda::output_state_tree_index = params.output_state_tree_index, + )] + pub pool_state: Box>, + + // Compressed Mint with all params + #[account( + cmint::authority = authority.key(), + cmint::decimals = 9, + cmint::payer = creator, + cmint::mint_signer = lp_mint_signer, + cmint::address_tree_info = params.lp_mint_address_tree_info, + cmint::proof = params.proof, + cmint::output_state_tree_index = params.output_state_tree_index, + )] + pub lp_mint: CMint<'info>, + + #[account( + seeds = [POOL_LP_MINT_SEED.as_bytes(), pool_state.key().as_ref()], + bump, + )] + pub lp_mint_signer: UncheckedAccount<'info>, + + // Required supporting accounts (detected by name) + pub compression_config: AccountInfo<'info>, + pub rent_recipient: AccountInfo<'info>, + pub compressed_token_program: AccountInfo<'info>, + pub compressed_token_program_cpi_authority: AccountInfo<'info>, + + // ... other accounts ... +} + +#[derive(AnchorSerialize, AnchorDeserialize)] +pub struct InitializeCompressionParams { + // Your params + pub init_amount_0: u64, + pub init_amount_1: u64, + pub open_time: u64, + + // CPDA params + pub pool_address_tree_info: PackedAddressTreeInfo, + pub observation_address_tree_info: PackedAddressTreeInfo, + + // CMint params + pub lp_mint_address_tree_info: PackedAddressTreeInfo, + pub lp_mint_bump: u8, + pub creator_lp_token_bump: u8, + + // Shared params + pub proof: ValidityProof, + pub output_state_tree_index: u8, +} + +pub fn initialize( + ctx: Context, + params: InitializeCompressionParams, +) -> Result<()> { + // Your logic... + + // Queue mint actions (batched automatically) + ctx.accounts.lp_mint.mint_to( + &ctx.accounts.creator_lp_token.key(), + user_lp_amount, + )?; + + ctx.accounts.lp_mint.mint_to( + &ctx.accounts.lp_vault.key(), + vault_lp_amount, + )?; + + // Everything else is automatic! + Ok(()) +} +``` + +## What's Generated Automatically + +The `CreateMintInputs` struct is populated from your constraints: + +```rust +CreateMintInputs { + compressed_mint_inputs: ..., + mint_seed: self.lp_mint.key(), + mint_bump: ..., + authority: /* from cmint::authority */, + payer: /* from cmint::payer */, + proof: /* from cmint::proof */, + address_tree: /* derived from trees */, + output_queue: /* derived from output_state_tree_index */, + actions: /* from your mint_to calls */, +} +``` + +## Key Points + +✅ **All params mapped from constraints** - No hardcoding +✅ **Explicit data flow** - Clear where each value comes from +✅ **Type safe** - Compile-time validation +✅ **Orthodox Anchor** - Follows established patterns +✅ **Automatic batching** - Everything in one CPI diff --git a/MINT_SIGNER_IMPLEMENTATION.md b/MINT_SIGNER_IMPLEMENTATION.md new file mode 100644 index 0000000000..2d4f4dcd2c --- /dev/null +++ b/MINT_SIGNER_IMPLEMENTATION.md @@ -0,0 +1,101 @@ +# Mint Signer AccountInfo Implementation + +## The Issue + +You correctly identified that we were collecting the mint_signer seeds for signing but NOT adding the mint_signer AccountInfo to the CPI call. This would cause the CPI to fail because the Light Protocol expects the mint_signer account to be present. + +## The Fix + +### 1. In `exit.rs` (Code Generation) + +✅ Already correctly implemented: + +```rust +// Add mint_signer if provided +if let Some(mint_signer) = &self.#cmint_ident.mint_signer { + account_infos.push(mint_signer.clone()); +} else { + // If no explicit mint_signer provided, use the CMint account itself + account_infos.push(self.#cmint_ident.to_account_info()); +} +``` + +### 2. In `compressed_mint.rs` (Runtime Implementation) + +✅ Now fixed: + +```rust +// Build account infos for the CPI +let mut account_infos = vec![ + compressed_token_program.clone(), + compressed_token_program_cpi_authority.clone(), + authority.clone(), +]; + +// Add mint_signer if we have a CMint +if let Some(mint) = mint { + if let Some(mint_signer) = &mint.mint_signer { + account_infos.push(mint_signer.clone()); + } else { + // If no explicit mint_signer provided, use the CMint account itself + account_infos.push(mint.to_account_info()); + } +} + +account_infos.extend([ + payer.clone(), + system_program.clone(), +]); +``` + +## Complete Flow + +1. **Account Definition**: User defines mint_signer with seeds + + ```rust + #[account(seeds = [...], bump)] + pub lp_mint_signer: UncheckedAccount<'info>, + + #[account(cmint::mint_signer = lp_mint_signer)] + pub lp_mint: CMint<'info>, + ``` + +2. **Seeds Auto-Extraction**: The macro extracts seeds from `lp_mint_signer` + +3. **AccountInfo Storage**: The mint_signer AccountInfo is stored in CMint struct + + ```rust + pub struct CMint<'info> { + pub mint_signer: Option>, + pub mint_signer_seeds: Option>>, + pub mint_signer_bump: Option, + // ... + } + ``` + +4. **CPI Invocation**: Both AccountInfo AND seeds are used + - AccountInfo added to `account_infos` array for the CPI + - Seeds used in `signer_seeds` for `invoke_signed` + +## Why Both Are Needed + +- **AccountInfo**: Required by the CPI instruction to identify the account +- **Seeds**: Required for signing the transaction with `invoke_signed` + +The Light Protocol's `create_mint_action_cpi` expects: + +1. The mint_signer account to be present in the accounts array +2. The seeds to sign the transaction (proving authority over the PDA) + +## Account Order for CPI + +The expected account order is: + +1. compressed_token_program +2. compressed_token_program_cpi_authority +3. authority +4. **mint_signer** (if CMint present) +5. payer +6. system_program +7. CPDA accounts (if any) +8. Recipient accounts for mint actions diff --git a/UPDATE_CALLER_PROGRAM.md b/UPDATE_CALLER_PROGRAM.md new file mode 100644 index 0000000000..c19eda4585 --- /dev/null +++ b/UPDATE_CALLER_PROGRAM.md @@ -0,0 +1,143 @@ +# How to Update Your Caller Program + +## The New Constraint System + +We now use explicit instruction data mapping with `cpda::` and `cmint::` constraints, following Anchor's `#[instruction(...)]` pattern. + +## Step 1: Update Your Accounts Struct + +```rust +#[derive(Accounts)] +#[instruction(params: InitializeCompressionParams)] // Add this! +pub struct Initialize<'info> { + #[account(mut)] + pub creator: Signer<'info>, + + // ... other accounts ... + + // For compressed PDAs, use cpda:: constraints + #[account( + init, + seeds = [ + POOL_SEED.as_bytes(), + amm_config.key().as_ref(), + token_0_mint.key().as_ref(), + token_1_mint.key().as_ref(), + ], + bump, + payer = creator, + space = PoolState::INIT_SPACE, + cpda::address_tree_info = params.pool_address_tree_info, + cpda::proof = params.proof, + )] + pub pool_state: Box>, + + #[account( + init, + seeds = [ + OBSERVATION_SEED.as_bytes(), + pool_state.key().as_ref(), + ], + bump, + payer = creator, + space = ObservationState::INIT_SPACE, + cpda::address_tree_info = params.observation_address_tree_info, + cpda::proof = params.proof, + )] + pub observation_state: Box>, + + // For compressed mints, use cmint:: constraints + #[account( + cmint::authority = authority.key(), + cmint::decimals = 9, + cmint::payer = creator, + cmint::mint_signer = lp_mint_signer, + cmint::address_tree_info = params.lp_mint_address_tree_info, + cmint::proof = params.proof, + )] + pub lp_mint: CMint<'info>, + + // ... rest of accounts ... +} +``` + +## Step 2: Update Your Instruction Handler + +```rust +pub fn initialize<'info>( + ctx: Context<'_, '_, '_, 'info, Initialize<'info>>, + params: InitializeCompressionParams, // Now just one param struct +) -> Result<()> { + // ... your logic ... + + // Queue mint actions (batched automatically) + ctx.accounts.lp_mint.mint_to( + &ctx.accounts.creator_lp_token.key(), + user_lp_amount, + )?; + + ctx.accounts.lp_mint.mint_to( + &ctx.accounts.lp_vault.key(), + vault_lp_amount, + )?; + + // Remove all manual compression code - it's automatic now! + // No need for: + // - compress_pool_and_observation_pdas() + // - create_and_mint_lp() + // - pool_state.close() + // - observation_state.close() + + Ok(()) +} +``` + +## Step 3: Keep Your InitializeCompressionParams + +Your existing struct is perfect: + +```rust +#[derive(AnchorSerialize, AnchorDeserialize, Debug)] +pub struct InitializeCompressionParams { + // Standard params + pub init_amount_0: u64, + pub init_amount_1: u64, + pub open_time: u64, + + // CPDA params + pub pool_address_tree_info: PackedAddressTreeInfo, + pub observation_address_tree_info: PackedAddressTreeInfo, + + // CMint params + pub lp_mint_address_tree_info: PackedAddressTreeInfo, + pub lp_mint_bump: u8, + pub creator_lp_token_bump: u8, + + // Shared + pub proof: ValidityProof, + pub output_state_tree_index: u8, +} +``` + +## What's Automatic Now + +1. **CPDA Compression**: Accounts with `cpda::` constraints are automatically compressed +2. **CMint Creation**: The compressed mint is created with all queued actions +3. **Batched CPI**: Everything happens in one `invoke_signed` at the end +4. **Auto-close**: CPDA accounts are automatically closed after compression + +## Required Accounts + +Make sure you still have these accounts (detected by name): + +- `compression_config` +- `compressed_token_program` +- `compressed_token_program_cpi_authority` +- `rent_recipient` + +## Benefits + +- **Cleaner Code**: Remove all manual compression logic +- **Type Safety**: Anchor validates everything at compile time +- **Orthodox Anchor**: Follows established patterns perfectly +- **Explicit Intent**: Clear data flow from instruction params to constraints diff --git a/lang/Cargo.toml b/lang/Cargo.toml index 7fdb5af473..e92e852e7b 100644 --- a/lang/Cargo.toml +++ b/lang/Cargo.toml @@ -45,7 +45,7 @@ compressed-mint-light = [ "light-hasher", "light-macros", "light-sdk-macros", - "light-compressed-account", + # "light-compressed-account", "light-compressed-token-sdk", "light-ctoken-types", "light-compressible" @@ -78,7 +78,7 @@ light-sdk-types = { path = "../../light-protocol/sdk-libs/sdk-types", features = light-hasher = { path = "../../light-protocol/program-libs/hasher", features = ["solana"], optional = true } light-macros = { path = "../../light-protocol/program-libs/macros", features = ["solana"], optional = true } light-sdk-macros = { path = "../../light-protocol/sdk-libs/macros", features = ["anchor-discriminator-compat"], optional = true } -light-compressed-account = { path = "../../light-protocol/program-libs/compressed-account", features = ["anchor"], optional = true } +# light-compressed-account = { path = "../../light-protocol/program-libs/compressed-account", features = ["anchor"], optional = true } light-compressed-token-sdk = { path = "../../light-protocol/sdk-libs/compressed-token-sdk", features = ["anchor"], optional = true } light-ctoken-types = { path = "../../light-protocol/program-libs/ctoken-types", features = ["anchor"], optional = true } light-compressible = { path = "../../light-protocol/program-libs/compressible", optional = true } diff --git a/lang/src/accounts/account.rs b/lang/src/accounts/account.rs index a8308de3fd..7d06aff892 100644 --- a/lang/src/accounts/account.rs +++ b/lang/src/accounts/account.rs @@ -386,6 +386,12 @@ impl<'info, T: AccountSerialize + AccountDeserialize + Clone> ToAccountInfos<'in } } +impl<'info, T: AccountSerialize + AccountDeserialize + Clone> crate::AccountsFinalize<'info> + for Account<'info, T> +{ + // Uses default implementation +} + impl<'info, T: AccountSerialize + AccountDeserialize + Clone> AsRef> for Account<'info, T> { diff --git a/lang/src/accounts/account_info.rs b/lang/src/accounts/account_info.rs index 872d5cd021..6351ec57f2 100644 --- a/lang/src/accounts/account_info.rs +++ b/lang/src/accounts/account_info.rs @@ -43,6 +43,10 @@ impl<'info> ToAccountInfos<'info> for AccountInfo<'info> { } } +impl<'info> crate::AccountsFinalize<'info> for AccountInfo<'info> { + // Uses default implementation +} + impl<'info> AccountsExit<'info> for AccountInfo<'info> {} impl Key for AccountInfo<'_> { diff --git a/lang/src/accounts/account_loader.rs b/lang/src/accounts/account_loader.rs index 8bc2ef6d7a..d714b74b8c 100644 --- a/lang/src/accounts/account_loader.rs +++ b/lang/src/accounts/account_loader.rs @@ -283,6 +283,10 @@ impl<'info, T: ZeroCopy + Owner> ToAccountInfos<'info> for AccountLoader<'info, } } +impl<'info, T: ZeroCopy + Owner> crate::AccountsFinalize<'info> for AccountLoader<'info, T> { + // Uses default implementation +} + impl Key for AccountLoader<'_, T> { fn key(&self) -> Pubkey { *self.acc_info.key diff --git a/lang/src/accounts/boxed.rs b/lang/src/accounts/boxed.rs index cad82440ac..d862b0dd11 100644 --- a/lang/src/accounts/boxed.rs +++ b/lang/src/accounts/boxed.rs @@ -44,6 +44,17 @@ impl<'info, T: ToAccountInfos<'info>> ToAccountInfos<'info> for Box { } } +impl<'info, T: crate::AccountsFinalize<'info>> crate::AccountsFinalize<'info> for Box { + fn finalize( + &self, + program_id: &Pubkey, + remaining_accounts: &[AccountInfo<'info>], + ix_data: &[u8], + ) -> Result<()> { + T::finalize(self, program_id, remaining_accounts, ix_data) + } +} + impl ToAccountMetas for Box { fn to_account_metas(&self, is_signer: Option) -> Vec { T::to_account_metas(self, is_signer) diff --git a/lang/src/accounts/cmint.rs b/lang/src/accounts/cmint.rs index 157cd3ca11..1690fea590 100644 --- a/lang/src/accounts/cmint.rs +++ b/lang/src/accounts/cmint.rs @@ -21,6 +21,7 @@ pub struct CMint<'info> { // Constraints from account macro pub authority: Option, pub decimals: Option, + pub mint_signer: Option>, pub mint_signer_seeds: Option>>, pub mint_signer_bump: Option, pub program_authority_seeds: Option>>, @@ -28,7 +29,7 @@ pub struct CMint<'info> { } impl<'info> CMint<'info> { - pub fn mint_to(&self, recipient: &Pubkey, amount: u64) -> Result<()> { + pub fn mint_to(&self, recipient: &Pubkey, amount: u64) -> crate::Result<()> { self.actions.borrow_mut().push(MintAction { recipient: *recipient, amount, @@ -69,12 +70,12 @@ impl<'info> Key for CMint<'info> { } } -impl<'info> Accounts<'info, ()> for CMint<'info> { +impl<'info, T> Accounts<'info, T> for CMint<'info> { fn try_accounts( _program_id: &Pubkey, accounts: &mut &'info [AccountInfo<'info>], _ix_data: &[u8], - _bumps: &mut (), + _bumps: &mut T, _reallocs: &mut BTreeSet, ) -> Result { if accounts.is_empty() { @@ -87,6 +88,7 @@ impl<'info> Accounts<'info, ()> for CMint<'info> { actions: RefCell::new(Vec::new()), authority: None, decimals: None, + mint_signer: None, mint_signer_seeds: None, mint_signer_bump: None, program_authority_seeds: None, diff --git a/lang/src/accounts/interface.rs b/lang/src/accounts/interface.rs index 8f742014e6..eb80091898 100644 --- a/lang/src/accounts/interface.rs +++ b/lang/src/accounts/interface.rs @@ -135,6 +135,10 @@ impl<'info, T> ToAccountInfos<'info> for Interface<'info, T> { } } +impl<'info, T> crate::AccountsFinalize<'info> for Interface<'info, T> { + // Uses default implementation +} + impl<'info, T: AccountDeserialize> AccountsExit<'info> for Interface<'info, T> {} impl Key for Interface<'_, T> { diff --git a/lang/src/accounts/interface_account.rs b/lang/src/accounts/interface_account.rs index 51efd13e60..6237e71810 100644 --- a/lang/src/accounts/interface_account.rs +++ b/lang/src/accounts/interface_account.rs @@ -290,6 +290,12 @@ impl<'info, T: AccountSerialize + AccountDeserialize + Clone> ToAccountInfos<'in } } +impl<'info, T: AccountSerialize + AccountDeserialize + Clone> crate::AccountsFinalize<'info> + for InterfaceAccount<'info, T> +{ + // Uses default implementation +} + impl<'info, T: AccountSerialize + AccountDeserialize + Clone> AsRef> for InterfaceAccount<'info, T> { diff --git a/lang/src/accounts/lazy_account.rs b/lang/src/accounts/lazy_account.rs index 8ac3030222..f0fa3cc9b5 100644 --- a/lang/src/accounts/lazy_account.rs +++ b/lang/src/accounts/lazy_account.rs @@ -319,6 +319,13 @@ where } } +impl<'info, T> crate::AccountsFinalize<'info> for LazyAccount<'info, T> +where + T: AccountSerialize + Discriminator + Owner + Clone, +{ + // Uses default implementation +} + impl<'info, T> AsRef> for LazyAccount<'info, T> where T: AccountSerialize + Discriminator + Owner + Clone, diff --git a/lang/src/accounts/option.rs b/lang/src/accounts/option.rs index a1b034a31e..3a4a924ba6 100644 --- a/lang/src/accounts/option.rs +++ b/lang/src/accounts/option.rs @@ -62,6 +62,20 @@ impl<'info, T: ToAccountInfos<'info>> ToAccountInfos<'info> for Option { } } +impl<'info, T: crate::AccountsFinalize<'info>> crate::AccountsFinalize<'info> for Option { + fn finalize( + &self, + program_id: &Pubkey, + remaining_accounts: &[AccountInfo<'info>], + ix_data: &[u8], + ) -> Result<()> { + if let Some(account) = self { + account.finalize(program_id, remaining_accounts, ix_data)?; + } + Ok(()) + } +} + impl ToAccountMetas for Option { fn to_account_metas(&self, is_signer: Option) -> Vec { self.as_ref() diff --git a/lang/src/accounts/program.rs b/lang/src/accounts/program.rs index 862f0dd154..1ec7f21cac 100644 --- a/lang/src/accounts/program.rs +++ b/lang/src/accounts/program.rs @@ -174,6 +174,10 @@ impl<'info, T> ToAccountInfos<'info> for Program<'info, T> { } } +impl<'info, T> crate::AccountsFinalize<'info> for Program<'info, T> { + // Uses default implementation +} + impl<'info, T> AsRef> for Program<'info, T> { fn as_ref(&self) -> &AccountInfo<'info> { self.info diff --git a/lang/src/accounts/signer.rs b/lang/src/accounts/signer.rs index 34a4ca603d..6cd6409e00 100644 --- a/lang/src/accounts/signer.rs +++ b/lang/src/accounts/signer.rs @@ -91,6 +91,10 @@ impl<'info> ToAccountInfos<'info> for Signer<'info> { } } +impl<'info> crate::AccountsFinalize<'info> for Signer<'info> { + // Uses default implementation +} + impl<'info> AsRef> for Signer<'info> { fn as_ref(&self) -> &AccountInfo<'info> { self.info diff --git a/lang/src/accounts/system_account.rs b/lang/src/accounts/system_account.rs index 3e93ebb31a..2103ae633a 100644 --- a/lang/src/accounts/system_account.rs +++ b/lang/src/accounts/system_account.rs @@ -66,6 +66,10 @@ impl<'info> ToAccountInfos<'info> for SystemAccount<'info> { } } +impl<'info> crate::AccountsFinalize<'info> for SystemAccount<'info> { + // Uses default implementation +} + impl<'info> AsRef> for SystemAccount<'info> { fn as_ref(&self) -> &AccountInfo<'info> { self.info diff --git a/lang/src/accounts/sysvar.rs b/lang/src/accounts/sysvar.rs index 8d81f5ba16..6a0875aa78 100644 --- a/lang/src/accounts/sysvar.rs +++ b/lang/src/accounts/sysvar.rs @@ -94,6 +94,10 @@ impl<'info, T: solana_program::sysvar::Sysvar> ToAccountInfos<'info> for Sysvar< } } +impl<'info, T: solana_program::sysvar::Sysvar> crate::AccountsFinalize<'info> for Sysvar<'info, T> { + // Uses default implementation +} + impl<'info, T: solana_program::sysvar::Sysvar> AsRef> for Sysvar<'info, T> { fn as_ref(&self) -> &AccountInfo<'info> { self.info diff --git a/lang/src/accounts/unchecked_account.rs b/lang/src/accounts/unchecked_account.rs index f08092bda4..d892d302cc 100644 --- a/lang/src/accounts/unchecked_account.rs +++ b/lang/src/accounts/unchecked_account.rs @@ -54,6 +54,10 @@ impl<'info> ToAccountInfos<'info> for UncheckedAccount<'info> { } } +impl<'info> crate::AccountsFinalize<'info> for UncheckedAccount<'info> { + // Uses default implementation +} + impl<'info> AccountsExit<'info> for UncheckedAccount<'info> {} impl<'info> AsRef> for UncheckedAccount<'info> { diff --git a/lang/src/compressed_mint.rs b/lang/src/compressed_mint.rs index 7165000bcd..5eab74e833 100644 --- a/lang/src/compressed_mint.rs +++ b/lang/src/compressed_mint.rs @@ -40,6 +40,14 @@ pub fn finalize_compressed_batch<'info>( Ok(()) } +#[cfg(feature = "compressed-mint-light")] +impl From for crate::error::Error { + fn from(err: light_compressed_token_sdk::TokenSdkError) -> Self { + crate::error::Error::from(crate::error::ErrorCode::AccountDidNotSerialize) + .with_account_name(format!("TokenSdkError: {:?}", err)) + } +} + #[cfg(feature = "compressed-mint-light")] /// Context for batched compressed operations (CPDAs and CMints) pub struct CompressedBatchContext { @@ -239,10 +247,20 @@ pub fn finalize_compressed_batch<'info>( compressed_token_program.clone(), compressed_token_program_cpi_authority.clone(), authority.clone(), - payer.clone(), - system_program.clone(), ]; + // Add mint_signer if we have a CMint + if let Some(mint) = mint { + if let Some(mint_signer) = &mint.mint_signer { + account_infos.push(mint_signer.clone()); + } else { + // If no explicit mint_signer provided, use the CMint account itself + account_infos.push(mint.to_account_info()); + } + } + + account_infos.extend([payer.clone(), system_program.clone()]); + // Add CPDA accounts let cpda_start_index = 6; for i in 0..batch_context.cpda_indices.len() { diff --git a/lang/syn/src/codegen/accounts/constraints.rs b/lang/syn/src/codegen/accounts/constraints.rs index 418997e940..f3839786e7 100644 --- a/lang/syn/src/codegen/accounts/constraints.rs +++ b/lang/syn/src/codegen/accounts/constraints.rs @@ -87,6 +87,7 @@ pub fn linearize(c_group: &ConstraintGroup) -> Vec { mint, realloc, cmint: _, + cpda: _, } = c_group.clone(); let mut constraints = Vec::new(); diff --git a/lang/syn/src/codegen/accounts/exit.rs b/lang/syn/src/codegen/accounts/exit.rs index 43f882aca2..ea7da3a9d8 100644 --- a/lang/syn/src/codegen/accounts/exit.rs +++ b/lang/syn/src/codegen/accounts/exit.rs @@ -63,21 +63,17 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { }) .collect(); - // Scan for compressible Account fields and CMints to assign indices - let mut compressible_fields = Vec::new(); - let mut compress_on_init_fields = Vec::new(); + // Scan for CPDA Account fields and CMints to assign indices + let mut cpda_fields = Vec::new(); let mut cmint_field = None; for af in &accs.fields { if let AccountField::Field(f) = af { - // Check if this is a compressible Account - if matches!(&f.ty, Ty::Account(_)) { - if let Some(init) = &f.constraints.init { - if init.compressible { - compressible_fields.push(&f.ident); - } else if init.compress_on_init { - compress_on_init_fields.push(&f.ident); - } + // Check if this is a CPDA Account + // Skip fields with compress_on_init since they're compressed immediately + if let Some(cpda) = &f.constraints.cpda { + if !cpda.compress_on_init { + cpda_fields.push(&f.ident); } } else if matches!(&f.ty, Ty::CMint(_)) { if cmint_field.is_none() { @@ -87,26 +83,73 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { } } - // Check for conflicting compression modes - if !compressible_fields.is_empty() && !compress_on_init_fields.is_empty() { - return syn::Error::new( - proc_macro2::Span::call_site(), - "Cannot mix 'compressible' and 'compress_on_init' flags on different accounts. Use either all 'compressible' or all 'compress_on_init'." - ).to_compile_error(); + // Use CPDA fields for processing + let fields_to_process = &cpda_fields; + + // Find the first Signer field to use as fee payer + let fee_payer_ident = accs.fields.iter().find_map(|af| { + if let AccountField::Field(f) = af { + if matches!(&f.ty, Ty::Signer) { + Some(&f.ident) + } else { + None + } + } else { + None + } + }); + + // Find required fields by name + let mut required_fields = std::collections::HashMap::new(); + for af in &accs.fields { + if let AccountField::Field(f) = af { + let name = f.ident.to_string(); + match name.as_str() { + "compression_config" | "rent_recipient" | + "compressed_token_program_cpi_authority" | + "compressed_token_program" | "authority" => { + required_fields.insert(name, &f.ident); + } + _ => {} + } + } } - // Determine which fields to process - let fields_to_process = if !compress_on_init_fields.is_empty() { - &compress_on_init_fields - } else if !compressible_fields.is_empty() { - &compressible_fields - } else { - &Vec::new() - }; + let has_all_required = required_fields.contains_key("compression_config") && + required_fields.contains_key("compressed_token_program_cpi_authority") && + required_fields.contains_key("compressed_token_program"); // Generate the batched finalize for compressed operations - let compressed_finalize = if !fields_to_process.is_empty() || cmint_field.is_some() { + // Get the payer from the CMint if it exists + let cmint_payer = cmint_field.and_then(|cmint_ident| { + accs.fields.iter().find_map(|af| { + if let AccountField::Field(f) = af { + if &f.ident == cmint_ident { + f.constraints.cmint.as_ref().and_then(|c| c.payer.as_ref()) + } else { + None + } + } else { + None + } + }) + }); + + let compressed_finalize = if (!fields_to_process.is_empty() || cmint_field.is_some()) + && (cmint_payer.is_some() || fee_payer_ident.is_some()) + && has_all_required { use quote::format_ident; + + + let fee_payer = if let Some(payer_expr) = cmint_payer { + quote! { #payer_expr } + } else { + let ident = fee_payer_ident.unwrap(); + quote! { #ident } + }; + let compression_config = required_fields.get("compression_config").unwrap(); + let compressed_token_program_cpi_authority = required_fields.get("compressed_token_program_cpi_authority").unwrap(); + let compressed_token_program = required_fields.get("compressed_token_program").unwrap(); // Build per-compressible account blocks let mut compress_blocks: Vec = Vec::new(); @@ -114,8 +157,16 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { for (index, ident) in fields_to_process.iter().enumerate() { let idx_lit = index as u8; - // Build the corresponding "_address_tree_info" identifier from ix args - let info_ident = format_ident!("{}_address_tree_info", ident); + // Build the corresponding address_tree_info identifier from ix args + // For now, use a simple mapping - pool_state -> pool, observation_state -> observation + let info_name = if ident.to_string().contains("pool") { + "pool" + } else if ident.to_string().contains("observation") { + "observation" + } else { + &ident.to_string() + }; + let info_ident = format_ident!("{}_address_tree_info", info_name); // Resolve the account type for generic prepare function let acc_ty_path = match accs @@ -158,16 +209,26 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { let compressed_infos_ident = format_ident!("{}_compressed_infos", ident); new_address_params_idents.push(quote! { #new_addr_params_ident }); - // Different preparation based on compression mode - let prepare_fn = if !compress_on_init_fields.is_empty() { - quote! { prepare_accounts_for_compression_on_init } - } else { - quote! { prepare_accounts_for_empty_compression_on_init } - }; + // Use prepare_accounts_for_compression_on_init for CPDA fields + let prepare_fn = quote! { prepare_accounts_for_compression_on_init }; + + // Get output_state_tree_index from CPDA constraint or instruction data + let output_tree_expr = accs.fields.iter().find_map(|af| { + if let AccountField::Field(field) = af { + if field.ident == **ident { + if let Some(cpda) = &field.constraints.cpda { + return cpda.output_state_tree_index.as_ref().map(|e| quote! { #e }); + } + } + } + None + }).unwrap_or_else(|| quote! { 0u8 }); + let tree_info_ident = format_ident!("{}_tree_info", ident); compress_blocks.push(quote! { // Build new address params for #ident - let #new_addr_params_ident = compression_params.#info_ident + let #tree_info_ident = compression_params.#info_ident.clone(); + let #new_addr_params_ident = #tree_info_ident .into_new_address_params_assigned_packed( self.#ident.key().to_bytes(), true, @@ -190,7 +251,7 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { &[#acc_expr], &[#compressed_address_ident], &[#new_addr_params_ident], - &[compression_params.output_state_tree_index], + &[#output_tree_expr], &cpi_accounts, &address_space, &self.rent_recipient, @@ -199,7 +260,7 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { }); } - let compressible_count = fields_to_process.len() as u32; + let compressible_count = fields_to_process.len() as u8; let cmint_index = if cmint_field.is_some() { quote! { Some(#compressible_count) } } else { @@ -210,15 +271,74 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { // Build mint actions extraction and mint creation block let cmint_block = if let Some(cmint_ident) = mint_ident { + // Get CMint constraints for this field + let cmint_constraints = accs.fields.iter().find_map(|af| { + if let AccountField::Field(f) = af { + if f.ident.to_string() == cmint_ident.to_string() { + return f.constraints.cmint.as_ref(); + } + } + None + }); + + // Build expressions from constraints or fallback to instruction data + let cmint_proof_expr = cmint_constraints + .and_then(|c| c.proof.as_ref()) + .map(|e| quote! { #e }) + .unwrap_or_else(|| quote! { panic!("CMint proof constraint is required") }); + + let cmint_address_tree_info_expr = cmint_constraints + .and_then(|c| c.address_tree_info.as_ref()) + .map(|e| quote! { #e }) + .unwrap_or_else(|| quote! { panic!("CMint address_tree_info constraint is required") }); + + let cmint_output_tree_expr = cmint_constraints + .and_then(|c| c.output_state_tree_index.as_ref()) + .map(|e| quote! { #e }) + .unwrap_or_else(|| quote! { panic!("CMint output_state_tree_index constraint is required") }); + + let cmint_authority_expr = cmint_constraints + .and_then(|c| c.authority.as_ref()) + .map(|e| quote! { { + let __auth = &self.#e; + __auth.key() + }}) + .unwrap_or_else(|| quote! { self.authority.key() }); + + let cmint_payer_expr = cmint_constraints + .and_then(|c| c.payer.as_ref()) + .map(|e| quote! { { + let __payer = &self.#e; + __payer.key() + }}) + .unwrap_or_else(|| { + if let Some(fee_payer) = fee_payer_ident { + quote! { self.#fee_payer.key() } + } else { + quote! { self.creator.key() } + } + }); + + // Get mint bump from constraint + let cmint_bump_expr = cmint_constraints + .and_then(|c| c.mint_signer_bump.as_ref()) + .map(|e| quote! { #e }) + .unwrap_or_else(|| quote! { panic!("CMint mint_signer_bump constraint is required") }); + quote! { // Drain queued CMint actions let __mint_actions = self.#cmint_ident.take_actions(); if !__mint_actions.is_empty() { - // Tree accounts indices - let output_state_queue_idx: u8 = 0; - let address_tree_idx: u8 = 1; - let output_state_queue = *cpi_accounts.tree_accounts().unwrap()[output_state_queue_idx as usize].key; + // Get tree indices from constraints + let output_state_tree_index = #cmint_output_tree_expr; + let __address_tree_info = #cmint_address_tree_info_expr; + let address_tree_idx = __address_tree_info.address_merkle_tree_pubkey_index; + let address_queue_idx = __address_tree_info.address_queue_pubkey_index; + let root_index = __address_tree_info.root_index; + + // Get tree accounts using the indices + let output_state_queue = *cpi_accounts.tree_accounts().unwrap()[output_state_tree_index as usize].key; let address_tree_pubkey = *cpi_accounts.tree_accounts().unwrap()[address_tree_idx as usize].key; // Derive compressed mint address from SPL mint addr (self.#cmint_ident is used as SPL mint key) @@ -230,10 +350,10 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { // Build compressed mint with context let compressed_mint_with_context = light_ctoken_types::instructions::mint_action::CompressedMintWithContext::new( mint_compressed_address, - compression_params.lp_mint_address_tree_info.root_index, + root_index, self.#cmint_ident.decimals.unwrap_or(9), - Some(self.authority.key().into()), - Some(self.authority.key().into()), + Some(#cmint_authority_expr.into()), + Some(#cmint_authority_expr.into()), self.#cmint_ident.key().into(), ); @@ -250,10 +370,10 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { let inputs = light_compressed_token_sdk::instructions::CreateMintInputs { compressed_mint_inputs: compressed_mint_with_context, mint_seed: self.#cmint_ident.key(), - mint_bump: compression_params.lp_mint_bump, - authority: self.authority.key().into(), - payer: self.creator.key(), - proof: compression_params.proof.0.map(|p| light_compressed_token_sdk::CompressedProof::from(p)), + mint_bump: #cmint_bump_expr, + authority: #cmint_authority_expr.into(), + payer: #cmint_payer_expr, + proof: #cmint_proof_expr.0.map(|p| light_compressed_token_sdk::CompressedProof::from(p)), address_tree: address_tree_pubkey, output_queue: output_state_queue, actions, @@ -265,23 +385,31 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { light_compressed_token_sdk::instructions::MintActionInputs::new_create_mint(inputs), Some(light_ctoken_types::instructions::mint_action::CpiContext::last_cpi_create_mint( address_tree_idx, - output_state_queue_idx, + output_state_tree_index, #compressible_count, )), Some(cpi_accounts.cpi_context().unwrap().key()), - )?; + ).map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotSerialize)?; // Accounts for CPI let mut account_infos = cpi_accounts.to_account_infos(); account_infos.extend([ - self.compressed_token_program_cpi_authority.clone(), - self.compressed_token_program.clone(), - self.authority.clone(), - self.creator.clone(), - // recipients - self.lp_vault.clone(), - self.creator_lp_token.clone(), + self.#compressed_token_program_cpi_authority.to_account_info(), + self.#compressed_token_program.to_account_info(), + self.authority.to_account_info(), ]); + + // Add mint_signer if provided + if let Some(mint_signer) = &self.#cmint_ident.mint_signer { + account_infos.push(mint_signer.clone()); + } else { + // If no explicit mint_signer provided, use the CMint account itself + account_infos.push(self.#cmint_ident.to_account_info()); + } + + account_infos.push(self.#fee_payer.to_account_info()); + + // Recipients will be added from remaining accounts based on mint actions // Signer seeds let mut signer_seeds: Vec<&[&[u8]]> = Vec::new(); @@ -309,36 +437,38 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { // Build the full compressed finalize block quote! { - #[cfg(feature = "compressed-mint")] + // Compressed accounts finalization { - use borsh::BorshDeserialize; // Build CPI accounts with CPI context signer let cpi_accounts = light_sdk::cpi::CpiAccountsSmall::new_with_config( - &self.creator, + &self.#fee_payer, _remaining, light_sdk_types::CpiAccountsConfig::new_with_cpi_context(crate::LIGHT_CPI_SIGNER), ); // Load compression config - let compression_config = light_sdk::compressible::CompressibleConfig::load_checked(&self.compression_config, &crate::ID)?; - let address_space = compression_config.address_space; + let compression_config_data = light_sdk::compressible::CompressibleConfig::load_checked(&self.#compression_config, &crate::ID)?; + let address_space = compression_config_data.address_space; // Parse compression params from ix_data - #[derive(BorshDeserialize)] - struct InitializeCompressionParams { - pub pool_address_tree_info: light_sdk::instruction::PackedAddressTreeInfo, - pub observation_address_tree_info: light_sdk::instruction::PackedAddressTreeInfo, - pub lp_mint_address_tree_info: light_sdk::instruction::PackedAddressTreeInfo, - pub lp_mint_bump: u8, - pub creator_lp_token_bump: u8, - pub proof: light_sdk::instruction::borsh_compat::ValidityProof, - pub output_state_tree_index: u8, - } + // Skip discriminator (8 bytes) and other instruction arguments let compression_params = { - let mut slice = &_ix_data[8..]; - InitializeCompressionParams::try_from_slice(&mut slice) - .map_err(|_| anchor_lang::error::ErrorCode::InvalidInstructionData)? + let mut ix_data_cursor = if _ix_data.len() >= 8 { + &_ix_data[8..] + } else { + _ix_data + }; + + // Skip other instruction arguments (init_amount_0: u64, init_amount_1: u64, open_time: u64) + // Each u64 is 8 bytes, so skip 24 bytes total + if ix_data_cursor.len() >= 24 { + ix_data_cursor = &ix_data_cursor[24..]; + } + + // Now deserialize InitializeCompressionParams + InitializeCompressionParams::deserialize(&mut ix_data_cursor) + .map_err(|_| anchor_lang::error::ErrorCode::InstructionDidNotDeserialize)? }; // Collect compressed infos for all compressible accounts @@ -367,7 +497,18 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { quote! {} }; - // Generate auto-close for compress_on_init fields + // Generate auto-close for CPDA fields with compress_on_init + let compress_on_init_fields: Vec<_> = accs.fields.iter().filter_map(|af| { + if let AccountField::Field(f) = af { + if let Some(cpda) = &f.constraints.cpda { + if cpda.compress_on_init { + return Some(&f.ident); + } + } + } + None + }).collect(); + let auto_close_block = if !compress_on_init_fields.is_empty() { let close_statements: Vec<_> = compress_on_init_fields.iter().map(|ident| { quote! { @@ -404,8 +545,8 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { // Skip these - CMint handled in batched finalize quote! {} } - Ty::Account(_) if f.constraints.init.as_ref().map(|i| i.compressible).unwrap_or(false) => { - // Skip compressible accounts - handled in batched finalize + Ty::Account(_) if f.constraints.cpda.is_some() => { + // Skip CPDA accounts - handled in batched finalize quote! {} } _ => quote! { diff --git a/lang/syn/src/codegen/accounts/try_accounts.rs b/lang/syn/src/codegen/accounts/try_accounts.rs index 077d354343..bf917501c3 100644 --- a/lang/syn/src/codegen/accounts/try_accounts.rs +++ b/lang/syn/src/codegen/accounts/try_accounts.rs @@ -14,6 +14,7 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { } = generics(accs); // Deserialization for each field + let all_fields = &accs.fields; // Capture all fields for CMint seed extraction let deser_fields: Vec = accs .fields .iter() @@ -73,29 +74,92 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { if matches!(&f.ty, crate::Ty::CMint(_)) { let ident = &f.ident; let cmint_setup = if let Some(cmint_group) = &f.constraints.cmint { - let authority = cmint_group.authority.as_ref().map(|a| quote! { - #ident.authority = Some(#a); - }); + let authority = cmint_group.authority.as_ref().map(|a| quote! { { + let __auth = &#a; + #ident.authority = Some(__auth.key()); + }}); let decimals = cmint_group.decimals.map(|d| quote! { #ident.decimals = Some(#d); }); - let mint_signer_seeds = cmint_group.mint_signer_seeds.as_ref().map(|seeds| { - let seed_bytes: Vec<_> = seeds.iter().map(|s| quote! { - anchor_lang::ToAccountInfo::to_account_info(&#s).key.to_bytes().to_vec() - }).collect(); - quote! { - #ident.mint_signer_seeds = Some(vec![#(#seed_bytes),*]); + let mint_signer = cmint_group.mint_signer.as_ref().map(|s| quote! { { + let __signer = &#s; + #ident.mint_signer = Some(__signer.to_account_info()); + }}); + + // Auto-extract seeds and bump from linked mint_signer account if specified + let (mint_signer_seeds, mint_signer_bump) = if let Some(signer_ref) = &cmint_group.mint_signer { + // Try to find the linked account's seeds and bump from its constraints + // Look for the account with matching name in the fields + let mut found_seeds = None; + let mut found_bump = None; + + // Extract the field name from the expression + let signer_name = quote! { #signer_ref }.to_string(); + + // Find the corresponding field and extract its seeds + for field in all_fields { + if let crate::AccountField::Field(other_f) = field { + if other_f.ident.to_string() == signer_name { + if let Some(seeds_group) = &other_f.constraints.seeds { + let seeds = &seeds_group.seeds; + let seed_exprs: Vec<_> = seeds.iter().map(|s| { + quote! { Vec::from(#s.as_ref()) } + }).collect(); + found_seeds = Some(quote! { + #ident.mint_signer_seeds = Some(vec![#(#seed_exprs),*]); + }); + + if let Some(bump) = &seeds_group.bump { + found_bump = Some(quote! { + #ident.mint_signer_bump = Some(#bump); + }); + } + } + break; + } + } } - }); - let mint_signer_bump = cmint_group.mint_signer_bump.as_ref().map(|b| quote! { - #ident.mint_signer_bump = Some(#b); - }); + + // If we found seeds from the linked account, use those + // Otherwise fall back to explicitly specified seeds + if found_seeds.is_some() { + (found_seeds, found_bump) + } else { + // Fall back to explicitly provided seeds if any + let seeds = cmint_group.mint_signer_seeds.as_ref().map(|seeds| { + let seed_exprs: Vec<_> = seeds.iter().map(|s| { + quote! { Vec::from(#s.as_ref()) } + }).collect(); + quote! { + #ident.mint_signer_seeds = Some(vec![#(#seed_exprs),*]); + } + }); + let bump = cmint_group.mint_signer_bump.as_ref().map(|b| quote! { + #ident.mint_signer_bump = Some(#b); + }); + (seeds, bump) + } + } else { + // No mint_signer specified, use explicitly provided seeds + let seeds = cmint_group.mint_signer_seeds.as_ref().map(|seeds| { + let seed_exprs: Vec<_> = seeds.iter().map(|s| { + quote! { Vec::from(#s.as_ref()) } + }).collect(); + quote! { + #ident.mint_signer_seeds = Some(vec![#(#seed_exprs),*]); + } + }); + let bump = cmint_group.mint_signer_bump.as_ref().map(|b| quote! { + #ident.mint_signer_bump = Some(#b); + }); + (seeds, bump) + }; let program_authority_seeds = cmint_group.program_authority_seeds.as_ref().map(|seeds| { - let seed_bytes: Vec<_> = seeds.iter().map(|s| quote! { - anchor_lang::ToAccountInfo::to_account_info(&#s).key.to_bytes().to_vec() + let seed_exprs: Vec<_> = seeds.iter().map(|s| { + quote! { Vec::from(#s.as_ref()) } }).collect(); quote! { - #ident.program_authority_seeds = Some(vec![#(#seed_bytes),*]); + #ident.program_authority_seeds = Some(vec![#(#seed_exprs),*]); } }); let program_authority_bump = cmint_group.program_authority_bump.as_ref().map(|b| quote! { @@ -105,6 +169,7 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { quote! { #authority #decimals + #mint_signer #mint_signer_seeds #mint_signer_bump #program_authority_seeds @@ -143,14 +208,24 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { None => quote! {}, Some(ix_api) => { let strct_inner = &ix_api; - let field_names: Vec = ix_api + // Collect field identifiers from the instruction declaration + let field_idents: Vec = ix_api .iter() .map(|expr: &Expr| match expr { Expr::Type(expr_type) => { let field = &expr_type.expr; - quote! { - #field - } + quote! { #field } + } + _ => panic!("Invalid instruction declaration"), + }) + .collect(); + // Generate re-bindings to move fields out of __args explicitly + let field_rebinds: Vec = ix_api + .iter() + .map(|expr: &Expr| match expr { + Expr::Type(expr_type) => { + let field = &expr_type.expr; + quote! { let #field = __args.#field; } } _ => panic!("Invalid instruction declaration"), }) @@ -161,10 +236,12 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { struct __Args { #strct_inner } - let __Args { - #(#field_names),* - } = __Args::deserialize(&mut __ix_data) + let __args: __Args = __Args::deserialize(&mut __ix_data) .map_err(|_| anchor_lang::error::ErrorCode::InstructionDidNotDeserialize)?; + // Move fields out of __args into local variables + #(#field_rebinds)* + // Prevent unused warning for the holder + let _ = __args; } } }; diff --git a/lang/syn/src/lib.rs b/lang/syn/src/lib.rs index 624c1baf66..022f1bb61f 100644 --- a/lang/syn/src/lib.rs +++ b/lang/syn/src/lib.rs @@ -305,6 +305,9 @@ impl Field { Ty::UncheckedAccount => quote! { UncheckedAccount }, + Ty::CMint(_) => quote! { + CMint + }, Ty::Signer => quote! { Signer }, @@ -704,8 +707,9 @@ pub struct ConstraintGroup { pub token_account: Option, pub mint: Option, pub realloc: Option, - // CMint constraints + // Compressed constraints pub cmint: Option, + pub cpda: Option, } impl ConstraintGroup { @@ -802,11 +806,21 @@ pub enum ConstraintToken { ExtensionPermanentDelegate(Context), // CMint constraints CMintAuthority(Context), + CMintPayer(Context), CMintDecimals(Context), + CMintSigner(Context), CMintSignerSeeds(Context), CMintSignerBump(Context), CMintProgramAuthoritySeeds(Context), CMintProgramAuthorityBump(Context), + CMintAddressTreeInfo(Context), + CMintProof(Context), + CMintOutputStateTreeIndex(Context), + // CPDA constraints + CPDAAddressTreeInfo(Context), + CPDAProof(Context), + CPDAOutputStateTreeIndex(Context), + CPDACompressOnInit(Context), } impl Parse for ConstraintToken { @@ -818,8 +832,6 @@ impl Parse for ConstraintToken { #[derive(Debug, Clone)] pub struct ConstraintInit { pub if_needed: bool, - pub compressible: bool, - pub compress_on_init: bool, } #[derive(Debug, Clone)] @@ -897,8 +909,6 @@ pub struct ConstraintInitGroup { pub payer: Expr, pub space: Option, pub kind: InitKind, - pub compressible: bool, - pub compress_on_init: bool, } #[derive(Debug, Clone)] @@ -1085,11 +1095,21 @@ pub struct ConstraintCMintAuthority { pub authority: Expr, } +#[derive(Debug, Clone)] +pub struct ConstraintCMintPayer { + pub payer: Expr, +} + #[derive(Debug, Clone)] pub struct ConstraintCMintDecimals { pub decimals: u8, } +#[derive(Debug, Clone)] +pub struct ConstraintCMintSigner { + pub signer: Expr, +} + #[derive(Debug, Clone)] pub struct ConstraintCMintSignerSeeds { pub seeds: Vec, @@ -1110,16 +1130,62 @@ pub struct ConstraintCMintProgramAuthorityBump { pub bump: Expr, } +#[derive(Debug, Clone)] +pub struct ConstraintCMintAddressTreeInfo { + pub address_tree_info: Expr, +} + +#[derive(Debug, Clone)] +pub struct ConstraintCMintProof { + pub proof: Expr, +} + +#[derive(Debug, Clone)] +pub struct ConstraintCMintOutputStateTreeIndex { + pub output_state_tree_index: Expr, +} + #[derive(Debug, Clone)] pub struct ConstraintCMintGroup { pub authority: Option, pub decimals: Option, + pub payer: Option, + pub mint_signer: Option, pub mint_signer_seeds: Option>, pub mint_signer_bump: Option, pub program_authority_seeds: Option>, pub program_authority_bump: Option, + pub address_tree_info: Option, + pub proof: Option, + pub output_state_tree_index: Option, +} + +#[derive(Debug, Clone)] +pub struct ConstraintCPDAGroup { + pub compress_on_init: bool, // If true, compress immediately. If false, just prepare. + pub address_tree_info: Option, + pub proof: Option, + pub output_state_tree_index: Option, +} + +#[derive(Debug, Clone)] +pub struct ConstraintCPDAAddressTreeInfo { + pub address_tree_info: Expr, } +#[derive(Debug, Clone)] +pub struct ConstraintCPDAProof { + pub proof: Expr, +} + +#[derive(Debug, Clone)] +pub struct ConstraintCPDAOutputStateTreeIndex { + pub output_state_tree_index: Expr, +} + +#[derive(Debug, Clone)] +pub struct ConstraintCPDACompressOnInit {} + #[derive(Debug, Clone)] pub struct ConstraintTokenBump { pub bump: Option, diff --git a/lang/syn/src/parser/accounts/constraints.rs b/lang/syn/src/parser/accounts/constraints.rs index 5fe6e790e8..81ad70f549 100644 --- a/lang/syn/src/parser/accounts/constraints.rs +++ b/lang/syn/src/parser/accounts/constraints.rs @@ -28,26 +28,12 @@ pub fn parse_token(stream: ParseStream) -> ParseResult { let c = match kw.as_str() { "init" => ConstraintToken::Init(Context::new( ident.span(), - ConstraintInit { if_needed: false, compressible: false, compress_on_init: false }, + ConstraintInit { if_needed: false }, )), "init_if_needed" => ConstraintToken::Init(Context::new( ident.span(), - ConstraintInit { if_needed: true, compressible: false, compress_on_init: false }, + ConstraintInit { if_needed: true }, )), - "compressible" => { - // For prepare-only compression (no auto-close) - ConstraintToken::Init(Context::new( - ident.span(), - ConstraintInit { if_needed: false, compressible: true, compress_on_init: false }, - )) - } - "compress_on_init" => { - // For immediate compression with auto-close - ConstraintToken::Init(Context::new( - ident.span(), - ConstraintInit { if_needed: false, compressible: false, compress_on_init: true }, - )) - } "zero" => ConstraintToken::Zeroed(Context::new(ident.span(), ConstraintZeroed {})), "mut" => ConstraintToken::Mut(Context::new( ident.span(), @@ -316,7 +302,52 @@ pub fn parse_token(stream: ParseStream) -> ParseResult { _ => return Err(ParseError::new(ident.span(), "Invalid attribute")), } } - "cmint" => { + "cpda" => { + stream.parse::()?; + let kw = stream.call(Ident::parse_any)?.to_string(); + stream.parse::()?; + + let span = ident + .span() + .join(stream.span()) + .unwrap_or_else(|| ident.span()); + + match kw.as_str() { + "address_tree_info" => ConstraintToken::CPDAAddressTreeInfo(Context::new( + span, + ConstraintCPDAAddressTreeInfo { + address_tree_info: stream.parse()?, + }, + )), + "proof" => ConstraintToken::CPDAProof(Context::new( + span, + ConstraintCPDAProof { + proof: stream.parse()?, + }, + )), + "output_state_tree_index" => ConstraintToken::CPDAOutputStateTreeIndex(Context::new( + span, + ConstraintCPDAOutputStateTreeIndex { + output_state_tree_index: stream.parse()?, + }, + )), + _ => { + stream.parse::()?; + return Err(ParseError::new( + ident.span(), + format!("invalid cpda constraint: {}", kw), + )); + } + } + } + "compress_on_init" => { + // This is a special flag that marks a CPDA for immediate compression + ConstraintToken::CPDACompressOnInit(Context::new( + ident.span(), + ConstraintCPDACompressOnInit {}, + )) + } + "cmint" => { stream.parse::()?; stream.parse::()?; let kw = stream.call(Ident::parse_any)?.to_string(); @@ -328,16 +359,28 @@ pub fn parse_token(stream: ParseStream) -> ParseResult { .unwrap_or_else(|| ident.span()); match kw.as_str() { - "authority" => ConstraintToken::CMintAuthority(Context::new( + "authority" => ConstraintToken::CMintAuthority(Context::new( + span, + ConstraintCMintAuthority { + authority: stream.parse()?, + }, + )), + "payer" => ConstraintToken::CMintPayer(Context::new( + span, + ConstraintCMintPayer { + payer: stream.parse()?, + }, + )), + "decimals" => ConstraintToken::CMintDecimals(Context::new( span, - ConstraintCMintAuthority { - authority: stream.parse()?, + ConstraintCMintDecimals { + decimals: stream.parse::()?.base10_parse()?, }, )), - "decimals" => ConstraintToken::CMintDecimals(Context::new( + "mint_signer" => ConstraintToken::CMintSigner(Context::new( span, - ConstraintCMintDecimals { - decimals: stream.parse::()?.base10_parse()?, + ConstraintCMintSigner { + signer: stream.parse()?, }, )), "mint_signer_seeds" => { @@ -364,12 +407,30 @@ pub fn parse_token(stream: ParseStream) -> ParseResult { ConstraintCMintProgramAuthoritySeeds { seeds: seeds.into_iter().collect() }, )) } - "program_authority_bump" => ConstraintToken::CMintProgramAuthorityBump(Context::new( - span, - ConstraintCMintProgramAuthorityBump { - bump: stream.parse()?, - }, - )), + "program_authority_bump" => ConstraintToken::CMintProgramAuthorityBump(Context::new( + span, + ConstraintCMintProgramAuthorityBump { + bump: stream.parse()?, + }, + )), + "address_tree_info" => ConstraintToken::CMintAddressTreeInfo(Context::new( + span, + ConstraintCMintAddressTreeInfo { + address_tree_info: stream.parse()?, + }, + )), + "proof" => ConstraintToken::CMintProof(Context::new( + span, + ConstraintCMintProof { + proof: stream.parse()?, + }, + )), + "output_state_tree_index" => ConstraintToken::CMintOutputStateTreeIndex(Context::new( + span, + ConstraintCMintOutputStateTreeIndex { + output_state_tree_index: stream.parse()?, + }, + )), _ => return Err(ParseError::new(ident.span(), "Invalid cmint attribute")), } } @@ -626,11 +687,21 @@ pub struct ConstraintGroupBuilder<'ty> { pub realloc_zero: Option>, // CMint constraints pub cmint_authority: Option>, + pub cmint_payer: Option>, pub cmint_decimals: Option>, + pub cmint_signer: Option>, pub cmint_signer_seeds: Option>, pub cmint_signer_bump: Option>, pub cmint_program_authority_seeds: Option>, pub cmint_program_authority_bump: Option>, + pub cmint_address_tree_info: Option>, + pub cmint_proof: Option>, + pub cmint_output_state_tree_index: Option>, + // CPDA constraints + pub cpda_address_tree_info: Option>, + pub cpda_proof: Option>, + pub cpda_output_state_tree_index: Option>, + pub cpda_compress_on_init: Option>, } impl<'ty> ConstraintGroupBuilder<'ty> { @@ -678,11 +749,20 @@ impl<'ty> ConstraintGroupBuilder<'ty> { realloc_payer: None, realloc_zero: None, cmint_authority: None, + cmint_payer: None, cmint_decimals: None, + cmint_signer: None, cmint_signer_seeds: None, cmint_signer_bump: None, cmint_program_authority_seeds: None, cmint_program_authority_bump: None, + cmint_address_tree_info: None, + cmint_proof: None, + cmint_output_state_tree_index: None, + cpda_address_tree_info: None, + cpda_proof: None, + cpda_output_state_tree_index: None, + cpda_compress_on_init: None, } } @@ -909,11 +989,20 @@ impl<'ty> ConstraintGroupBuilder<'ty> { realloc_payer, realloc_zero, cmint_authority, + cmint_payer, cmint_decimals, + cmint_signer, cmint_signer_seeds, cmint_signer_bump, cmint_program_authority_seeds, cmint_program_authority_bump, + cmint_address_tree_info, + cmint_proof, + cmint_output_state_tree_index, + cpda_address_tree_info, + cpda_proof, + cpda_output_state_tree_index, + cpda_compress_on_init, } = self; // Converts Option> -> Option. @@ -1080,8 +1169,6 @@ impl<'ty> ConstraintGroupBuilder<'ty> { Ok(ConstraintGroup { init: init.as_ref().map(|i| Ok(ConstraintInitGroup { if_needed: i.if_needed, - compressible: i.compressible, - compress_on_init: i.compress_on_init, seeds: seeds.clone(), payer: into_inner!(payer.clone()).unwrap().target, space: space.clone().map(|s| s.space.clone()), @@ -1153,16 +1240,35 @@ impl<'ty> ConstraintGroupBuilder<'ty> { seeds, token_account: if !is_init {token_account} else {None}, mint: if !is_init {mint} else {None}, - cmint: if cmint_authority.is_some() || cmint_decimals.is_some() || - cmint_signer_seeds.is_some() || cmint_signer_bump.is_some() || - cmint_program_authority_seeds.is_some() || cmint_program_authority_bump.is_some() { + cmint: if cmint_authority.is_some() || cmint_payer.is_some() || cmint_decimals.is_some() || + cmint_signer.is_some() || cmint_signer_seeds.is_some() || + cmint_signer_bump.is_some() || + cmint_program_authority_seeds.is_some() || cmint_program_authority_bump.is_some() || + cmint_address_tree_info.is_some() || cmint_proof.is_some() || + cmint_output_state_tree_index.is_some() { Some(ConstraintCMintGroup { authority: cmint_authority.map(|c| c.into_inner().authority), decimals: cmint_decimals.map(|c| c.into_inner().decimals), + payer: cmint_payer.map(|c| c.into_inner().payer), + mint_signer: cmint_signer.map(|c| c.into_inner().signer), mint_signer_seeds: cmint_signer_seeds.map(|c| c.into_inner().seeds), mint_signer_bump: cmint_signer_bump.map(|c| c.into_inner().bump), program_authority_seeds: cmint_program_authority_seeds.map(|c| c.into_inner().seeds), program_authority_bump: cmint_program_authority_bump.map(|c| c.into_inner().bump), + address_tree_info: cmint_address_tree_info.map(|c| c.into_inner().address_tree_info), + proof: cmint_proof.map(|c| c.into_inner().proof), + output_state_tree_index: cmint_output_state_tree_index.map(|c| c.into_inner().output_state_tree_index), + }) + } else { + None + }, + cpda: if cpda_address_tree_info.is_some() || cpda_proof.is_some() || + cpda_output_state_tree_index.is_some() || cpda_compress_on_init.is_some() { + Some(ConstraintCPDAGroup { + compress_on_init: cpda_compress_on_init.is_some(), + address_tree_info: cpda_address_tree_info.map(|c| c.into_inner().address_tree_info), + proof: cpda_proof.map(|c| c.into_inner().proof), + output_state_tree_index: cpda_output_state_tree_index.map(|c| c.into_inner().output_state_tree_index), }) } else { None @@ -1231,28 +1337,27 @@ impl<'ty> ConstraintGroupBuilder<'ty> { self.add_extension_permanent_delegate(c) } ConstraintToken::CMintAuthority(c) => self.add_cmint_authority(c), + ConstraintToken::CMintPayer(c) => self.add_cmint_payer(c), ConstraintToken::CMintDecimals(c) => self.add_cmint_decimals(c), + ConstraintToken::CMintSigner(c) => self.add_cmint_signer(c), ConstraintToken::CMintSignerSeeds(c) => self.add_cmint_signer_seeds(c), ConstraintToken::CMintSignerBump(c) => self.add_cmint_signer_bump(c), ConstraintToken::CMintProgramAuthoritySeeds(c) => self.add_cmint_program_authority_seeds(c), ConstraintToken::CMintProgramAuthorityBump(c) => self.add_cmint_program_authority_bump(c), + ConstraintToken::CMintAddressTreeInfo(c) => self.add_cmint_address_tree_info(c), + ConstraintToken::CMintProof(c) => self.add_cmint_proof(c), + ConstraintToken::CMintOutputStateTreeIndex(c) => self.add_cmint_output_state_tree_index(c), + ConstraintToken::CPDAAddressTreeInfo(c) => self.add_cpda_address_tree_info(c), + ConstraintToken::CPDAProof(c) => self.add_cpda_proof(c), + ConstraintToken::CPDAOutputStateTreeIndex(c) => self.add_cpda_output_state_tree_index(c), + ConstraintToken::CPDACompressOnInit(c) => self.add_cpda_compress_on_init(c), } } fn add_init(&mut self, c: Context) -> ParseResult<()> { if let Some(existing) = &mut self.init { - // Merge compressible flag if adding compressible to existing init - if c.inner.compressible && !existing.inner.compressible && !existing.inner.compress_on_init { - existing.inner.compressible = true; - return Ok(()); - } - // Merge compress_on_init flag if adding to existing init - if c.inner.compress_on_init && !existing.inner.compressible && !existing.inner.compress_on_init { - existing.inner.compress_on_init = true; - return Ok(()); - } - // Merge init with existing compressible/compress_on_init - if !c.inner.compressible && !c.inner.compress_on_init && (existing.inner.compressible || existing.inner.compress_on_init) { + // Merge if_needed flag if different + if c.inner.if_needed != existing.inner.if_needed { existing.inner.if_needed = c.inner.if_needed; return Ok(()); } @@ -1615,6 +1720,14 @@ impl<'ty> ConstraintGroupBuilder<'ty> { Ok(()) } + fn add_cmint_payer(&mut self, c: Context) -> ParseResult<()> { + if self.cmint_payer.is_some() { + return Err(ParseError::new(c.span(), "cmint payer already provided")); + } + self.cmint_payer.replace(c); + Ok(()) + } + fn add_cmint_decimals(&mut self, c: Context) -> ParseResult<()> { if self.cmint_decimals.is_some() { return Err(ParseError::new(c.span(), "cmint decimals already provided")); @@ -1623,6 +1736,14 @@ impl<'ty> ConstraintGroupBuilder<'ty> { Ok(()) } + fn add_cmint_signer(&mut self, c: Context) -> ParseResult<()> { + if self.cmint_signer.is_some() { + return Err(ParseError::new(c.span(), "cmint signer already provided")); + } + self.cmint_signer.replace(c); + Ok(()) + } + fn add_cmint_signer_seeds(&mut self, c: Context) -> ParseResult<()> { if self.cmint_signer_seeds.is_some() { return Err(ParseError::new(c.span(), "cmint mint_signer_seeds already provided")); @@ -1655,6 +1776,62 @@ impl<'ty> ConstraintGroupBuilder<'ty> { Ok(()) } + fn add_cmint_address_tree_info(&mut self, c: Context) -> ParseResult<()> { + if self.cmint_address_tree_info.is_some() { + return Err(ParseError::new(c.span(), "cmint address_tree_info already provided")); + } + self.cmint_address_tree_info.replace(c); + Ok(()) + } + + fn add_cmint_proof(&mut self, c: Context) -> ParseResult<()> { + if self.cmint_proof.is_some() { + return Err(ParseError::new(c.span(), "cmint proof already provided")); + } + self.cmint_proof.replace(c); + Ok(()) + } + + fn add_cmint_output_state_tree_index(&mut self, c: Context) -> ParseResult<()> { + if self.cmint_output_state_tree_index.is_some() { + return Err(ParseError::new(c.span(), "cmint output_state_tree_index already provided")); + } + self.cmint_output_state_tree_index.replace(c); + Ok(()) + } + + fn add_cpda_address_tree_info(&mut self, c: Context) -> ParseResult<()> { + if self.cpda_address_tree_info.is_some() { + return Err(ParseError::new(c.span(), "cpda address_tree_info already provided")); + } + self.cpda_address_tree_info.replace(c); + Ok(()) + } + + fn add_cpda_proof(&mut self, c: Context) -> ParseResult<()> { + if self.cpda_proof.is_some() { + return Err(ParseError::new(c.span(), "cpda proof already provided")); + } + self.cpda_proof.replace(c); + Ok(()) + } + + fn add_cpda_output_state_tree_index(&mut self, c: Context) -> ParseResult<()> { + if self.cpda_output_state_tree_index.is_some() { + return Err(ParseError::new(c.span(), "cpda output_state_tree_index already provided")); + } + self.cpda_output_state_tree_index.replace(c); + Ok(()) + } + + fn add_cpda_compress_on_init(&mut self, c: Context) -> ParseResult<()> { + if self.cpda_compress_on_init.is_some() { + return Err(ParseError::new(c.span(), "compress_on_init already provided")); + } + self.cpda_compress_on_init.replace(c); + Ok(()) + } + fn add_mut(&mut self, c: Context) -> ParseResult<()> { if self.mutable.is_some() { return Err(ParseError::new(c.span(), "mut already provided")); diff --git a/spl/Cargo.toml b/spl/Cargo.toml index 766ad13a5f..beafc4f1d8 100644 --- a/spl/Cargo.toml +++ b/spl/Cargo.toml @@ -26,7 +26,7 @@ token_2022 = ["spl-token-2022"] token_2022_extensions = ["spl-token-2022", "spl-token-group-interface", "spl-token-metadata-interface", "spl-pod"] [dependencies] -anchor-lang = { version = "0.31.1", features = ["derive"] } +anchor-lang = { path = "../lang", features = ["derive"] } borsh = { version = "0.10.3", optional = true } mpl-token-metadata = { version = "5", optional = true } spl-associated-token-account = { version = "6", features = ["no-entrypoint"], optional = true } From 003d4d9b36c15e26e5e0d98d3810b9e3801ebf26 Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Mon, 29 Sep 2025 08:27:55 -0400 Subject: [PATCH 05/20] amm init works --- lang/src/accounts/account.rs | 2 +- lang/src/accounts/account_info.rs | 2 +- lang/src/accounts/account_loader.rs | 2 +- lang/src/accounts/boxed.rs | 5 +- lang/src/accounts/cmint.rs | 14 +- lang/src/accounts/interface.rs | 2 +- lang/src/accounts/interface_account.rs | 2 +- lang/src/accounts/lazy_account.rs | 2 +- lang/src/accounts/option.rs | 5 +- lang/src/accounts/program.rs | 2 +- lang/src/accounts/signer.rs | 2 +- lang/src/accounts/system_account.rs | 2 +- lang/src/accounts/sysvar.rs | 2 +- lang/src/accounts/unchecked_account.rs | 2 +- lang/src/compressed_mint.rs | 4 +- lang/src/lib.rs | 4 +- lang/syn/Cargo.toml | 2 + lang/syn/src/codegen/accounts/bumps.rs | 2 +- lang/syn/src/codegen/accounts/exit.rs | 361 +++++++++++++++----- lang/syn/src/codegen/program/handlers.rs | 5 +- lang/syn/src/lib.rs | 9 +- lang/syn/src/parser/accounts/constraints.rs | 21 +- 22 files changed, 347 insertions(+), 107 deletions(-) diff --git a/lang/src/accounts/account.rs b/lang/src/accounts/account.rs index 7d06aff892..19b697a959 100644 --- a/lang/src/accounts/account.rs +++ b/lang/src/accounts/account.rs @@ -386,7 +386,7 @@ impl<'info, T: AccountSerialize + AccountDeserialize + Clone> ToAccountInfos<'in } } -impl<'info, T: AccountSerialize + AccountDeserialize + Clone> crate::AccountsFinalize<'info> +impl<'info, B, T: AccountSerialize + AccountDeserialize + Clone> crate::AccountsFinalize<'info, B> for Account<'info, T> { // Uses default implementation diff --git a/lang/src/accounts/account_info.rs b/lang/src/accounts/account_info.rs index 6351ec57f2..0b181ac76e 100644 --- a/lang/src/accounts/account_info.rs +++ b/lang/src/accounts/account_info.rs @@ -43,7 +43,7 @@ impl<'info> ToAccountInfos<'info> for AccountInfo<'info> { } } -impl<'info> crate::AccountsFinalize<'info> for AccountInfo<'info> { +impl<'info, B> crate::AccountsFinalize<'info, B> for AccountInfo<'info> { // Uses default implementation } diff --git a/lang/src/accounts/account_loader.rs b/lang/src/accounts/account_loader.rs index d714b74b8c..f6ffca2064 100644 --- a/lang/src/accounts/account_loader.rs +++ b/lang/src/accounts/account_loader.rs @@ -283,7 +283,7 @@ impl<'info, T: ZeroCopy + Owner> ToAccountInfos<'info> for AccountLoader<'info, } } -impl<'info, T: ZeroCopy + Owner> crate::AccountsFinalize<'info> for AccountLoader<'info, T> { +impl<'info, B, T: ZeroCopy + Owner> crate::AccountsFinalize<'info, B> for AccountLoader<'info, T> { // Uses default implementation } diff --git a/lang/src/accounts/boxed.rs b/lang/src/accounts/boxed.rs index d862b0dd11..1e55e8b080 100644 --- a/lang/src/accounts/boxed.rs +++ b/lang/src/accounts/boxed.rs @@ -44,14 +44,15 @@ impl<'info, T: ToAccountInfos<'info>> ToAccountInfos<'info> for Box { } } -impl<'info, T: crate::AccountsFinalize<'info>> crate::AccountsFinalize<'info> for Box { +impl<'info, B, T: crate::AccountsFinalize<'info, B>> crate::AccountsFinalize<'info, B> for Box { fn finalize( &self, program_id: &Pubkey, remaining_accounts: &[AccountInfo<'info>], ix_data: &[u8], + bumps: &B, ) -> Result<()> { - T::finalize(self, program_id, remaining_accounts, ix_data) + T::finalize(self, program_id, remaining_accounts, ix_data, bumps) } } diff --git a/lang/src/accounts/cmint.rs b/lang/src/accounts/cmint.rs index 1690fea590..bd250c906e 100644 --- a/lang/src/accounts/cmint.rs +++ b/lang/src/accounts/cmint.rs @@ -8,8 +8,8 @@ use std::cell::RefCell; use std::collections::BTreeSet; #[derive(Clone)] -pub struct MintAction { - pub recipient: Pubkey, +pub struct MintAction<'info> { + pub recipient: AccountInfo<'info>, pub amount: u64, } @@ -17,7 +17,7 @@ pub struct MintAction { /// It queues mint actions to be executed in a single batched invoke at finalize. pub struct CMint<'info> { info: AccountInfo<'info>, - actions: RefCell>, + actions: RefCell>>, // Constraints from account macro pub authority: Option, pub decimals: Option, @@ -29,15 +29,15 @@ pub struct CMint<'info> { } impl<'info> CMint<'info> { - pub fn mint_to(&self, recipient: &Pubkey, amount: u64) -> crate::Result<()> { + pub fn mint_to(&self, recipient: &AccountInfo<'info>, amount: u64) -> crate::Result<()> { self.actions.borrow_mut().push(MintAction { - recipient: *recipient, + recipient: recipient.clone(), amount, }); Ok(()) } - pub fn take_actions(&self) -> Vec { + pub fn take_actions(&self) -> Vec> { let mut b = self.actions.borrow_mut(); let actions = b.clone(); b.clear(); @@ -98,4 +98,4 @@ impl<'info, T> Accounts<'info, T> for CMint<'info> { } // Note: the outer Accounts struct finalize will consume actions and perform the batched CPI. -impl<'info> AccountsFinalize<'info> for CMint<'info> {} +impl<'info, B> AccountsFinalize<'info, B> for CMint<'info> {} diff --git a/lang/src/accounts/interface.rs b/lang/src/accounts/interface.rs index eb80091898..216d5ec4b9 100644 --- a/lang/src/accounts/interface.rs +++ b/lang/src/accounts/interface.rs @@ -135,7 +135,7 @@ impl<'info, T> ToAccountInfos<'info> for Interface<'info, T> { } } -impl<'info, T> crate::AccountsFinalize<'info> for Interface<'info, T> { +impl<'info, B, T> crate::AccountsFinalize<'info, B> for Interface<'info, T> { // Uses default implementation } diff --git a/lang/src/accounts/interface_account.rs b/lang/src/accounts/interface_account.rs index 6237e71810..56121c2dab 100644 --- a/lang/src/accounts/interface_account.rs +++ b/lang/src/accounts/interface_account.rs @@ -290,7 +290,7 @@ impl<'info, T: AccountSerialize + AccountDeserialize + Clone> ToAccountInfos<'in } } -impl<'info, T: AccountSerialize + AccountDeserialize + Clone> crate::AccountsFinalize<'info> +impl<'info, B, T: AccountSerialize + AccountDeserialize + Clone> crate::AccountsFinalize<'info, B> for InterfaceAccount<'info, T> { // Uses default implementation diff --git a/lang/src/accounts/lazy_account.rs b/lang/src/accounts/lazy_account.rs index f0fa3cc9b5..dba7cb9dde 100644 --- a/lang/src/accounts/lazy_account.rs +++ b/lang/src/accounts/lazy_account.rs @@ -319,7 +319,7 @@ where } } -impl<'info, T> crate::AccountsFinalize<'info> for LazyAccount<'info, T> +impl<'info, B, T> crate::AccountsFinalize<'info, B> for LazyAccount<'info, T> where T: AccountSerialize + Discriminator + Owner + Clone, { diff --git a/lang/src/accounts/option.rs b/lang/src/accounts/option.rs index 3a4a924ba6..e2054f66d7 100644 --- a/lang/src/accounts/option.rs +++ b/lang/src/accounts/option.rs @@ -62,15 +62,16 @@ impl<'info, T: ToAccountInfos<'info>> ToAccountInfos<'info> for Option { } } -impl<'info, T: crate::AccountsFinalize<'info>> crate::AccountsFinalize<'info> for Option { +impl<'info, B, T: crate::AccountsFinalize<'info, B>> crate::AccountsFinalize<'info, B> for Option { fn finalize( &self, program_id: &Pubkey, remaining_accounts: &[AccountInfo<'info>], ix_data: &[u8], + bumps: &B, ) -> Result<()> { if let Some(account) = self { - account.finalize(program_id, remaining_accounts, ix_data)?; + account.finalize(program_id, remaining_accounts, ix_data, bumps)?; } Ok(()) } diff --git a/lang/src/accounts/program.rs b/lang/src/accounts/program.rs index 1ec7f21cac..2155129e76 100644 --- a/lang/src/accounts/program.rs +++ b/lang/src/accounts/program.rs @@ -174,7 +174,7 @@ impl<'info, T> ToAccountInfos<'info> for Program<'info, T> { } } -impl<'info, T> crate::AccountsFinalize<'info> for Program<'info, T> { +impl<'info, B, T> crate::AccountsFinalize<'info, B> for Program<'info, T> { // Uses default implementation } diff --git a/lang/src/accounts/signer.rs b/lang/src/accounts/signer.rs index 6cd6409e00..e83ea00903 100644 --- a/lang/src/accounts/signer.rs +++ b/lang/src/accounts/signer.rs @@ -91,7 +91,7 @@ impl<'info> ToAccountInfos<'info> for Signer<'info> { } } -impl<'info> crate::AccountsFinalize<'info> for Signer<'info> { +impl<'info, B> crate::AccountsFinalize<'info, B> for Signer<'info> { // Uses default implementation } diff --git a/lang/src/accounts/system_account.rs b/lang/src/accounts/system_account.rs index 2103ae633a..5c58a762e4 100644 --- a/lang/src/accounts/system_account.rs +++ b/lang/src/accounts/system_account.rs @@ -66,7 +66,7 @@ impl<'info> ToAccountInfos<'info> for SystemAccount<'info> { } } -impl<'info> crate::AccountsFinalize<'info> for SystemAccount<'info> { +impl<'info, B> crate::AccountsFinalize<'info, B> for SystemAccount<'info> { // Uses default implementation } diff --git a/lang/src/accounts/sysvar.rs b/lang/src/accounts/sysvar.rs index 6a0875aa78..7d6e213674 100644 --- a/lang/src/accounts/sysvar.rs +++ b/lang/src/accounts/sysvar.rs @@ -94,7 +94,7 @@ impl<'info, T: solana_program::sysvar::Sysvar> ToAccountInfos<'info> for Sysvar< } } -impl<'info, T: solana_program::sysvar::Sysvar> crate::AccountsFinalize<'info> for Sysvar<'info, T> { +impl<'info, B, T: solana_program::sysvar::Sysvar> crate::AccountsFinalize<'info, B> for Sysvar<'info, T> { // Uses default implementation } diff --git a/lang/src/accounts/unchecked_account.rs b/lang/src/accounts/unchecked_account.rs index d892d302cc..2a7ded9bd7 100644 --- a/lang/src/accounts/unchecked_account.rs +++ b/lang/src/accounts/unchecked_account.rs @@ -54,7 +54,7 @@ impl<'info> ToAccountInfos<'info> for UncheckedAccount<'info> { } } -impl<'info> crate::AccountsFinalize<'info> for UncheckedAccount<'info> { +impl<'info, B> crate::AccountsFinalize<'info, B> for UncheckedAccount<'info> { // Uses default implementation } diff --git a/lang/src/compressed_mint.rs b/lang/src/compressed_mint.rs index 5eab74e833..f60f1e4595 100644 --- a/lang/src/compressed_mint.rs +++ b/lang/src/compressed_mint.rs @@ -75,8 +75,8 @@ pub fn finalize_compressed_batch<'info>( use light_sdk_types::CpiAccountsConfig; // Constants from the user's program - const POOL_LP_MINT_SEED: &[u8] = b"pool_lp_mint"; - const AUTH_SEED: &[u8] = b"amm_authority"; + // const POOL_LP_MINT_SEED: &[u8] = b"pool_lp_mint"; + // const AUTH_SEED: &[u8] = b"amm_authority"; // Parse compression params from instruction data // Expected structure: InitializeCompressionParams at end of ix_data diff --git a/lang/src/lib.rs b/lang/src/lib.rs index 942fc33353..aee8f72f7e 100644 --- a/lang/src/lib.rs +++ b/lang/src/lib.rs @@ -135,15 +135,17 @@ pub trait Accounts<'info, B>: ToAccountMetas + ToAccountInfos<'info> + Sized { /// A finalize procedure hook that runs after the user handler and before exit. /// Programs or account wrapper types can optionally implement this to perform /// deferred operations that must happen at the end of the instruction. -pub trait AccountsFinalize<'info>: ToAccountMetas + ToAccountInfos<'info> { +pub trait AccountsFinalize<'info, B>: ToAccountMetas + ToAccountInfos<'info> { /// `program_id` is the currently executing program. /// `remaining_accounts` are the accounts not deserialized into the `Accounts` struct. /// `ix_data` is the raw instruction data for the handler. + /// `bumps` contains the PDA bumps calculated during account validation. fn finalize( &self, _program_id: &Pubkey, _remaining_accounts: &[AccountInfo<'info>], _ix_data: &[u8], + _bumps: &B, ) -> Result<()> { // no-op by default Ok(()) diff --git a/lang/syn/Cargo.toml b/lang/syn/Cargo.toml index caf6d4dc39..7ce049b749 100644 --- a/lang/syn/Cargo.toml +++ b/lang/syn/Cargo.toml @@ -32,6 +32,8 @@ sha2 = "0.10" syn = { version = "1", features = ["full", "extra-traits", "parsing"] } thiserror = "1" +spl-pod = { version = "0.5" } + # `idl-build` feature only cargo_toml = { version = "0.19", optional = true } diff --git a/lang/syn/src/codegen/accounts/bumps.rs b/lang/syn/src/codegen/accounts/bumps.rs index bd895410b9..2e58429b52 100644 --- a/lang/syn/src/codegen/accounts/bumps.rs +++ b/lang/syn/src/codegen/accounts/bumps.rs @@ -72,7 +72,7 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { .unzip(); quote! { - #[derive(Debug)] + #[derive(Debug, Clone)] pub struct #bumps_name { #(#bump_fields),* } diff --git a/lang/syn/src/codegen/accounts/exit.rs b/lang/syn/src/codegen/accounts/exit.rs index ea7da3a9d8..eba6f5d873 100644 --- a/lang/syn/src/codegen/accounts/exit.rs +++ b/lang/syn/src/codegen/accounts/exit.rs @@ -1,11 +1,13 @@ use crate::accounts_codegen::constraints::OptionalCheckScope; -use crate::codegen::accounts::{generics, ParsedGenerics}; +use crate::codegen::accounts::{bumps, generics, ParsedGenerics}; use crate::{AccountField, AccountsStruct, Ty}; use quote::quote; +use syn::Expr; // Generates the `Exit` trait implementation. pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { let name = &accs.ident; + let bumps_struct_name = bumps::generate_bumps_name(&accs.ident); let ParsedGenerics { combined_generics, trait_generics, @@ -70,9 +72,12 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { for af in &accs.fields { if let AccountField::Field(f) = af { // Check if this is a CPDA Account - // Skip fields with compress_on_init since they're compressed immediately + // TODO: add support for compressible flag if let Some(cpda) = &f.constraints.cpda { - if !cpda.compress_on_init { + // if cpda.compressible { + // panic!("CPDA Account fields with compressible flag are not yet supported"); + // } + if cpda.compress_on_init { cpda_fields.push(&f.ident); } } else if matches!(&f.ty, Ty::CMint(_)) { @@ -119,6 +124,49 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { required_fields.contains_key("compressed_token_program_cpi_authority") && required_fields.contains_key("compressed_token_program"); + // Generate instruction deserialization for finalize (same as try_accounts) + let ix_de = match &accs.instruction_api { + None => quote! {}, + Some(ix_api) => { + let strct_inner = &ix_api; + // Collect field identifiers from the instruction declaration + let field_idents: Vec = ix_api + .iter() + .map(|expr: &Expr| match expr { + Expr::Type(expr_type) => { + let field = &expr_type.expr; + quote! { #field } + } + _ => panic!("Invalid instruction declaration"), + }) + .collect(); + // Generate re-bindings to move fields out of __args explicitly + let field_rebinds: Vec = ix_api + .iter() + .map(|expr: &Expr| match expr { + Expr::Type(expr_type) => { + let field = &expr_type.expr; + quote! { let #field = __args.#field; } + } + _ => panic!("Invalid instruction declaration"), + }) + .collect(); + quote! { + let mut __ix_data = _ix_data; + #[derive(anchor_lang::AnchorSerialize, anchor_lang::AnchorDeserialize)] + struct __Args { + #strct_inner + } + let __args: __Args = __Args::deserialize(&mut __ix_data) + .map_err(|_| anchor_lang::error::ErrorCode::InstructionDidNotDeserialize)?; + // Move fields out of __args into local variables + #(#field_rebinds)* + // Prevent unused warning for the holder + let _ = __args; + } + } + }; + // Generate the batched finalize for compressed operations // Get the payer from the CMint if it exists let cmint_payer = cmint_field.and_then(|cmint_ident| { @@ -157,16 +205,6 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { for (index, ident) in fields_to_process.iter().enumerate() { let idx_lit = index as u8; - // Build the corresponding address_tree_info identifier from ix args - // For now, use a simple mapping - pool_state -> pool, observation_state -> observation - let info_name = if ident.to_string().contains("pool") { - "pool" - } else if ident.to_string().contains("observation") { - "observation" - } else { - &ident.to_string() - }; - let info_ident = format_ident!("{}_address_tree_info", info_name); // Resolve the account type for generic prepare function let acc_ty_path = match accs @@ -212,22 +250,28 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { // Use prepare_accounts_for_compression_on_init for CPDA fields let prepare_fn = quote! { prepare_accounts_for_compression_on_init }; - // Get output_state_tree_index from CPDA constraint or instruction data - let output_tree_expr = accs.fields.iter().find_map(|af| { + // Get constraint expressions from CPDA including authority + let (address_tree_info_expr, proof_expr, output_tree_expr, cpda_authority_expr) = accs.fields.iter().find_map(|af| { if let AccountField::Field(field) = af { if field.ident == **ident { if let Some(cpda) = &field.constraints.cpda { - return cpda.output_state_tree_index.as_ref().map(|e| quote! { #e }); + let authority = cpda.authority.as_ref().map(|e| quote! { #e }); + return Some(( + cpda.address_tree_info.as_ref().map(|e| quote! { #e }).unwrap_or_else(|| panic!("CPDA address_tree_info is required")), + cpda.proof.as_ref().map(|e| quote! { #e }).unwrap_or_else(|| panic!("CPDA proof is required")), + cpda.output_state_tree_index.as_ref().map(|e| quote! { #e }).unwrap_or_else(|| panic!("CPDA output_state_tree_index is required")), + authority + )); } } } None - }).unwrap_or_else(|| quote! { 0u8 }); + }).unwrap_or_else(|| panic!("CPDA constraints not found for account")); let tree_info_ident = format_ident!("{}_tree_info", ident); compress_blocks.push(quote! { - // Build new address params for #ident - let #tree_info_ident = compression_params.#info_ident.clone(); + // Build new address params for #ident using constraint expression (move, avoid clone) + let #tree_info_ident = #address_tree_info_expr; let #new_addr_params_ident = #tree_info_ident .into_new_address_params_assigned_packed( self.#ident.key().to_bytes(), @@ -280,6 +324,7 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { } None }); + // Build expressions from constraints or fallback to instruction data let cmint_proof_expr = cmint_constraints @@ -319,17 +364,132 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { } }); - // Get mint bump from constraint - let cmint_bump_expr = cmint_constraints - .and_then(|c| c.mint_signer_bump.as_ref()) - .map(|e| quote! { #e }) - .unwrap_or_else(|| quote! { panic!("CMint mint_signer_bump constraint is required") }); + // Get the mint_signer field name from the constraint at compile time + let mint_signer_bump_expr = cmint_constraints + .and_then(|c| c.mint_signer.as_ref()) + .map(|signer_field| quote! { _bumps.#signer_field }) + .unwrap_or_else(|| quote! { panic!("mint_signer constraint is required for CMint") }); + + // Check if we have compressed PDAs that need authority signing + let has_compress_on_init = !fields_to_process.is_empty(); + // Collect all unique authorities and their seeds + // Each CPDA MUST have an explicit authority when using compress_on_init + let mut authority_expr = None; + + // Check that all compress_on_init CPDAs have an explicit authority + for ident in fields_to_process.iter() { + if let Some(cpda) = accs.fields.iter().find_map(|af| { + if let AccountField::Field(field) = af { + if &field.ident == *ident { + return field.constraints.cpda.as_ref(); + } + } + None + }) { + if cpda.authority.is_none() { + // Compile-time panic if compress_on_init without authority + panic!( + "CPDA field '{}' has compress_on_init but no cpda::authority constraint. \ + All compress_on_init CPDAs must explicitly specify their authority.", + ident + ); + } + // Use the first authority we find (they should all be the same in practice) + if authority_expr.is_none() { + authority_expr = cpda.authority.as_ref(); + } + } + } + + // Build the authority seeds extraction logic + let authority_seeds_setup = if let Some(auth_expr) = authority_expr { + // The auth_expr is an expression like "authority" + // We need to find the corresponding field and extract its seeds + // For now, let's try to match by converting the expression to a string + let auth_field = accs.fields.iter().find_map(|af| { + if let AccountField::Field(f) = af { + // Simple heuristic: if the field name matches the start of the expression + // This handles both "authority" and "self.authority" cases + let field_name_str = f.ident.to_string(); + let expr_str = quote! { #auth_expr }.to_string(); + if expr_str.contains(&field_name_str) { + Some(f) + } else { + None + } + } else { + None + } + }); + + if let Some(field) = auth_field { + if let Some(seeds_group) = &field.constraints.seeds { + let seeds = &seeds_group.seeds; + let seed_exprs: Vec<_> = seeds.iter().map(|s| { + quote! { #s.as_ref() } + }).collect(); + + quote! { + // Build authority seeds from the authority PDA definition + let auth_bump = _bumps.#auth_expr; + auth_bump_array = [auth_bump]; + let mut auth_seeds_for_cpi: Vec<&[u8]> = vec![#(#seed_exprs),*]; + auth_seeds_for_cpi.push(&auth_bump_array); + } + } else { + quote! { + panic!("Authority field must be a PDA with seeds when compress_on_init PDAs exist") + } + } + } else { + // Fallback: assume it's the standard authority with AUTH_SEED + quote! { + // Build authority seeds (fallback to AUTH_SEED pattern) + let auth_bump = _bumps.#auth_expr; + auth_bump_array = [auth_bump]; + let mut auth_seeds_for_cpi: Vec<&[u8]> = vec![crate::AUTH_SEED.as_bytes()]; + auth_seeds_for_cpi.push(&auth_bump_array); + } + } + } else { + quote! { + // No compress_on_init PDAs, no authority seeds needed + let auth_seeds_for_cpi: Vec<&[u8]> = vec![]; + } + }; + + // Find the bump for the CMint PDA at runtime + // The CMint account is a PDA derived from [b"compressed_mint", mint_signer] quote! { - // Drain queued CMint actions + // Drain queued CMint actions - take ownership to avoid lifetime issues let __mint_actions = self.#cmint_ident.take_actions(); - if !__mint_actions.is_empty() { + // Find the bump for the compressed mint PDA + let compressed_mint_seed = b"compressed_mint"; + let mint_signer_key = self.#cmint_ident + .mint_signer + .as_ref() + .map(|a| a.key()) + .expect("mint_signer is required for CMint"); + + let (expected_mint_address, mint_bump) = anchor_lang::solana_program::pubkey::Pubkey::find_program_address( + &[ + compressed_mint_seed.as_ref(), + mint_signer_key.as_ref(), + ], + &self.#compressed_token_program.key(), // CTOKEN_PROGRAM_ID + ); + + // Verify the CMint account address matches the expected PDA + if self.#cmint_ident.key() != expected_mint_address { + panic!( + "CMint address mismatch: expected {:?}, got {:?}", + expected_mint_address, + self.#cmint_ident.key() + ); + } + // Get tree indices from constraints let output_state_tree_index = #cmint_output_tree_expr; let __address_tree_info = #cmint_address_tree_info_expr; @@ -356,21 +516,28 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { Some(#cmint_authority_expr.into()), self.#cmint_ident.key().into(), ); - // Build actions let actions: Vec = __mint_actions .iter() .map(|a| light_compressed_token_sdk::instructions::MintActionType::MintToCToken { - account: a.recipient, + account: *a.recipient.key, amount: a.amount, }) .collect(); - // Create mint inputs + + let mint_signer = self.#cmint_ident + .mint_signer + .as_ref() + .map(|a| a.key()) + .expect("mint_signer is required for cmint mint_seed"); + let inputs = light_compressed_token_sdk::instructions::CreateMintInputs { compressed_mint_inputs: compressed_mint_with_context, - mint_seed: self.#cmint_ident.key(), - mint_bump: #cmint_bump_expr, + // mint_seed: self.#cmint_ident.key(), + // Use the PDA mint_signer as the mint seed (must sign) + mint_seed: mint_signer, + mint_bump, // Use the bump we just found from PDA derivation authority: #cmint_authority_expr.into(), payer: #cmint_payer_expr, proof: #cmint_proof_expr.0.map(|p| light_compressed_token_sdk::CompressedProof::from(p)), @@ -378,7 +545,6 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { output_queue: output_state_queue, actions, }; - // Build instruction let mint_action_instruction: anchor_lang::solana_program::instruction::Instruction = light_compressed_token_sdk::instructions::create_mint_action_cpi( @@ -390,7 +556,6 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { )), Some(cpi_accounts.cpi_context().unwrap().key()), ).map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotSerialize)?; - // Accounts for CPI let mut account_infos = cpi_accounts.to_account_infos(); account_infos.extend([ @@ -398,37 +563,91 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { self.#compressed_token_program.to_account_info(), self.authority.to_account_info(), ]); - // Add mint_signer if provided if let Some(mint_signer) = &self.#cmint_ident.mint_signer { account_infos.push(mint_signer.clone()); } else { - // If no explicit mint_signer provided, use the CMint account itself - account_infos.push(self.#cmint_ident.to_account_info()); + panic!("mint_signer is required"); } account_infos.push(self.#fee_payer.to_account_info()); - // Recipients will be added from remaining accounts based on mint actions - - // Signer seeds - let mut signer_seeds: Vec<&[&[u8]]> = Vec::new(); - if let (Some(seeds), Some(bump)) = (&self.#cmint_ident.mint_signer_seeds, self.#cmint_ident.mint_signer_bump) { - let mut s: Vec<&[u8]> = seeds.iter().map(|v| v.as_slice()).collect(); - s.push(&[bump]); - signer_seeds.push(Box::leak(s.into_boxed_slice())); + // Add recipient accounts from mint actions + // The recipients are now AccountInfo objects, not just keys + for action in __mint_actions.iter() { + let recipient_info = &action.recipient; + let recipient_key = recipient_info.key; + + // Check if this account is already in account_infos (avoid duplicates) + let already_added = account_infos.iter().any(|ai| ai.key == recipient_key); + + if !already_added { + // Clone and add the recipient AccountInfo + account_infos.push(recipient_info.clone()); + } } - if let (Some(seeds), Some(bump)) = (&self.#cmint_ident.program_authority_seeds, self.#cmint_ident.program_authority_bump) { - let mut s: Vec<&[u8]> = seeds.iter().map(|v| v.as_slice()).collect(); - s.push(&[bump]); - signer_seeds.push(Box::leak(s.into_boxed_slice())); + + + // Build signer seeds without heap for outer groups + // Get mint_signer bump from __bumps based on the mint_signer field name + let mint_signer_bump = #mint_signer_bump_expr; + let mint_bump_array = [mint_signer_bump]; + let mut mint_signer_seeds_vec: Vec<&[u8]> = Vec::new(); + if let Some(seeds) = &self.#cmint_ident.mint_signer_seeds { + for seed in seeds.iter() { mint_signer_seeds_vec.push(seed.as_slice()); } + mint_signer_seeds_vec.push(&mint_bump_array); } - anchor_lang::solana_program::program::invoke_signed( - &mint_action_instruction, - &account_infos, - &signer_seeds, - )?; + + // Build authority seeds for compressed PDA operations + let mut auth_seeds_vec: Vec<&[u8]> = Vec::new(); + let has_compress_on_init = #has_compress_on_init; + + // Declare auth_bump_array at this scope so it lives long enough + let auth_bump_array; + + if has_compress_on_init { + // Build authority seeds from the actual PDA definition + #authority_seeds_setup + // Use the authority seeds we built from the actual PDA definition + auth_seeds_vec = auth_seeds_for_cpi; + } else if let Some(seeds) = &self.#cmint_ident.program_authority_seeds { + // Use explicitly provided program_authority_seeds if available + auth_bump_array = [self.#cmint_ident.program_authority_bump.unwrap_or_else(|| panic!("program_authority_bump is required"))]; + for seed in seeds.iter() { auth_seeds_vec.push(seed.as_slice()); } + auth_seeds_vec.push(&auth_bump_array); + } + + match (mint_signer_seeds_vec.is_empty(), auth_seeds_vec.is_empty()) { + (false, false) => { + anchor_lang::solana_program::program::invoke_signed( + &mint_action_instruction, + &account_infos, + &[mint_signer_seeds_vec.as_slice(), auth_seeds_vec.as_slice()], + )?; + } + (false, true) => { + anchor_lang::solana_program::program::invoke_signed( + &mint_action_instruction, + &account_infos, + &[mint_signer_seeds_vec.as_slice()], + )?; + } + (true, false) => { + anchor_lang::solana_program::program::invoke_signed( + &mint_action_instruction, + &account_infos, + &[auth_seeds_vec.as_slice()], + )?; + } + (true, true) => { + anchor_lang::solana_program::program::invoke_signed( + &mint_action_instruction, + &account_infos, + &[], + )?; + } + } } } } else { @@ -439,8 +658,13 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { quote! { // Compressed accounts finalization { + // Deserialize instruction args to access compression params + // This is the same pattern as try_accounts uses + #ix_de + + // Now we can access compression_params and other instruction args by name! - // Build CPI accounts with CPI context signer + // Build CPI accounts with CPI context signer (no clone) let cpi_accounts = light_sdk::cpi::CpiAccountsSmall::new_with_config( &self.#fee_payer, _remaining, @@ -451,28 +675,8 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { let compression_config_data = light_sdk::compressible::CompressibleConfig::load_checked(&self.#compression_config, &crate::ID)?; let address_space = compression_config_data.address_space; - // Parse compression params from ix_data - // Skip discriminator (8 bytes) and other instruction arguments - let compression_params = { - let mut ix_data_cursor = if _ix_data.len() >= 8 { - &_ix_data[8..] - } else { - _ix_data - }; - - // Skip other instruction arguments (init_amount_0: u64, init_amount_1: u64, open_time: u64) - // Each u64 is 8 bytes, so skip 24 bytes total - if ix_data_cursor.len() >= 24 { - ix_data_cursor = &ix_data_cursor[24..]; - } - - // Now deserialize InitializeCompressionParams - InitializeCompressionParams::deserialize(&mut ix_data_cursor) - .map_err(|_| anchor_lang::error::ErrorCode::InstructionDidNotDeserialize)? - }; - - // Collect compressed infos for all compressible accounts - let mut all_compressed_infos = Vec::new(); + // Collect compressed infos for all compressible accounts (pre-allocate) + let mut all_compressed_infos = Vec::with_capacity(#compressible_count as usize); #(#compress_blocks)* // Invoke ONE system-program batched CPI for all CPDAs @@ -550,7 +754,7 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { quote! {} } _ => quote! { - anchor_lang::AccountsFinalize::finalize(&self.#ident, program_id, _remaining, _ix_data) + anchor_lang::AccountsFinalize::finalize(&self.#ident, program_id, _remaining, _ix_data, _bumps) .map_err(|e| e.with_account_name(#name_str))?; }, } @@ -559,12 +763,13 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { .collect(); quote! { #[automatically_derived] - impl<#combined_generics> anchor_lang::AccountsFinalize<#trait_generics> for #name<#struct_generics> #where_clause{ + impl<#combined_generics> anchor_lang::AccountsFinalize<#trait_generics, #bumps_struct_name> for #name<#struct_generics> #where_clause{ fn finalize( &self, program_id: &anchor_lang::solana_program::pubkey::Pubkey, _remaining: &[anchor_lang::solana_program::account_info::AccountInfo<#trait_generics>], _ix_data: &[u8], + _bumps: &#bumps_struct_name, ) -> anchor_lang::Result<()> { // Finalize all nested/composite fields first, then each field. #(#on_finalize)* diff --git a/lang/syn/src/codegen/program/handlers.rs b/lang/syn/src/codegen/program/handlers.rs index 083b6c4de8..87616fdf00 100644 --- a/lang/syn/src/codegen/program/handlers.rs +++ b/lang/syn/src/codegen/program/handlers.rs @@ -144,6 +144,9 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { &mut __reallocs, )?; + // Clone bumps for finalize before moving into Context + let __bumps_for_finalize = __bumps.clone(); + // Invoke user defined handler. let result = #program_name::#ix_method_name( anchor_lang::context::Context::new( @@ -159,7 +162,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { #maybe_set_return_data // Finalize then exit routine. - anchor_lang::AccountsFinalize::finalize(&__accounts, __program_id, __remaining_accounts, __ix_data)?; + anchor_lang::AccountsFinalize::finalize(&__accounts, __program_id, __remaining_accounts, __ix_data, &__bumps_for_finalize)?; __accounts.exit(__program_id) } } diff --git a/lang/syn/src/lib.rs b/lang/syn/src/lib.rs index 022f1bb61f..34bb3e1c36 100644 --- a/lang/syn/src/lib.rs +++ b/lang/syn/src/lib.rs @@ -817,6 +817,7 @@ pub enum ConstraintToken { CMintProof(Context), CMintOutputStateTreeIndex(Context), // CPDA constraints + CPDAAuthority(Context), CPDAAddressTreeInfo(Context), CPDAProof(Context), CPDAOutputStateTreeIndex(Context), @@ -1162,12 +1163,18 @@ pub struct ConstraintCMintGroup { #[derive(Debug, Clone)] pub struct ConstraintCPDAGroup { - pub compress_on_init: bool, // If true, compress immediately. If false, just prepare. + pub compress_on_init: bool, + pub authority: Option, pub address_tree_info: Option, pub proof: Option, pub output_state_tree_index: Option, } +#[derive(Debug, Clone)] +pub struct ConstraintCPDAAuthority { + pub authority: Expr, +} + #[derive(Debug, Clone)] pub struct ConstraintCPDAAddressTreeInfo { pub address_tree_info: Expr, diff --git a/lang/syn/src/parser/accounts/constraints.rs b/lang/syn/src/parser/accounts/constraints.rs index 81ad70f549..c4e52e8af6 100644 --- a/lang/syn/src/parser/accounts/constraints.rs +++ b/lang/syn/src/parser/accounts/constraints.rs @@ -313,6 +313,12 @@ pub fn parse_token(stream: ParseStream) -> ParseResult { .unwrap_or_else(|| ident.span()); match kw.as_str() { + "authority" => ConstraintToken::CPDAAuthority(Context::new( + span, + ConstraintCPDAAuthority { + authority: stream.parse()?, + }, + )), "address_tree_info" => ConstraintToken::CPDAAddressTreeInfo(Context::new( span, ConstraintCPDAAddressTreeInfo { @@ -698,6 +704,7 @@ pub struct ConstraintGroupBuilder<'ty> { pub cmint_proof: Option>, pub cmint_output_state_tree_index: Option>, // CPDA constraints + pub cpda_authority: Option>, pub cpda_address_tree_info: Option>, pub cpda_proof: Option>, pub cpda_output_state_tree_index: Option>, @@ -759,6 +766,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { cmint_address_tree_info: None, cmint_proof: None, cmint_output_state_tree_index: None, + cpda_authority: None, cpda_address_tree_info: None, cpda_proof: None, cpda_output_state_tree_index: None, @@ -999,6 +1007,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { cmint_address_tree_info, cmint_proof, cmint_output_state_tree_index, + cpda_authority, cpda_address_tree_info, cpda_proof, cpda_output_state_tree_index, @@ -1262,10 +1271,11 @@ impl<'ty> ConstraintGroupBuilder<'ty> { } else { None }, - cpda: if cpda_address_tree_info.is_some() || cpda_proof.is_some() || + cpda: if cpda_authority.is_some() || cpda_address_tree_info.is_some() || cpda_proof.is_some() || cpda_output_state_tree_index.is_some() || cpda_compress_on_init.is_some() { Some(ConstraintCPDAGroup { compress_on_init: cpda_compress_on_init.is_some(), + authority: cpda_authority.map(|c| c.into_inner().authority), address_tree_info: cpda_address_tree_info.map(|c| c.into_inner().address_tree_info), proof: cpda_proof.map(|c| c.into_inner().proof), output_state_tree_index: cpda_output_state_tree_index.map(|c| c.into_inner().output_state_tree_index), @@ -1347,6 +1357,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { ConstraintToken::CMintAddressTreeInfo(c) => self.add_cmint_address_tree_info(c), ConstraintToken::CMintProof(c) => self.add_cmint_proof(c), ConstraintToken::CMintOutputStateTreeIndex(c) => self.add_cmint_output_state_tree_index(c), + ConstraintToken::CPDAAuthority(c) => self.add_cpda_authority(c), ConstraintToken::CPDAAddressTreeInfo(c) => self.add_cpda_address_tree_info(c), ConstraintToken::CPDAProof(c) => self.add_cpda_proof(c), ConstraintToken::CPDAOutputStateTreeIndex(c) => self.add_cpda_output_state_tree_index(c), @@ -1800,6 +1811,14 @@ impl<'ty> ConstraintGroupBuilder<'ty> { Ok(()) } + fn add_cpda_authority(&mut self, c: Context) -> ParseResult<()> { + if self.cpda_authority.is_some() { + return Err(ParseError::new(c.span(), "cpda authority already provided")); + } + self.cpda_authority.replace(c); + Ok(()) + } + fn add_cpda_address_tree_info(&mut self, c: Context) -> ParseResult<()> { if self.cpda_address_tree_info.is_some() { return Err(ParseError::new(c.span(), "cpda address_tree_info already provided")); From d74e0eeaceb35d8270feeb6a9ac6f85dacf9cb43 Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Mon, 29 Sep 2025 20:50:51 -0400 Subject: [PATCH 06/20] add mint_authority, freeze_authority constraints, default to prepare_empty_compressed_accounts_on_init --- CALLER_UPDATE_GUIDE.md | 160 ----------- CMINT_EXAMPLE.md | 101 ------- COMPLETE_CPDA_CMINT_USAGE.md | 163 ----------- COMPRESSED_EXAMPLE.md | 291 -------------------- COMPRESSION_MODES.md | 202 -------------- CONSTRAINT_VALUES_USED.md | 98 ------- CPDA_CMINT_USAGE.md | 115 -------- FINAL_CALLER_INSTRUCTIONS.md | 79 ------ FINAL_CMINT_CPDA_CONSTRAINTS.md | 165 ----------- MINT_SIGNER_IMPLEMENTATION.md | 101 ------- UPDATE_CALLER_PROGRAM.md | 143 ---------- lang/syn/src/codegen/accounts/exit.rs | 102 ++++--- lang/syn/src/lib.rs | 24 ++ lang/syn/src/parser/accounts/constraints.rs | 252 ++++++++++++++++- lang/syn/src/parser/accounts/mod.rs | 15 +- 15 files changed, 346 insertions(+), 1665 deletions(-) delete mode 100644 CALLER_UPDATE_GUIDE.md delete mode 100644 CMINT_EXAMPLE.md delete mode 100644 COMPLETE_CPDA_CMINT_USAGE.md delete mode 100644 COMPRESSED_EXAMPLE.md delete mode 100644 COMPRESSION_MODES.md delete mode 100644 CONSTRAINT_VALUES_USED.md delete mode 100644 CPDA_CMINT_USAGE.md delete mode 100644 FINAL_CALLER_INSTRUCTIONS.md delete mode 100644 FINAL_CMINT_CPDA_CONSTRAINTS.md delete mode 100644 MINT_SIGNER_IMPLEMENTATION.md delete mode 100644 UPDATE_CALLER_PROGRAM.md diff --git a/CALLER_UPDATE_GUIDE.md b/CALLER_UPDATE_GUIDE.md deleted file mode 100644 index 408405ecb7..0000000000 --- a/CALLER_UPDATE_GUIDE.md +++ /dev/null @@ -1,160 +0,0 @@ -# Updating the Caller Program to Use CMint - -## Step 1: Update the Account Type - -Change `lp_mint` from `UncheckedAccount` to `CMint`: - -```rust -// BEFORE: -/// CHECK: checked via mint_signer. -pub lp_mint: UncheckedAccount<'info>, - -// AFTER: -#[account( - cmint::authority = authority, - cmint::decimals = 9, - cmint::mint_signer = lp_mint_signer, // Seeds auto-extracted! -)] -pub lp_mint: CMint<'info>, -``` - -## Step 2: Add Import - -Add the CMint import at the top of the file: - -```rust -use anchor_lang::accounts::CMint; -``` - -## Step 3: Update Instruction Logic - -In your instruction handler, use the CMint's methods: - -```rust -pub fn initialize<'info>( - ctx: Context<'_, '_, '_, 'info, Initialize<'info>>, - init_amount_0: u64, - init_amount_1: u64, - mut open_time: u64, - compression_params: InitializeCompressionParams, -) -> Result<()> { - // ... existing logic ... - - // Queue mint actions (these will be batched) - ctx.accounts.lp_mint.add_mint_action( - MintActionType::MintToCToken { - account: ctx.accounts.creator_lp_token.key(), - amount: user_lp_amount, - } - )?; - - ctx.accounts.lp_mint.add_mint_action( - MintActionType::MintToCToken { - account: ctx.accounts.lp_vault.key(), - amount: vault_lp_amount, - } - )?; - - // ... rest of logic ... - - // Note: The finalize method is called automatically by Anchor! - // It will batch all mint actions and compressed PDAs into a single CPI -} -``` - -## Step 4: Remove Manual CPI Code - -Remove the manual `create_and_mint_lp` function call since it's now handled automatically: - -```rust -// REMOVE THIS: -create_and_mint_lp( - ctx.accounts.creator.to_account_info(), - ctx.accounts.authority.to_account_info(), - &ctx.accounts.lp_mint.key(), - ctx.accounts.lp_vault.to_account_info(), - ctx.accounts.creator_lp_token.to_account_info(), - ctx.accounts.lp_mint_signer.to_account_info(), - &pool_state_key, - ctx.accounts.compressed_token_program_cpi_authority.to_account_info(), - ctx.accounts.compressed_token_program.to_account_info(), - ctx.bumps.lp_mint_signer, - &compression_params, - &cpi_accounts, - user_lp_amount, - vault_lp_amount, - pool_auth_bump, -)?; -``` - -## Step 5: Ensure Proper Account Ordering - -Make sure accounts are in the correct order for the CPI. The CMint finalize will expect: - -- compressed_token_program_cpi_authority -- compressed_token_program -- authority (from cmint::authority) -- mint_signer (from cmint::mint_signer) -- creator (fee payer) -- Recipients for mint actions (creator_lp_token, lp_vault) - -## Full Example - -```rust -#[derive(Accounts)] -pub struct Initialize<'info> { - #[account(mut)] - pub creator: Signer<'info>, - - pub amm_config: Box>, - - #[account( - seeds = [AUTH_SEED.as_bytes()], - bump, - )] - pub authority: UncheckedAccount<'info>, - - #[account( - init, - seeds = [ - POOL_SEED.as_bytes(), - amm_config.key().as_ref(), - token_0_mint.key().as_ref(), - token_1_mint.key().as_ref(), - ], - bump, - payer = creator, - space = PoolState::INIT_SPACE, - compress_on_init, // Compress immediately - )] - pub pool_state: Box>, - - // ... other accounts ... - - #[account( - seeds = [ - POOL_LP_MINT_SEED.as_bytes(), - pool_state.key().as_ref(), - ], - bump, - )] - pub lp_mint_signer: UncheckedAccount<'info>, - - #[account( - cmint::authority = authority, - cmint::decimals = 9, - cmint::mint_signer = lp_mint_signer, // Auto-extracts seeds! - )] - pub lp_mint: CMint<'info>, - - // ... rest of accounts ... -} -``` - -## Benefits - -1. **No Redundant Seeds**: Seeds are defined once on `lp_mint_signer` and auto-extracted -2. **Type Safety**: `CMint` type ensures proper handling -3. **Automatic Batching**: All mint actions and compressions batched into single CPI -4. **Cleaner Code**: Less manual CPI management -5. **Anchor-Native**: Follows Anchor's patterns and conventions diff --git a/CMINT_EXAMPLE.md b/CMINT_EXAMPLE.md deleted file mode 100644 index 02ddc39365..0000000000 --- a/CMINT_EXAMPLE.md +++ /dev/null @@ -1,101 +0,0 @@ -# CMint with Auto-Extracted Seeds - -## Before (Redundant Seeds) - -```rust -#[derive(Accounts)] -pub struct Initialize<'info> { - // ... other accounts ... - - /// Signer PDA used to derive lp_mint and its compressed address - #[account( - seeds = [ - POOL_LP_MINT_SEED.as_bytes(), - pool_state.key().as_ref(), - ], - bump, - )] - pub lp_mint_signer: UncheckedAccount<'info>, - - /// The compressed mint - #[account( - cmint::authority = authority, - cmint::decimals = 9, - cmint::mint_signer = lp_mint_signer, - cmint::mint_signer_seeds = [ // REDUNDANT! Already defined on lp_mint_signer - POOL_LP_MINT_SEED.as_bytes(), - pool_state.key().as_ref(), - ], - cmint::mint_signer_bump, // REDUNDANT! Already defined on lp_mint_signer - )] - pub lp_mint: CMint<'info>, - - // ... other accounts ... -} -``` - -## After (Auto-Extracted Seeds) - -```rust -#[derive(Accounts)] -pub struct Initialize<'info> { - // ... other accounts ... - - /// Signer PDA used to derive lp_mint and its compressed address - #[account( - seeds = [ - POOL_LP_MINT_SEED.as_bytes(), - pool_state.key().as_ref(), - ], - bump, - )] - pub lp_mint_signer: UncheckedAccount<'info>, - - /// The compressed mint - seeds are auto-extracted from lp_mint_signer! - #[account( - cmint::authority = authority, - cmint::decimals = 9, - cmint::mint_signer = lp_mint_signer, // Seeds and bump auto-extracted from here! - // NO NEED for cmint::mint_signer_seeds or cmint::mint_signer_bump - )] - pub lp_mint: CMint<'info>, - - // ... other accounts ... -} -``` - -## How It Works - -When you specify `cmint::mint_signer = lp_mint_signer`, Anchor will: - -1. Look up the `lp_mint_signer` account in your struct -2. Extract its `seeds` and `bump` constraints -3. Automatically use those for the CMint's mint_signer_seeds and mint_signer_bump -4. Pass the correct AccountInfo and seeds to the compressed token CPI - -This follows Anchor's philosophy of reducing redundancy and making the framework more ergonomic. - -## Key Relationships - -``` -mint_signer (PDA) → used as mint_seed → spl_mint (PDA) → compressed_mint -``` - -- `mint_signer`: The PDA that acts as the seed for deriving the SPL mint -- `spl_mint` (lp_mint): Derived from mint_signer, represents the SPL mint address -- `compressed_mint`: Derived from spl_mint address - -## Manual Override Still Possible - -If needed, you can still manually specify seeds (they will override the auto-extraction): - -```rust -#[account( - cmint::authority = authority, - cmint::decimals = 9, - cmint::mint_signer = lp_mint_signer, - cmint::mint_signer_seeds = [...], // Manual override - cmint::mint_signer_bump = ..., // Manual override -)] -pub lp_mint: CMint<'info>, -``` diff --git a/COMPLETE_CPDA_CMINT_USAGE.md b/COMPLETE_CPDA_CMINT_USAGE.md deleted file mode 100644 index e800802460..0000000000 --- a/COMPLETE_CPDA_CMINT_USAGE.md +++ /dev/null @@ -1,163 +0,0 @@ -# Complete CPDA and CMint Constraint System - -## The Proper Anchor Way - -We now have a complete constraint system that follows Anchor's `#[instruction(...)]` pattern perfectly. - -## CPDA (Compressed PDA) Constraints - -For accounts that should be compressed: - -```rust -#[derive(Accounts)] -#[instruction(params: InitializeCompressionParams)] -pub struct Initialize<'info> { - // For immediate compression with auto-close - #[account( - init, - seeds = [...], - bump, - payer = creator, - space = PoolState::INIT_SPACE, - compress_on_init, // This flag triggers immediate compression - cpda::address_tree_info = params.pool_address_tree_info, - cpda::proof = params.proof, - cpda::output_state_tree_index = params.output_state_tree_index, - )] - pub pool_state: Box>, - - // Another compressed PDA - #[account( - init, - seeds = [...], - bump, - payer = creator, - space = ObservationState::INIT_SPACE, - compress_on_init, // Immediate compression - cpda::address_tree_info = params.observation_address_tree_info, - cpda::proof = params.proof, - cpda::output_state_tree_index = params.output_state_tree_index, - )] - pub observation_state: Box>, - - // For compressible (prepare only, no auto-close) - #[account( - init, - seeds = [...], - bump, - payer = creator, - space = SomeState::INIT_SPACE, - cpda::address_tree_info = params.some_address_tree_info, - cpda::proof = params.proof, - cpda::output_state_tree_index = params.output_state_tree_index, - // NO compress_on_init - this will only prepare for future compression - )] - pub some_state: Box>, -} -``` - -## CMint (Compressed Mint) Constraints - -```rust - #[account( - cmint::authority = authority.key(), - cmint::decimals = 9, - cmint::payer = creator, - cmint::mint_signer = lp_mint_signer, - cmint::address_tree_info = params.lp_mint_address_tree_info, - cmint::proof = params.proof, - )] - pub lp_mint: CMint<'info>, - - #[account( - seeds = [POOL_LP_MINT_SEED.as_bytes(), pool_state.key().as_ref()], - bump, - )] - pub lp_mint_signer: UncheckedAccount<'info>, -``` - -## Instruction Data Structure - -```rust -#[derive(AnchorSerialize, AnchorDeserialize)] -pub struct InitializeCompressionParams { - // Standard params - pub init_amount_0: u64, - pub init_amount_1: u64, - pub open_time: u64, - - // CPDA params - one for each compressed account - pub pool_address_tree_info: PackedAddressTreeInfo, - pub observation_address_tree_info: PackedAddressTreeInfo, - - // CMint params - pub lp_mint_address_tree_info: PackedAddressTreeInfo, - pub lp_mint_bump: u8, - pub creator_lp_token_bump: u8, - - // Shared compression params - pub proof: ValidityProof, - pub output_state_tree_index: u8, -} -``` - -## Key Features - -### 1. **`compress_on_init` Flag** - -- When present: Account is compressed immediately and auto-closed -- When absent: Account is only prepared for future compression - -### 2. **Explicit Data Mapping** - -- `cpda::address_tree_info` - Maps to instruction data field -- `cpda::proof` - Maps to instruction data field -- `cpda::output_state_tree_index` - Maps to instruction data field - -### 3. **CMint Integration** - -- All CMint constraints work as before -- `cmint::mint_signer` links to the signer PDA -- Seeds are auto-extracted from the linked account - -### 4. **Automatic Batching** - -- All compression happens in one `invoke_signed` -- CMint creation and minting batched together -- Auto-close for `compress_on_init` accounts - -## What Happens Automatically - -1. **For `compress_on_init` accounts:** - - - Compressed immediately during instruction - - Auto-closed after compression - - Rent reclaimed to `rent_recipient` - -2. **For regular CPDA accounts (no `compress_on_init`):** - - - Prepared for compression - - Can be compressed later when inactive - - No auto-close - -3. **For CMint:** - - Created with all mint actions - - Batched with CPDA compression - - Single CPI for everything - -## Required Supporting Accounts - -These must be present (detected by name): - -- `compression_config` -- `rent_recipient` -- `compressed_token_program` -- `compressed_token_program_cpi_authority` - -## Benefits - -✅ **100% Orthodox Anchor** - Follows established patterns -✅ **Explicit Intent** - Clear data flow via constraints -✅ **Type Safety** - Compile-time validation -✅ **Flexible** - Mix compress_on_init and compressible -✅ **Clean** - No manual compression code needed diff --git a/COMPRESSED_EXAMPLE.md b/COMPRESSED_EXAMPLE.md deleted file mode 100644 index 912da691c2..0000000000 --- a/COMPRESSED_EXAMPLE.md +++ /dev/null @@ -1,291 +0,0 @@ -# Complete Anchor Compressed Implementation Example - -## Updated Caller Program with Compressed Support - -```rust -use anchor_lang::prelude::*; - -#[derive(Accounts)] -pub struct Initialize<'info> { - /// Address paying to create the pool - #[account(mut)] - pub creator: Signer<'info>, - - /// AMM config - pub amm_config: Box>, - - /// Pool authority - #[account( - seeds = [crate::AUTH_SEED.as_bytes()], - bump, - )] - pub authority: UncheckedAccount<'info>, - - /// Pool state - COMPRESSIBLE (index 0) - #[account( - init, - compressible, // ← Makes this account compressible - seeds = [ - POOL_SEED.as_bytes(), - amm_config.key().as_ref(), - token_0_mint.key().as_ref(), - token_1_mint.key().as_ref(), - ], - bump, - payer = creator, - space = PoolState::INIT_SPACE - )] - pub pool_state: Box>, - - /// Token mints... - #[account(mint::token_program = token_0_program)] - pub token_0_mint: Box>, - - #[account(mint::token_program = token_1_program)] - pub token_1_mint: Box>, - - /// LP mint signer PDA - #[account( - seeds = [POOL_LP_MINT_SEED.as_bytes(), pool_state.key().as_ref()], - bump, - )] - pub lp_mint_signer: UncheckedAccount<'info>, - - /// Compressed LP mint (index 2, after CPDAs) - #[account( - cmint::authority = authority, - cmint::decimals = 9, - cmint::mint_signer_seeds = [POOL_LP_MINT_SEED.as_bytes(), pool_state.key().as_ref()], - cmint::mint_signer_bump, - cmint::program_authority_seeds = [crate::AUTH_SEED.as_bytes()], - cmint::program_authority_bump - )] - pub lp_mint: CMint<'info>, - - // Token accounts... - #[account(mut)] - pub creator_token_0: Box>, - - #[account(mut)] - pub creator_token_1: Box>, - - #[account(mut)] - pub creator_lp_token: UncheckedAccount<'info>, - - #[account(mut, seeds = [POOL_VAULT_SEED.as_bytes(), lp_mint.key().as_ref()], bump)] - pub lp_vault: UncheckedAccount<'info>, - - // Token vaults... - #[account(mut, seeds = [POOL_VAULT_SEED.as_bytes(), pool_state.key().as_ref(), token_0_mint.key().as_ref()], bump)] - pub token_0_vault: UncheckedAccount<'info>, - - #[account(mut, seeds = [POOL_VAULT_SEED.as_bytes(), pool_state.key().as_ref(), token_1_mint.key().as_ref()], bump)] - pub token_1_vault: UncheckedAccount<'info>, - - /// Observation state - COMPRESSIBLE (index 1) - #[account( - init, - compressible, // ← Makes this account compressible - seeds = [ - OBSERVATION_SEED.as_bytes(), - pool_state.key().as_ref(), - ], - bump, - payer = creator, - space = ObservationState::INIT_SPACE - )] - pub observation_state: Box>, - - // Standard programs... - pub token_program: Program<'info, Token>, - pub token_0_program: Interface<'info, TokenInterface>, - pub token_1_program: Interface<'info, TokenInterface>, - pub associated_token_program: Program<'info, AssociatedToken>, - pub system_program: Program<'info, System>, - pub rent: Sysvar<'info, Rent>, - - // Compression-specific accounts (required by name convention) - /// CHECK: Compression config - pub compression_config: AccountInfo<'info>, - - /// CHECK: Rent recipient - #[account(mut)] - pub rent_recipient: AccountInfo<'info>, - - /// CHECK: Compressed token program CPI authority - pub compressed_token_program_cpi_authority: AccountInfo<'info>, - - /// CHECK: Compressed token program - pub compressed_token_program: AccountInfo<'info>, - - // ... other compression accounts ... -} - -pub fn initialize<'info>( - ctx: Context<'_, '_, '_, 'info, Initialize<'info>>, - init_amount_0: u64, - init_amount_1: u64, - open_time: u64, - compression_params: InitializeCompressionParams, -) -> Result<()> { - // Your normal initialization logic - let pool_state = &mut ctx.accounts.pool_state; - let observation_state = &mut ctx.accounts.observation_state; - - pool_state.initialize(/* ... */); - observation_state.pool_id = pool_state.key(); - - // Transfer initial liquidity - transfer_from_user_to_pool_vault(/* ... */)?; - - // Queue mint actions for compressed mint - let user_lp_amount = calculate_user_lp(/* ... */); - let vault_lp_amount = calculate_vault_lp(/* ... */); - - ctx.accounts.lp_mint.mint_to(&ctx.accounts.creator_lp_token.key(), user_lp_amount)?; - ctx.accounts.lp_mint.mint_to(&ctx.accounts.lp_vault.key(), vault_lp_amount)?; - - // Close accounts to trigger compression - pool_state.close(ctx.accounts.rent_recipient.clone())?; - observation_state.close(ctx.accounts.rent_recipient.clone())?; - - Ok(()) -} - -#[derive(AnchorSerialize, AnchorDeserialize)] -pub struct InitializeCompressionParams { - pub pool_address_tree_info: PackedAddressTreeInfo, - pub observation_address_tree_info: PackedAddressTreeInfo, - pub lp_mint_address_tree_info: PackedAddressTreeInfo, - pub lp_mint_bump: u8, - pub creator_lp_token_bump: u8, - pub proof: ValidityProof, - pub output_state_tree_index: u8, -} -``` - -## What Anchor Does Behind the Scenes - -### 1. Scans for Compressible Accounts - -- Detects `pool_state` with `init, compressible` → index 0 -- Detects `observation_state` with `init, compressible` → index 1 -- Detects `lp_mint: CMint` → index 2 (always last) - -### 2. Generates Batched Compression Logic - -```rust -// Auto-generated in AccountsFinalize implementation -{ - // Build CPI accounts - let cpi_accounts = CpiAccountsSmall::new_with_config( - &self.creator, - _remaining, - CpiAccountsConfig::new_with_cpi_context(crate::LIGHT_CPI_SIGNER), - ); - - // Load compression config - let compression_config = CompressibleConfig::load_checked(&self.compression_config, &crate::ID)?; - - // Parse compression params from ix_data - let compression_params = /* deserialize from ix_data */; - - // Collect ALL compressible accounts - let mut all_compressed_infos = Vec::new(); - - // Process pool_state (index 0) - let pool_new_address_params = compression_params.pool_address_tree_info - .into_new_address_params_assigned_packed( - self.pool_state.key().to_bytes(), - true, - Some(0), - ); - - let pool_compressed_address = derive_address(/* ... */); - - let pool_compressed_infos = prepare_accounts_for_compression_on_init::( - &[&*self.pool_state], - &[pool_compressed_address], - &[pool_new_address_params], - &[compression_params.output_state_tree_index], - &cpi_accounts, - &address_space, - &self.rent_recipient, - )?; - all_compressed_infos.extend(pool_compressed_infos); - - // Process observation_state (index 1) - let observation_new_address_params = compression_params.observation_address_tree_info - .into_new_address_params_assigned_packed( - self.observation_state.key().to_bytes(), - true, - Some(1), - ); - - let observation_compressed_address = derive_address(/* ... */); - - let observation_compressed_infos = prepare_accounts_for_compression_on_init::( - &[&*self.observation_state], - &[observation_compressed_address], - &[observation_new_address_params], - &[compression_params.output_state_tree_index], - &cpi_accounts, - &address_space, - &self.rent_recipient, - )?; - all_compressed_infos.extend(observation_compressed_infos); - - // ONE batched system CPI for ALL CPDAs - let cpi_inputs = CpiInputs::new_first_cpi( - all_compressed_infos, - vec![pool_new_address_params, observation_new_address_params], - ); - - let cpi_context = cpi_accounts.cpi_context().unwrap(); - let cpi_context_accounts = CpiContextWriteAccounts { - fee_payer: cpi_accounts.fee_payer(), - authority: cpi_accounts.authority().unwrap(), - cpi_context, - cpi_signer: crate::LIGHT_CPI_SIGNER, - }; - cpi_inputs.invoke_light_system_program_cpi_context(cpi_context_accounts)?; - - // Then chain CMint creation as last CPI - let mint_actions = self.lp_mint.take_actions(); - if !mint_actions.is_empty() { - // Create mint and execute mint_to actions - // Using last_cpi_create_mint with index 2 - // ... (mint creation logic) - } -} -``` - -## Key Benefits - -1. **Clean Syntax**: Just add `compressible` to any `Account` with `init` -2. **Automatic Batching**: All CPDAs collected and compressed in ONE system CPI -3. **Proper Ordering**: CPDAs first (indices 0, 1, ...), CMint always last -4. **Context Chaining**: CPI context properly carried through to CMint -5. **Generic**: Works for 1-N compressible accounts -6. **Orthodox**: Uses standard Anchor patterns, no new types needed - -## Migration from Manual - -Before (Manual): - -```rust -compress_pool_and_observation_pdas(&cpi_accounts, &pool_state, &observation_state, ...)?; -create_and_mint_lp(...)?; -pool_state.close(rent_recipient)?; -observation_state.close(rent_recipient)?; -``` - -After (Anchor): - -```rust -// Just mark accounts as compressible and queue mint actions -// Anchor handles ALL compression logic automatically! -ctx.accounts.lp_mint.mint_to(&recipient, amount)?; -pool_state.close(rent_recipient)?; -observation_state.close(rent_recipient)?; -``` diff --git a/COMPRESSION_MODES.md b/COMPRESSION_MODES.md deleted file mode 100644 index 2749d5f514..0000000000 --- a/COMPRESSION_MODES.md +++ /dev/null @@ -1,202 +0,0 @@ -# Anchor Compression Modes for PDAs - -## Two Compression Modes - -### 1. `compress_on_init` - Immediate Compression with Auto-Close - -```rust -#[derive(Accounts)] -pub struct Initialize<'info> { - /// Pool state - will be compressed immediately and auto-closed - #[account( - init, - compress_on_init, // ← Compress immediately + auto-close - seeds = [/* ... */], - bump, - payer = creator, - space = PoolState::INIT_SPACE - )] - pub pool_state: Box>, - - /// Observation state - also compressed immediately - #[account( - init, - compress_on_init, // ← Compress immediately + auto-close - seeds = [/* ... */], - bump, - payer = creator, - space = ObservationState::INIT_SPACE - )] - pub observation_state: Box>, - - // Required compression accounts (by name convention) - pub compression_config: AccountInfo<'info>, - #[account(mut)] - pub rent_recipient: AccountInfo<'info>, - // ... other compression accounts -} - -pub fn initialize(ctx: Context, params: CompressionParams) -> Result<()> { - // Your logic here... - - // NO NEED to manually call .close() - Anchor auto-closes at end! - // pool_state.close() and observation_state.close() are called automatically - - Ok(()) -} -``` - -**What Anchor Does:** - -1. Calls `prepare_accounts_for_compression_on_init` for each account -2. Batches ALL accounts into ONE `invoke_light_system_program_cpi_context` -3. **Automatically calls `.close()` on each account at the end** - -### 2. `compressible` - Prepare for Future Compression (No Auto-Close) - -```rust -#[derive(Accounts)] -pub struct Initialize<'info> { - /// Pool state - prepared for compression but NOT auto-closed - #[account( - init, - compressible, // ← Prepare for future compression, no auto-close - seeds = [/* ... */], - bump, - payer = creator, - space = PoolState::INIT_SPACE - )] - pub pool_state: Box>, - - /// Observation state - also prepared but not auto-closed - #[account( - init, - compressible, // ← Prepare for future compression, no auto-close - seeds = [/* ... */], - bump, - payer = creator, - space = ObservationState::INIT_SPACE - )] - pub observation_state: Box>, - - // Same compression accounts required - pub compression_config: AccountInfo<'info>, - #[account(mut)] - pub rent_recipient: AccountInfo<'info>, - // ... -} - -pub fn initialize(ctx: Context, params: CompressionParams) -> Result<()> { - // Your logic here... - - // Accounts are prepared for compression but NOT closed - // You can compress them later in another instruction - - Ok(()) -} -``` - -**What Anchor Does:** - -1. Calls `prepare_accounts_for_empty_compression_on_init` for each account (currently unimplemented) -2. Batches ALL accounts into ONE system CPI -3. **Does NOT call `.close()` - accounts remain active** - -## Important Rules - -### ✅ Valid: All accounts use the same mode - -```rust -// All compress_on_init - OK -#[account(init, compress_on_init)] -pub pool_state: Account<'info, PoolState>, - -#[account(init, compress_on_init)] -pub observation_state: Account<'info, ObservationState>, -``` - -```rust -// All compressible - OK -#[account(init, compressible)] -pub pool_state: Account<'info, PoolState>, - -#[account(init, compressible)] -pub observation_state: Account<'info, ObservationState>, -``` - -### ❌ Invalid: Mixed modes (compile error) - -```rust -// ERROR: Cannot mix modes! -#[account(init, compress_on_init)] -pub pool_state: Account<'info, PoolState>, - -#[account(init, compressible)] // ← Different mode = ERROR -pub observation_state: Account<'info, ObservationState>, -``` - -## Combined with CMint - -Both modes work with CMint: - -```rust -#[derive(Accounts)] -pub struct Initialize<'info> { - // CPDAs with compress_on_init (auto-close) - #[account(init, compress_on_init)] - pub pool_state: Box>, - - #[account(init, compress_on_init)] - pub observation_state: Box>, - - // Compressed mint - #[account( - cmint::authority = authority, - cmint::decimals = 9, - // ... other cmint constraints - )] - pub lp_mint: CMint<'info>, - - // ... other accounts -} -``` - -**Execution Order:** - -1. All CPDAs compressed first (indices 0, 1, ...) -2. CMint created last (index N) -3. Single batched `invoke_signed` for everything -4. If `compress_on_init`: auto-close CPDAs - -## Migration Path - -### From Manual Compression - -```rust -// Before (Manual): -compress_pool_and_observation_pdas(&cpi_accounts, &pool_state, &observation_state, ...)?; -create_and_mint_lp(...)?; -pool_state.close(rent_recipient)?; -observation_state.close(rent_recipient)?; -``` - -### To Anchor Compression - -```rust -// After (Anchor with compress_on_init): -// Just mark accounts and let Anchor handle everything! -#[account(init, compress_on_init)] -pub pool_state: Box>, - -// In handler: -ctx.accounts.lp_mint.mint_to(&recipient, amount)?; -// That's it! Compression and close happen automatically -``` - -## Current Status - -- ✅ `compress_on_init`: Fully implemented with auto-close -- ⚠️ `compressible`: Structure in place, but `prepare_accounts_for_empty_compression_on_init` throws `unimplemented!()` -- ✅ Error checking: Cannot mix modes -- ✅ Works with CMint in both modes -- ✅ Proper batching and CPI context chaining diff --git a/CONSTRAINT_VALUES_USED.md b/CONSTRAINT_VALUES_USED.md deleted file mode 100644 index bda811b79b..0000000000 --- a/CONSTRAINT_VALUES_USED.md +++ /dev/null @@ -1,98 +0,0 @@ -# All Constraint Values Are Now Actually Used! - -## ✅ Fixed: No More Hardcoded Values - -### CMint Values Actually Used in Generated Code: - -1. **Tree Indices** - From constraints, not hardcoded: - -```rust -// BEFORE (hardcoded): -let output_state_queue_idx: u8 = 0; -let address_tree_idx: u8 = 1; - -// AFTER (from constraints): -let output_state_tree_index = #cmint_output_tree_expr; // From cmint::output_state_tree_index -let address_tree_info = #cmint_address_tree_info_expr; // From cmint::address_tree_info -let address_tree_idx = address_tree_info.address_merkle_tree_pubkey_index; -let address_queue_idx = address_tree_info.address_queue_pubkey_index; -``` - -2. **Root Index** - From address_tree_info: - -```rust -// Uses the actual root_index from the constraint -compressed_mint_with_context = CompressedMintWithContext::new( - mint_compressed_address, - address_tree_info.root_index, // From cmint::address_tree_info - ... -); -``` - -3. **Authority** - From constraint: - -```rust -authority: #cmint_authority_expr.into(), // From cmint::authority -``` - -4. **Payer** - From constraint: - -```rust -payer: #cmint_payer_expr, // From cmint::payer -``` - -5. **Proof** - From constraint: - -```rust -proof: #cmint_proof_expr.0.map(|p| ...), // From cmint::proof -``` - -6. **Mint Bump** - From constraint or instruction data: - -```rust -mint_bump: #cmint_bump_expr, // From mint_signer_bump if available -``` - -7. **CpiContext Indices** - Actually used: - -```rust -CpiContext::last_cpi_create_mint( - address_tree_idx, // From address_tree_info - output_state_tree_index, // From cmint::output_state_tree_index - #compressible_count, -) -``` - -## Complete Constraint Usage - -When you specify: - -```rust -#[account( - cmint::authority = authority.key(), - cmint::payer = creator, - cmint::proof = params.proof, - cmint::address_tree_info = params.lp_mint_address_tree_info, - cmint::output_state_tree_index = params.output_state_tree_index, -)] -pub lp_mint: CMint<'info>, -``` - -ALL these values are actually extracted and used: - -- `authority` → Used in CreateMintInputs -- `payer` → Used in CreateMintInputs -- `proof` → Used in CreateMintInputs -- `address_tree_info` → Used for tree indices AND root_index -- `output_state_tree_index` → Used for output queue selection - -## No More Magic Numbers! - -Everything is now driven by your constraints. The generated code: - -1. Extracts indices from your `PackedAddressTreeInfo` -2. Uses the correct tree accounts based on those indices -3. Passes the right values to all CPI calls -4. No hardcoded 0s and 1s! - -This is 100% data-driven from your constraints! diff --git a/CPDA_CMINT_USAGE.md b/CPDA_CMINT_USAGE.md deleted file mode 100644 index 601e5db8cd..0000000000 --- a/CPDA_CMINT_USAGE.md +++ /dev/null @@ -1,115 +0,0 @@ -# Using CPDA and CMint Constraints with #[instruction(...)] - -## The Anchor Way: Explicit Instruction Data - -Instead of auto-generating compression code that guesses field names, we now require explicit instruction data mapping using Anchor's `#[instruction(...)]` pattern. - -## Example Usage - -```rust -#[derive(Accounts)] -#[instruction(params: InitializeParams)] // Access instruction data -pub struct Initialize<'info> { - #[account(mut)] - pub creator: Signer<'info>, - - // Compressed PDA with explicit data mapping - #[account( - init, - seeds = [...], - bump, - payer = creator, - space = PoolState::INIT_SPACE, - cpda::address_tree_info = params.pool_address_tree_info, - cpda::proof = params.proof, - )] - pub pool_state: Box>, - - // Another compressed PDA - #[account( - init, - seeds = [...], - bump, - payer = creator, - space = ObservationState::INIT_SPACE, - cpda::address_tree_info = params.observation_address_tree_info, - cpda::proof = params.proof, - )] - pub observation_state: Box>, - - // Compressed Mint with explicit data - #[account( - cmint::authority = authority, - cmint::decimals = 9, - cmint::payer = creator, - cmint::mint_signer = lp_mint_signer, - cmint::address_tree_info = params.lp_mint_address_tree_info, - cmint::proof = params.proof, - )] - pub lp_mint: CMint<'info>, - - // ... other accounts ... -} - -#[derive(AnchorSerialize, AnchorDeserialize)] -pub struct InitializeParams { - // Standard params - pub init_amount_0: u64, - pub init_amount_1: u64, - pub open_time: u64, - - // Compression params for CPDAs - pub pool_address_tree_info: PackedAddressTreeInfo, - pub observation_address_tree_info: PackedAddressTreeInfo, - - // Compression params for CMint - pub lp_mint_address_tree_info: PackedAddressTreeInfo, - pub lp_mint_bump: u8, - pub creator_lp_token_bump: u8, - - // Shared proof - pub proof: ValidityProof, - pub output_state_tree_index: u8, -} - -pub fn initialize( - ctx: Context, - params: InitializeParams, -) -> Result<()> { - // Your logic here - - // Queue mint actions for CMint - ctx.accounts.lp_mint.mint_to(&recipient1, amount1)?; - ctx.accounts.lp_mint.mint_to(&recipient2, amount2)?; - - // Everything is batched and executed automatically at the end! - Ok(()) -} -``` - -## Key Benefits - -1. **Explicit Data Mapping**: No guessing field names - you explicitly map instruction data to constraints -2. **Type Safety**: Anchor validates that the instruction data matches what's expected -3. **Orthodox Anchor**: This follows Anchor's established patterns perfectly -4. **Clear Intent**: Anyone reading the code knows exactly where compression params come from - -## What Happens Automatically - -When you use `cpda::` and `cmint::` constraints: - -1. Anchor generates the batched CPI code -2. All compressed PDAs are initialized and compressed in one batch -3. CMint is created with all queued mint actions -4. Everything happens in a single `invoke_signed` at the end - -## Required Accounts - -For this to work, you still need these accounts in your struct: - -- `compression_config`: The compression configuration account -- `compressed_token_program`: The compressed token program -- `compressed_token_program_cpi_authority`: The CPI authority -- And other Light Protocol required accounts - -But now they're detected by name automatically! diff --git a/FINAL_CALLER_INSTRUCTIONS.md b/FINAL_CALLER_INSTRUCTIONS.md deleted file mode 100644 index 2ac2880d41..0000000000 --- a/FINAL_CALLER_INSTRUCTIONS.md +++ /dev/null @@ -1,79 +0,0 @@ -# Final Instructions for Using CMint in Your Caller Program - -## Current Status - -✅ The Anchor fork now supports: - -- `CMint` account type -- Auto-extraction of seeds from linked accounts -- Generic bumps support for `CMint` -- Proper type generation - -## What You Need to Do - -### 1. Keep Your Current Accounts Struct - -Your `Initialize` struct is correct with: - -```rust -#[account( - seeds = [POOL_LP_MINT_SEED.as_bytes(), pool_state.key().as_ref()], - bump, -)] -pub lp_mint_signer: UncheckedAccount<'info>, - -#[account( - cmint::authority = authority.key(), - cmint::decimals = 9, - cmint::mint_signer = lp_mint_signer, // Seeds auto-extracted! -)] -pub lp_mint: CMint<'info>, -``` - -### 2. Use mint_to in Your Instruction - -```rust -// Queue mint actions (batched automatically) -ctx.accounts.lp_mint.mint_to( - &ctx.accounts.creator_lp_token.key(), - user_lp_amount, -)?; - -ctx.accounts.lp_mint.mint_to( - &ctx.accounts.lp_vault.key(), - vault_lp_amount, -)?; -``` - -### 3. Manual Finalization (Temporary) - -Since auto-generation is disabled for now, you need to manually handle the batched CPI at the end of your instruction. This involves: - -1. Setting up `CpiAccountsSmall` -2. Calling the compression functions for PDAs -3. Creating and executing the mint CPI - -**Note**: The auto-generation is temporarily disabled because it needs to detect all the required fields dynamically. For now, you'll need to keep your manual compression code. - -## What's Working - -- ✅ `CMint` type with proper lifetime support -- ✅ Auto-extraction of seeds from `lp_mint_signer` -- ✅ `mint_to` method to queue actions -- ✅ Proper constraint parsing - -## What's Not Yet Auto-Generated - -- ❌ Automatic CpiAccountsSmall setup -- ❌ Automatic compression of PDAs with `compress_on_init` -- ❌ Automatic batched CPI execution - -## Next Steps - -To fully automate, we need to: - -1. Detect required fields dynamically (compression_config, rent_recipient, etc.) -2. Generate the CpiAccountsSmall setup based on available fields -3. Generate the batched CPI only when all requirements are met - -For now, keep your manual implementation for the compression and CPI parts, but use the `CMint` type for better type safety and the auto-extracted seeds feature. diff --git a/FINAL_CMINT_CPDA_CONSTRAINTS.md b/FINAL_CMINT_CPDA_CONSTRAINTS.md deleted file mode 100644 index d5f8fd42e2..0000000000 --- a/FINAL_CMINT_CPDA_CONSTRAINTS.md +++ /dev/null @@ -1,165 +0,0 @@ -# Complete CMint and CPDA Constraint System - -## ✅ All Constraints Now Available - -### CMint Constraints - -```rust -#[account( - cmint::authority = authority.key(), // Authority for the mint - cmint::decimals = 9, // Mint decimals - cmint::payer = creator, // Who pays for creation - cmint::mint_signer = lp_mint_signer, // Linked signer PDA - cmint::address_tree_info = params.lp_mint_address_tree_info, // Tree info from ix data - cmint::proof = params.proof, // Proof from ix data - cmint::output_state_tree_index = params.output_state_tree_index, // Output tree index -)] -pub lp_mint: CMint<'info>, -``` - -### CPDA Constraints - -```rust -#[account( - init, - seeds = [...], - bump, - payer = creator, - space = PoolState::INIT_SPACE, - compress_on_init, // Optional: triggers immediate compression + auto-close - cpda::address_tree_info = params.pool_address_tree_info, - cpda::proof = params.proof, - cpda::output_state_tree_index = params.output_state_tree_index, -)] -pub pool_state: Box>, -``` - -## Complete Example - -```rust -#[derive(Accounts)] -#[instruction(params: InitializeCompressionParams)] -pub struct Initialize<'info> { - #[account(mut)] - pub creator: Signer<'info>, - - #[account( - seeds = [b"authority"], - bump, - )] - pub authority: UncheckedAccount<'info>, - - // Compressed PDA with immediate compression - #[account( - init, - seeds = [ - POOL_SEED.as_bytes(), - amm_config.key().as_ref(), - token_0_mint.key().as_ref(), - token_1_mint.key().as_ref(), - ], - bump, - payer = creator, - space = PoolState::INIT_SPACE, - compress_on_init, - cpda::address_tree_info = params.pool_address_tree_info, - cpda::proof = params.proof, - cpda::output_state_tree_index = params.output_state_tree_index, - )] - pub pool_state: Box>, - - // Compressed Mint with all params - #[account( - cmint::authority = authority.key(), - cmint::decimals = 9, - cmint::payer = creator, - cmint::mint_signer = lp_mint_signer, - cmint::address_tree_info = params.lp_mint_address_tree_info, - cmint::proof = params.proof, - cmint::output_state_tree_index = params.output_state_tree_index, - )] - pub lp_mint: CMint<'info>, - - #[account( - seeds = [POOL_LP_MINT_SEED.as_bytes(), pool_state.key().as_ref()], - bump, - )] - pub lp_mint_signer: UncheckedAccount<'info>, - - // Required supporting accounts (detected by name) - pub compression_config: AccountInfo<'info>, - pub rent_recipient: AccountInfo<'info>, - pub compressed_token_program: AccountInfo<'info>, - pub compressed_token_program_cpi_authority: AccountInfo<'info>, - - // ... other accounts ... -} - -#[derive(AnchorSerialize, AnchorDeserialize)] -pub struct InitializeCompressionParams { - // Your params - pub init_amount_0: u64, - pub init_amount_1: u64, - pub open_time: u64, - - // CPDA params - pub pool_address_tree_info: PackedAddressTreeInfo, - pub observation_address_tree_info: PackedAddressTreeInfo, - - // CMint params - pub lp_mint_address_tree_info: PackedAddressTreeInfo, - pub lp_mint_bump: u8, - pub creator_lp_token_bump: u8, - - // Shared params - pub proof: ValidityProof, - pub output_state_tree_index: u8, -} - -pub fn initialize( - ctx: Context, - params: InitializeCompressionParams, -) -> Result<()> { - // Your logic... - - // Queue mint actions (batched automatically) - ctx.accounts.lp_mint.mint_to( - &ctx.accounts.creator_lp_token.key(), - user_lp_amount, - )?; - - ctx.accounts.lp_mint.mint_to( - &ctx.accounts.lp_vault.key(), - vault_lp_amount, - )?; - - // Everything else is automatic! - Ok(()) -} -``` - -## What's Generated Automatically - -The `CreateMintInputs` struct is populated from your constraints: - -```rust -CreateMintInputs { - compressed_mint_inputs: ..., - mint_seed: self.lp_mint.key(), - mint_bump: ..., - authority: /* from cmint::authority */, - payer: /* from cmint::payer */, - proof: /* from cmint::proof */, - address_tree: /* derived from trees */, - output_queue: /* derived from output_state_tree_index */, - actions: /* from your mint_to calls */, -} -``` - -## Key Points - -✅ **All params mapped from constraints** - No hardcoding -✅ **Explicit data flow** - Clear where each value comes from -✅ **Type safe** - Compile-time validation -✅ **Orthodox Anchor** - Follows established patterns -✅ **Automatic batching** - Everything in one CPI diff --git a/MINT_SIGNER_IMPLEMENTATION.md b/MINT_SIGNER_IMPLEMENTATION.md deleted file mode 100644 index 2d4f4dcd2c..0000000000 --- a/MINT_SIGNER_IMPLEMENTATION.md +++ /dev/null @@ -1,101 +0,0 @@ -# Mint Signer AccountInfo Implementation - -## The Issue - -You correctly identified that we were collecting the mint_signer seeds for signing but NOT adding the mint_signer AccountInfo to the CPI call. This would cause the CPI to fail because the Light Protocol expects the mint_signer account to be present. - -## The Fix - -### 1. In `exit.rs` (Code Generation) - -✅ Already correctly implemented: - -```rust -// Add mint_signer if provided -if let Some(mint_signer) = &self.#cmint_ident.mint_signer { - account_infos.push(mint_signer.clone()); -} else { - // If no explicit mint_signer provided, use the CMint account itself - account_infos.push(self.#cmint_ident.to_account_info()); -} -``` - -### 2. In `compressed_mint.rs` (Runtime Implementation) - -✅ Now fixed: - -```rust -// Build account infos for the CPI -let mut account_infos = vec![ - compressed_token_program.clone(), - compressed_token_program_cpi_authority.clone(), - authority.clone(), -]; - -// Add mint_signer if we have a CMint -if let Some(mint) = mint { - if let Some(mint_signer) = &mint.mint_signer { - account_infos.push(mint_signer.clone()); - } else { - // If no explicit mint_signer provided, use the CMint account itself - account_infos.push(mint.to_account_info()); - } -} - -account_infos.extend([ - payer.clone(), - system_program.clone(), -]); -``` - -## Complete Flow - -1. **Account Definition**: User defines mint_signer with seeds - - ```rust - #[account(seeds = [...], bump)] - pub lp_mint_signer: UncheckedAccount<'info>, - - #[account(cmint::mint_signer = lp_mint_signer)] - pub lp_mint: CMint<'info>, - ``` - -2. **Seeds Auto-Extraction**: The macro extracts seeds from `lp_mint_signer` - -3. **AccountInfo Storage**: The mint_signer AccountInfo is stored in CMint struct - - ```rust - pub struct CMint<'info> { - pub mint_signer: Option>, - pub mint_signer_seeds: Option>>, - pub mint_signer_bump: Option, - // ... - } - ``` - -4. **CPI Invocation**: Both AccountInfo AND seeds are used - - AccountInfo added to `account_infos` array for the CPI - - Seeds used in `signer_seeds` for `invoke_signed` - -## Why Both Are Needed - -- **AccountInfo**: Required by the CPI instruction to identify the account -- **Seeds**: Required for signing the transaction with `invoke_signed` - -The Light Protocol's `create_mint_action_cpi` expects: - -1. The mint_signer account to be present in the accounts array -2. The seeds to sign the transaction (proving authority over the PDA) - -## Account Order for CPI - -The expected account order is: - -1. compressed_token_program -2. compressed_token_program_cpi_authority -3. authority -4. **mint_signer** (if CMint present) -5. payer -6. system_program -7. CPDA accounts (if any) -8. Recipient accounts for mint actions diff --git a/UPDATE_CALLER_PROGRAM.md b/UPDATE_CALLER_PROGRAM.md deleted file mode 100644 index c19eda4585..0000000000 --- a/UPDATE_CALLER_PROGRAM.md +++ /dev/null @@ -1,143 +0,0 @@ -# How to Update Your Caller Program - -## The New Constraint System - -We now use explicit instruction data mapping with `cpda::` and `cmint::` constraints, following Anchor's `#[instruction(...)]` pattern. - -## Step 1: Update Your Accounts Struct - -```rust -#[derive(Accounts)] -#[instruction(params: InitializeCompressionParams)] // Add this! -pub struct Initialize<'info> { - #[account(mut)] - pub creator: Signer<'info>, - - // ... other accounts ... - - // For compressed PDAs, use cpda:: constraints - #[account( - init, - seeds = [ - POOL_SEED.as_bytes(), - amm_config.key().as_ref(), - token_0_mint.key().as_ref(), - token_1_mint.key().as_ref(), - ], - bump, - payer = creator, - space = PoolState::INIT_SPACE, - cpda::address_tree_info = params.pool_address_tree_info, - cpda::proof = params.proof, - )] - pub pool_state: Box>, - - #[account( - init, - seeds = [ - OBSERVATION_SEED.as_bytes(), - pool_state.key().as_ref(), - ], - bump, - payer = creator, - space = ObservationState::INIT_SPACE, - cpda::address_tree_info = params.observation_address_tree_info, - cpda::proof = params.proof, - )] - pub observation_state: Box>, - - // For compressed mints, use cmint:: constraints - #[account( - cmint::authority = authority.key(), - cmint::decimals = 9, - cmint::payer = creator, - cmint::mint_signer = lp_mint_signer, - cmint::address_tree_info = params.lp_mint_address_tree_info, - cmint::proof = params.proof, - )] - pub lp_mint: CMint<'info>, - - // ... rest of accounts ... -} -``` - -## Step 2: Update Your Instruction Handler - -```rust -pub fn initialize<'info>( - ctx: Context<'_, '_, '_, 'info, Initialize<'info>>, - params: InitializeCompressionParams, // Now just one param struct -) -> Result<()> { - // ... your logic ... - - // Queue mint actions (batched automatically) - ctx.accounts.lp_mint.mint_to( - &ctx.accounts.creator_lp_token.key(), - user_lp_amount, - )?; - - ctx.accounts.lp_mint.mint_to( - &ctx.accounts.lp_vault.key(), - vault_lp_amount, - )?; - - // Remove all manual compression code - it's automatic now! - // No need for: - // - compress_pool_and_observation_pdas() - // - create_and_mint_lp() - // - pool_state.close() - // - observation_state.close() - - Ok(()) -} -``` - -## Step 3: Keep Your InitializeCompressionParams - -Your existing struct is perfect: - -```rust -#[derive(AnchorSerialize, AnchorDeserialize, Debug)] -pub struct InitializeCompressionParams { - // Standard params - pub init_amount_0: u64, - pub init_amount_1: u64, - pub open_time: u64, - - // CPDA params - pub pool_address_tree_info: PackedAddressTreeInfo, - pub observation_address_tree_info: PackedAddressTreeInfo, - - // CMint params - pub lp_mint_address_tree_info: PackedAddressTreeInfo, - pub lp_mint_bump: u8, - pub creator_lp_token_bump: u8, - - // Shared - pub proof: ValidityProof, - pub output_state_tree_index: u8, -} -``` - -## What's Automatic Now - -1. **CPDA Compression**: Accounts with `cpda::` constraints are automatically compressed -2. **CMint Creation**: The compressed mint is created with all queued actions -3. **Batched CPI**: Everything happens in one `invoke_signed` at the end -4. **Auto-close**: CPDA accounts are automatically closed after compression - -## Required Accounts - -Make sure you still have these accounts (detected by name): - -- `compression_config` -- `compressed_token_program` -- `compressed_token_program_cpi_authority` -- `rent_recipient` - -## Benefits - -- **Cleaner Code**: Remove all manual compression logic -- **Type Safety**: Anchor validates everything at compile time -- **Orthodox Anchor**: Follows established patterns perfectly -- **Explicit Intent**: Clear data flow from instruction params to constraints diff --git a/lang/syn/src/codegen/accounts/exit.rs b/lang/syn/src/codegen/accounts/exit.rs index eba6f5d873..1914536abf 100644 --- a/lang/syn/src/codegen/accounts/exit.rs +++ b/lang/syn/src/codegen/accounts/exit.rs @@ -66,19 +66,21 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { .collect(); // Scan for CPDA Account fields and CMints to assign indices - let mut cpda_fields = Vec::new(); + // Separate CPDA fields by whether they have compress_on_init or not + let mut cpda_compress_on_init_fields = Vec::new(); + let mut cpda_empty_fields = Vec::new(); let mut cmint_field = None; for af in &accs.fields { if let AccountField::Field(f) = af { // Check if this is a CPDA Account - // TODO: add support for compressible flag if let Some(cpda) = &f.constraints.cpda { - // if cpda.compressible { - // panic!("CPDA Account fields with compressible flag are not yet supported"); - // } if cpda.compress_on_init { - cpda_fields.push(&f.ident); + // Will use prepare_accounts_for_compression_on_init + cpda_compress_on_init_fields.push(&f.ident); + } else { + // Default: will use prepare_empty_compressed_accounts_on_init + cpda_empty_fields.push(&f.ident); } } else if matches!(&f.ty, Ty::CMint(_)) { if cmint_field.is_none() { @@ -88,8 +90,10 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { } } - // Use CPDA fields for processing - let fields_to_process = &cpda_fields; + // Combine both for total count and processing + let mut all_cpda_fields = Vec::new(); + all_cpda_fields.extend(&cpda_compress_on_init_fields); + all_cpda_fields.extend(&cpda_empty_fields); // Find the first Signer field to use as fee payer let fee_payer_ident = accs.fields.iter().find_map(|af| { @@ -183,7 +187,7 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { }) }); - let compressed_finalize = if (!fields_to_process.is_empty() || cmint_field.is_some()) + let compressed_finalize = if (!all_cpda_fields.is_empty() || cmint_field.is_some()) && (cmint_payer.is_some() || fee_payer_ident.is_some()) && has_all_required { use quote::format_ident; @@ -203,7 +207,8 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { let mut compress_blocks: Vec = Vec::new(); let mut new_address_params_idents: Vec = Vec::new(); - for (index, ident) in fields_to_process.iter().enumerate() { + // Process all CPDA fields (both compress_on_init and empty) + for (index, ident) in all_cpda_fields.iter().enumerate() { let idx_lit = index as u8; // Resolve the account type for generic prepare function @@ -247,8 +252,13 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { let compressed_infos_ident = format_ident!("{}_compressed_infos", ident); new_address_params_idents.push(quote! { #new_addr_params_ident }); - // Use prepare_accounts_for_compression_on_init for CPDA fields - let prepare_fn = quote! { prepare_accounts_for_compression_on_init }; + // Choose prepare function based on compress_on_init flag + let is_compress_on_init = cpda_compress_on_init_fields.contains(ident); + let prepare_fn = if is_compress_on_init { + quote! { prepare_accounts_for_compression_on_init } + } else { + quote! { prepare_empty_compressed_accounts_on_init } + }; // Get constraint expressions from CPDA including authority let (address_tree_info_expr, proof_expr, output_tree_expr, cpda_authority_expr) = accs.fields.iter().find_map(|af| { @@ -297,14 +307,12 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { &[#new_addr_params_ident], &[#output_tree_expr], &cpi_accounts, - &address_space, - &self.rent_recipient, )?; all_compressed_infos.extend(#compressed_infos_ident); }); } - let compressible_count = fields_to_process.len() as u8; + let compressible_count = all_cpda_fields.len() as u8; let cmint_index = if cmint_field.is_some() { quote! { Some(#compressible_count) } } else { @@ -326,7 +334,7 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { }); - // Build expressions from constraints or fallback to instruction data + // Build expressions from constraints - these should be auto-detected now let cmint_proof_expr = cmint_constraints .and_then(|c| c.proof.as_ref()) .map(|e| quote! { #e }) @@ -340,7 +348,7 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { let cmint_output_tree_expr = cmint_constraints .and_then(|c| c.output_state_tree_index.as_ref()) .map(|e| quote! { #e }) - .unwrap_or_else(|| quote! { panic!("CMint output_state_tree_index constraint is required") }); + .unwrap_or_else(|| quote! { 0u8 }); // Default to 0 if not specified let cmint_authority_expr = cmint_constraints .and_then(|c| c.authority.as_ref()) @@ -350,6 +358,24 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { }}) .unwrap_or_else(|| quote! { self.authority.key() }); + // Mint authority defaults to regular authority if not specified + let cmint_mint_authority_expr = cmint_constraints + .and_then(|c| c.mint_authority.as_ref()) + .map(|e| quote! { { + let __mint_auth = &self.#e; + __mint_auth.key() + }}) + .unwrap_or_else(|| cmint_authority_expr.clone()); + + // Freeze authority defaults to regular authority if not specified + let cmint_freeze_authority_expr = cmint_constraints + .and_then(|c| c.freeze_authority.as_ref()) + .map(|e| quote! { { + let __freeze_auth = &self.#e; + __freeze_auth.key() + }}) + .unwrap_or_else(|| cmint_authority_expr.clone()); + let cmint_payer_expr = cmint_constraints .and_then(|c| c.payer.as_ref()) .map(|e| quote! { { @@ -370,15 +396,15 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { .map(|signer_field| quote! { _bumps.#signer_field }) .unwrap_or_else(|| quote! { panic!("mint_signer constraint is required for CMint") }); - // Check if we have compressed PDAs that need authority signing - let has_compress_on_init = !fields_to_process.is_empty(); + // Check if we have ANY compressed PDAs that need authority signing + let has_any_cpda = !all_cpda_fields.is_empty(); // Collect all unique authorities and their seeds - // Each CPDA MUST have an explicit authority when using compress_on_init + // ALL CPDAs MUST have an explicit authority for compression let mut authority_expr = None; - // Check that all compress_on_init CPDAs have an explicit authority - for ident in fields_to_process.iter() { + // Check that ALL CPDAs have an explicit authority (not just compress_on_init) + for ident in all_cpda_fields.iter() { if let Some(cpda) = accs.fields.iter().find_map(|af| { if let AccountField::Field(field) = af { if &field.ident == *ident { @@ -388,10 +414,10 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { None }) { if cpda.authority.is_none() { - // Compile-time panic if compress_on_init without authority + // Compile-time panic if CPDA without authority panic!( - "CPDA field '{}' has compress_on_init but no cpda::authority constraint. \ - All compress_on_init CPDAs must explicitly specify their authority.", + "CPDA field '{}' has no cpda::authority constraint. \ + All CPDAs must explicitly specify their authority for compression operations.", ident ); } @@ -512,8 +538,8 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { mint_compressed_address, root_index, self.#cmint_ident.decimals.unwrap_or(9), - Some(#cmint_authority_expr.into()), - Some(#cmint_authority_expr.into()), + Some(#cmint_mint_authority_expr.into()), + Some(#cmint_freeze_authority_expr.into()), self.#cmint_ident.key().into(), ); // Build actions @@ -601,12 +627,12 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { // Build authority seeds for compressed PDA operations let mut auth_seeds_vec: Vec<&[u8]> = Vec::new(); - let has_compress_on_init = #has_compress_on_init; + let has_any_cpda = #has_any_cpda; // Declare auth_bump_array at this scope so it lives long enough let auth_bump_array; - if has_compress_on_init { + if has_any_cpda { // Build authority seeds from the actual PDA definition #authority_seeds_setup // Use the authority seeds we built from the actual PDA definition @@ -701,20 +727,10 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { quote! {} }; - // Generate auto-close for CPDA fields with compress_on_init - let compress_on_init_fields: Vec<_> = accs.fields.iter().filter_map(|af| { - if let AccountField::Field(f) = af { - if let Some(cpda) = &f.constraints.cpda { - if cpda.compress_on_init { - return Some(&f.ident); - } - } - } - None - }).collect(); - - let auto_close_block = if !compress_on_init_fields.is_empty() { - let close_statements: Vec<_> = compress_on_init_fields.iter().map(|ident| { + // Generate auto-close ONLY for CPDA fields with compress_on_init + // (not for default empty compressed accounts) + let auto_close_block = if !cpda_compress_on_init_fields.is_empty() { + let close_statements: Vec<_> = cpda_compress_on_init_fields.iter().map(|ident| { quote! { self.#ident.close(self.rent_recipient.clone())?; } diff --git a/lang/syn/src/lib.rs b/lang/syn/src/lib.rs index 34bb3e1c36..6be451fb3b 100644 --- a/lang/syn/src/lib.rs +++ b/lang/syn/src/lib.rs @@ -806,6 +806,8 @@ pub enum ConstraintToken { ExtensionPermanentDelegate(Context), // CMint constraints CMintAuthority(Context), + CMintMintAuthority(Context), + CMintFreezeAuthority(Context), CMintPayer(Context), CMintDecimals(Context), CMintSigner(Context), @@ -1096,6 +1098,16 @@ pub struct ConstraintCMintAuthority { pub authority: Expr, } +#[derive(Debug, Clone)] +pub struct ConstraintCMintMintAuthority { + pub mint_authority: Expr, +} + +#[derive(Debug, Clone)] +pub struct ConstraintCMintFreezeAuthority { + pub freeze_authority: Expr, +} + #[derive(Debug, Clone)] pub struct ConstraintCMintPayer { pub payer: Expr, @@ -1136,11 +1148,16 @@ pub struct ConstraintCMintAddressTreeInfo { pub address_tree_info: Expr, } +/// CMint proof constraint. +/// Auto-detected from instruction parameters if not explicitly specified. +/// Fails at compile time if multiple proofs exist and none specified. #[derive(Debug, Clone)] pub struct ConstraintCMintProof { pub proof: Expr, } +/// CMint output state tree index constraint. +/// Defaults to 0 if not explicitly specified. #[derive(Debug, Clone)] pub struct ConstraintCMintOutputStateTreeIndex { pub output_state_tree_index: Expr, @@ -1149,6 +1166,8 @@ pub struct ConstraintCMintOutputStateTreeIndex { #[derive(Debug, Clone)] pub struct ConstraintCMintGroup { pub authority: Option, + pub mint_authority: Option, // Optional mint authority, defaults to authority + pub freeze_authority: Option, // Optional freeze authority, defaults to authority pub decimals: Option, pub payer: Option, pub mint_signer: Option, @@ -1180,11 +1199,16 @@ pub struct ConstraintCPDAAddressTreeInfo { pub address_tree_info: Expr, } +/// CPDA proof constraint. +/// Auto-detected from instruction parameters if not explicitly specified. +/// Fails at compile time if multiple proofs exist and none specified. #[derive(Debug, Clone)] pub struct ConstraintCPDAProof { pub proof: Expr, } +/// CPDA output state tree index constraint. +/// Defaults to 0 if not explicitly specified. #[derive(Debug, Clone)] pub struct ConstraintCPDAOutputStateTreeIndex { pub output_state_tree_index: Expr, diff --git a/lang/syn/src/parser/accounts/constraints.rs b/lang/syn/src/parser/accounts/constraints.rs index c4e52e8af6..86f72fe4d5 100644 --- a/lang/syn/src/parser/accounts/constraints.rs +++ b/lang/syn/src/parser/accounts/constraints.rs @@ -3,7 +3,16 @@ use syn::parse::{Error as ParseError, Result as ParseResult}; use syn::{bracketed, Token}; pub fn parse(f: &syn::Field, f_ty: Option<&Ty>) -> ParseResult { + parse_with_instruction(f, f_ty, &None) +} + +pub fn parse_with_instruction( + f: &syn::Field, + f_ty: Option<&Ty>, + instruction_api: &Option>, +) -> ParseResult { let mut constraints = ConstraintGroupBuilder::new(f_ty); + constraints.set_instruction_api(instruction_api.clone()); for attr in f.attrs.iter().filter(is_account) { for c in attr.parse_args_with(Punctuated::::parse_terminated)? { constraints.add(c)?; @@ -371,6 +380,18 @@ pub fn parse_token(stream: ParseStream) -> ParseResult { authority: stream.parse()?, }, )), + "mint_authority" => ConstraintToken::CMintMintAuthority(Context::new( + span, + ConstraintCMintMintAuthority { + mint_authority: stream.parse()?, + }, + )), + "freeze_authority" => ConstraintToken::CMintFreezeAuthority(Context::new( + span, + ConstraintCMintFreezeAuthority { + freeze_authority: stream.parse()?, + }, + )), "payer" => ConstraintToken::CMintPayer(Context::new( span, ConstraintCMintPayer { @@ -648,6 +669,7 @@ fn parse_optional_custom_error(stream: &ParseStream) -> ParseResult #[derive(Default)] pub struct ConstraintGroupBuilder<'ty> { pub f_ty: Option<&'ty Ty>, + pub instruction_api: Option>, pub init: Option>, pub zeroed: Option>, pub mutable: Option>, @@ -693,6 +715,8 @@ pub struct ConstraintGroupBuilder<'ty> { pub realloc_zero: Option>, // CMint constraints pub cmint_authority: Option>, + pub cmint_mint_authority: Option>, + pub cmint_freeze_authority: Option>, pub cmint_payer: Option>, pub cmint_decimals: Option>, pub cmint_signer: Option>, @@ -715,6 +739,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { pub fn new(f_ty: Option<&'ty Ty>) -> Self { Self { f_ty, + instruction_api: None, init: None, zeroed: None, mutable: None, @@ -756,6 +781,8 @@ impl<'ty> ConstraintGroupBuilder<'ty> { realloc_payer: None, realloc_zero: None, cmint_authority: None, + cmint_mint_authority: None, + cmint_freeze_authority: None, cmint_payer: None, cmint_decimals: None, cmint_signer: None, @@ -773,6 +800,202 @@ impl<'ty> ConstraintGroupBuilder<'ty> { cpda_compress_on_init: None, } } + + pub fn set_instruction_api(&mut self, instruction_api: Option>) { + self.instruction_api = instruction_api; + } + + fn auto_detect_compression_fields(&mut self) -> ParseResult<()> { + // Only auto-detect if instruction data is available + let instruction_api = match &self.instruction_api { + Some(api) => api, + None => return Ok(()), + }; + + // Helper to find a field in instruction parameters that contains a specific nested field + let find_field_with_nested = |nested_field_name: &str| -> Option<(String, String)> { + for expr in instruction_api.iter() { + if let Expr::Type(expr_type) = expr { + let field_str = quote::quote! { #expr_type }.to_string(); + // Parse pattern like "compression_params : InitializeCompressionParams" + let parts: Vec<&str> = field_str.split(" : ").collect(); + if parts.len() == 2 { + let param_name = parts[0].trim(); + // Check if this could be a struct containing our nested field + // We look for common patterns in the type name + let type_name = parts[1].trim(); + if type_name.contains("Compression") || type_name.contains("Params") { + // Found a potential compression params struct + return Some((param_name.to_string(), nested_field_name.to_string())); + } + } + } + } + None + }; + + // Helper to find ValidityProof field directly - returns Result to handle multiple proofs + let find_validity_proof_field = || -> ParseResult> { + let mut found_proofs = Vec::new(); + + // First, look for direct ValidityProof fields + for expr in instruction_api.iter() { + if let Expr::Type(expr_type) = expr { + let field_str = quote::quote! { #expr_type }.to_string(); + let parts: Vec<&str> = field_str.split(" : ").collect(); + if parts.len() == 2 { + let param_name = parts[0].trim(); + let type_name = parts[1].trim(); + // Check if this is a ValidityProof type + if type_name == "ValidityProof" || type_name.ends_with("::ValidityProof") { + found_proofs.push(param_name.to_string()); + } + } + } + } + + // If no direct ValidityProof, look for it in a compression params struct + if found_proofs.is_empty() { + if let Some((param, field)) = find_field_with_nested("proof") { + found_proofs.push(format!("{}.{}", param, field)); + } + } + + // Check for ambiguity + match found_proofs.len() { + 0 => Ok(None), + 1 => Ok(Some(found_proofs[0].clone())), + _ => { + // Multiple proofs found - require explicit specification + Err(ParseError::new( + proc_macro2::Span::call_site(), + format!( + "Multiple ValidityProof fields found in instruction parameters: {}. \ + Please explicitly specify the proof constraint (e.g., cpda::proof = compression_params.proof)", + found_proofs.join(", ") + ) + )) + } + } + }; + + // Auto-detect for CPDA constraints if we have CPDA fields but missing some + let has_cpda = self.cpda_authority.is_some() || + self.cpda_address_tree_info.is_some() || + self.cpda_output_state_tree_index.is_some() || + self.cpda_compress_on_init.is_some(); + + if has_cpda { + // Auto-detect proof if not explicitly set + if self.cpda_proof.is_none() { + match find_validity_proof_field()? { + Some(proof_field) => { + let proof_expr: Expr = syn::parse_str(&proof_field) + .map_err(|_| ParseError::new( + proc_macro2::Span::call_site(), + format!("Failed to parse auto-detected proof field: {}", proof_field) + ))?; + self.cpda_proof = Some(Context::new( + proc_macro2::Span::call_site(), + ConstraintCPDAProof { proof: proof_expr } + )); + } + None => { + // No proof found - this is an error for CPDA + return Err(ParseError::new( + proc_macro2::Span::call_site(), + "CPDA constraints require a proof field. Either add 'cpda::proof = ' \ + or ensure your instruction has a ValidityProof parameter." + )); + } + } + } + + // Default output_state_tree_index to 0 if not explicitly set + if self.cpda_output_state_tree_index.is_none() { + let default_index: Expr = syn::parse_str("0") + .expect("Failed to parse default output_state_tree_index"); + self.cpda_output_state_tree_index = Some(Context::new( + proc_macro2::Span::call_site(), + ConstraintCPDAOutputStateTreeIndex { output_state_tree_index: default_index } + )); + } + + // Auto-detect other fields if patterns are found + // Look for fields that match common patterns + for expr in instruction_api.iter() { + if let Expr::Type(expr_type) = expr { + let field_str = quote::quote! { #expr_type }.to_string(); + let parts: Vec<&str> = field_str.split(" : ").collect(); + if parts.len() == 2 { + let param_name = parts[0].trim(); + let type_name = parts[1].trim(); + + // Auto-detect address_tree_info + if self.cpda_address_tree_info.is_none() && + (type_name.contains("AddressTreeInfo") || type_name.contains("PackedAddressTreeInfo")) { + let field_expr: Expr = syn::parse_str(param_name) + .map_err(|_| ParseError::new( + proc_macro2::Span::call_site(), + format!("Failed to parse auto-detected address_tree_info: {}", param_name) + ))?; + self.cpda_address_tree_info = Some(Context::new( + proc_macro2::Span::call_site(), + ConstraintCPDAAddressTreeInfo { address_tree_info: field_expr } + )); + } + } + } + } + } + + // Similar auto-detection for CMint constraints + let has_cmint = self.cmint_authority.is_some() || + self.cmint_payer.is_some() || + self.cmint_decimals.is_some() || + self.cmint_signer.is_some() || + self.cmint_address_tree_info.is_some() || + self.cmint_output_state_tree_index.is_some(); + + if has_cmint { + // Auto-detect proof if not explicitly set + if self.cmint_proof.is_none() { + match find_validity_proof_field()? { + Some(proof_field) => { + let proof_expr: Expr = syn::parse_str(&proof_field) + .map_err(|_| ParseError::new( + proc_macro2::Span::call_site(), + format!("Failed to parse auto-detected proof field for CMint: {}", proof_field) + ))?; + self.cmint_proof = Some(Context::new( + proc_macro2::Span::call_site(), + ConstraintCMintProof { proof: proof_expr } + )); + } + None => { + // No proof found - this is an error for CMint + return Err(ParseError::new( + proc_macro2::Span::call_site(), + "CMint constraints require a proof field. Either add 'cmint::proof = ' \ + or ensure your instruction has a ValidityProof parameter." + )); + } + } + } + + // Default output_state_tree_index to 0 if not explicitly set + if self.cmint_output_state_tree_index.is_none() { + let default_index: Expr = syn::parse_str("0") + .expect("Failed to parse default output_state_tree_index"); + self.cmint_output_state_tree_index = Some(Context::new( + proc_macro2::Span::call_site(), + ConstraintCMintOutputStateTreeIndex { output_state_tree_index: default_index } + )); + } + } + + Ok(()) + } pub fn build(mut self) -> ParseResult { // Init. @@ -954,8 +1177,12 @@ impl<'ty> ConstraintGroupBuilder<'ty> { } } + // Auto-detect compression fields from instruction data if not explicitly provided + self.auto_detect_compression_fields()?; + let ConstraintGroupBuilder { f_ty: _, + instruction_api: _, init, zeroed, mutable, @@ -997,6 +1224,8 @@ impl<'ty> ConstraintGroupBuilder<'ty> { realloc_payer, realloc_zero, cmint_authority, + cmint_mint_authority, + cmint_freeze_authority, cmint_payer, cmint_decimals, cmint_signer, @@ -1249,7 +1478,8 @@ impl<'ty> ConstraintGroupBuilder<'ty> { seeds, token_account: if !is_init {token_account} else {None}, mint: if !is_init {mint} else {None}, - cmint: if cmint_authority.is_some() || cmint_payer.is_some() || cmint_decimals.is_some() || + cmint: if cmint_authority.is_some() || cmint_mint_authority.is_some() || + cmint_freeze_authority.is_some() || cmint_payer.is_some() || cmint_decimals.is_some() || cmint_signer.is_some() || cmint_signer_seeds.is_some() || cmint_signer_bump.is_some() || cmint_program_authority_seeds.is_some() || cmint_program_authority_bump.is_some() || @@ -1257,6 +1487,8 @@ impl<'ty> ConstraintGroupBuilder<'ty> { cmint_output_state_tree_index.is_some() { Some(ConstraintCMintGroup { authority: cmint_authority.map(|c| c.into_inner().authority), + mint_authority: cmint_mint_authority.map(|c| c.into_inner().mint_authority), + freeze_authority: cmint_freeze_authority.map(|c| c.into_inner().freeze_authority), decimals: cmint_decimals.map(|c| c.into_inner().decimals), payer: cmint_payer.map(|c| c.into_inner().payer), mint_signer: cmint_signer.map(|c| c.into_inner().signer), @@ -1347,6 +1579,8 @@ impl<'ty> ConstraintGroupBuilder<'ty> { self.add_extension_permanent_delegate(c) } ConstraintToken::CMintAuthority(c) => self.add_cmint_authority(c), + ConstraintToken::CMintMintAuthority(c) => self.add_cmint_mint_authority(c), + ConstraintToken::CMintFreezeAuthority(c) => self.add_cmint_freeze_authority(c), ConstraintToken::CMintPayer(c) => self.add_cmint_payer(c), ConstraintToken::CMintDecimals(c) => self.add_cmint_decimals(c), ConstraintToken::CMintSigner(c) => self.add_cmint_signer(c), @@ -1731,6 +1965,22 @@ impl<'ty> ConstraintGroupBuilder<'ty> { Ok(()) } + fn add_cmint_mint_authority(&mut self, c: Context) -> ParseResult<()> { + if self.cmint_mint_authority.is_some() { + return Err(ParseError::new(c.span(), "cmint mint_authority already provided")); + } + self.cmint_mint_authority.replace(c); + Ok(()) + } + + fn add_cmint_freeze_authority(&mut self, c: Context) -> ParseResult<()> { + if self.cmint_freeze_authority.is_some() { + return Err(ParseError::new(c.span(), "cmint freeze_authority already provided")); + } + self.cmint_freeze_authority.replace(c); + Ok(()) + } + fn add_cmint_payer(&mut self, c: Context) -> ParseResult<()> { if self.cmint_payer.is_some() { return Err(ParseError::new(c.span(), "cmint payer already provided")); diff --git a/lang/syn/src/parser/accounts/mod.rs b/lang/syn/src/parser/accounts/mod.rs index ece154a5f0..0745fc2ca7 100644 --- a/lang/syn/src/parser/accounts/mod.rs +++ b/lang/syn/src/parser/accounts/mod.rs @@ -39,7 +39,7 @@ pub fn parse(accounts_struct: &syn::ItemStruct) -> ParseResult { syn::Fields::Named(fields) => fields .named .iter() - .map(parse_account_field) + .map(|f| parse_account_field_with_instruction(f, &instruction_api)) .collect::>>()?, _ => { return Err(ParseError::new_spanned( @@ -291,12 +291,20 @@ fn constraints_cross_checks(fields: &[AccountField]) -> ParseResult<()> { } pub fn parse_account_field(f: &syn::Field) -> ParseResult { + parse_account_field_with_instruction(f, &None) +} + +pub fn parse_account_field_with_instruction( + f: &syn::Field, + instruction_api: &Option>, +) -> ParseResult { let ident = f.ident.clone().unwrap(); let docs = docs::parse(&f.attrs); let account_field = match is_field_primitive(f)? { true => { let (ty, is_optional) = parse_ty(f)?; - let account_constraints = constraints::parse(f, Some(&ty))?; + let account_constraints = + constraints::parse_with_instruction(f, Some(&ty), instruction_api)?; AccountField::Field(Field { ident, ty, @@ -313,7 +321,8 @@ pub fn parse_account_field(f: &syn::Field) -> ParseResult { "Cannot have Optional composite accounts", )); } - let account_constraints = constraints::parse(f, None)?; + let account_constraints = + constraints::parse_with_instruction(f, None, instruction_api)?; AccountField::CompositeField(CompositeField { ident, constraints: account_constraints, From 8f4e49a60401fa2c83061d09bc131deee21f5e96 Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Wed, 8 Oct 2025 22:15:46 -0400 Subject: [PATCH 07/20] wip --- lang/src/accounts/boxed.rs | 2 +- lang/src/accounts/interface_account.rs | 65 +- lang/src/accounts/option.rs | 8 +- lang/src/lib.rs | 8 +- lang/syn/src/codegen/accounts/constraints.rs | 77 ++- lang/syn/src/codegen/accounts/exit.rs | 174 +++-- lang/syn/src/codegen/accounts/try_accounts.rs | 154 ++++- lang/syn/src/codegen/program/handlers.rs | 2 +- lang/syn/src/lib.rs | 99 ++- lang/syn/src/parser/accounts/constraints.rs | 626 +++++++++++------- 10 files changed, 873 insertions(+), 342 deletions(-) diff --git a/lang/src/accounts/boxed.rs b/lang/src/accounts/boxed.rs index 1e55e8b080..b885af321e 100644 --- a/lang/src/accounts/boxed.rs +++ b/lang/src/accounts/boxed.rs @@ -46,7 +46,7 @@ impl<'info, T: ToAccountInfos<'info>> ToAccountInfos<'info> for Box { impl<'info, B, T: crate::AccountsFinalize<'info, B>> crate::AccountsFinalize<'info, B> for Box { fn finalize( - &self, + &mut self, program_id: &Pubkey, remaining_accounts: &[AccountInfo<'info>], ix_data: &[u8], diff --git a/lang/src/accounts/interface_account.rs b/lang/src/accounts/interface_account.rs index 56121c2dab..cd208e4c64 100644 --- a/lang/src/accounts/interface_account.rs +++ b/lang/src/accounts/interface_account.rs @@ -237,6 +237,43 @@ impl<'a, T: AccountSerialize + AccountDeserialize + CheckOwner + Clone> Interfac let mut data: &[u8] = &info.try_borrow_data()?; Ok(Self::new(info, T::try_deserialize_unchecked(&mut data)?)) } + + /// Creates an `InterfaceAccount` for CToken compressed accounts without deserializing. + /// This is used when the account data is compressed off-chain. + /// Verifies the account is NOT initialized on-chain (CToken mints don't exist on-chain). + #[inline(never)] + pub fn try_from_ctoken(info: &'a AccountInfo<'a>) -> Result + where + T: Default, + { + + if info.owner != &system_program::ID { + return Err(ErrorCode::AccountOwnedByWrongProgram.into()); + } + + let data = info.try_borrow_data()?; + if data.len() != 0 { + return Err(ErrorCode::AccountOwnedByWrongProgram.into()); + } + + + Ok(Self::new(info, T::default())) + } + + /// Deserializes based on runtime token_program value. + /// If token_program is CTOKEN_ID, treats as CToken (uninitialized). + /// Otherwise, deserializes as regular SPL/Token2022 mint. + #[inline(never)] + pub fn try_from_with_token_program(info: &'a AccountInfo<'a>, token_program: &Pubkey) -> Result + where + T: Default, + { + if token_program == &crate::CTOKEN_ID { + Self::try_from_ctoken(info) + } else { + Self::try_from(info) + } + } } impl<'info, B, T: AccountSerialize + AccountDeserialize + CheckOwner + Clone> Accounts<'info, B> @@ -310,16 +347,40 @@ impl AsRef for InterfaceAcc } } -impl Deref for InterfaceAccount<'_, T> { +impl Deref for InterfaceAccount<'_, T> { type Target = T; fn deref(&self) -> &Self::Target { + // Special check for Mint types with CToken program + #[cfg(feature = "spl-token")] + { + use std::any::TypeId; + // Check if T is Mint and this is a CToken mint (uninitialized account) + if TypeId::of::() == TypeId::of::() { + // CToken mints have owner = system_program (since they're uninitialized) + if self.account.info.owner == &system_program::ID { + panic!("Cannot access mint data for CToken accounts - data is compressed off-chain! Only use the account's pubkey."); + } + } + } self.account.deref() } } -impl DerefMut for InterfaceAccount<'_, T> { +impl DerefMut for InterfaceAccount<'_, T> { fn deref_mut(&mut self) -> &mut Self::Target { + // Special check for Mint types with CToken program + #[cfg(feature = "spl-token")] + { + use std::any::TypeId; + // Check if T is Mint and this is a CToken mint (uninitialized account) + if TypeId::of::() == TypeId::of::() { + // CToken mints have owner = system_program (since they're uninitialized) + if self.account.info.owner == &system_program::ID { + panic!("Cannot mutate mint data for CToken accounts - data is compressed off-chain!"); + } + } + } self.account.deref_mut() } } diff --git a/lang/src/accounts/option.rs b/lang/src/accounts/option.rs index e2054f66d7..0f864f5018 100644 --- a/lang/src/accounts/option.rs +++ b/lang/src/accounts/option.rs @@ -62,15 +62,17 @@ impl<'info, T: ToAccountInfos<'info>> ToAccountInfos<'info> for Option { } } -impl<'info, B, T: crate::AccountsFinalize<'info, B>> crate::AccountsFinalize<'info, B> for Option { +impl<'info, B, T: crate::AccountsFinalize<'info, B>> crate::AccountsFinalize<'info, B> + for Option +{ fn finalize( - &self, + &mut self, program_id: &Pubkey, remaining_accounts: &[AccountInfo<'info>], ix_data: &[u8], bumps: &B, ) -> Result<()> { - if let Some(account) = self { + if let Some(account) = self.as_mut() { account.finalize(program_id, remaining_accounts, ix_data, bumps)?; } Ok(()) diff --git a/lang/src/lib.rs b/lang/src/lib.rs index aee8f72f7e..1c81779e02 100644 --- a/lang/src/lib.rs +++ b/lang/src/lib.rs @@ -32,6 +32,12 @@ use solana_program::program_error::ProgramError; use solana_program::pubkey::Pubkey; use std::{collections::BTreeSet, fmt::Debug, io::Write}; +// CToken Program ID constant +pub const CTOKEN_ID: Pubkey = Pubkey::new_from_array([ + 9, 21, 163, 87, 35, 121, 78, 143, 182, 93, 7, 91, 107, 114, 105, 156, 56, 221, 2, 229, 148, + 139, 117, 176, 229, 160, 65, 142, 128, 151, 91, 68, +]); + mod account_meta; pub mod accounts; mod bpf_upgradeable_state; @@ -141,7 +147,7 @@ pub trait AccountsFinalize<'info, B>: ToAccountMetas + ToAccountInfos<'info> { /// `ix_data` is the raw instruction data for the handler. /// `bumps` contains the PDA bumps calculated during account validation. fn finalize( - &self, + &mut self, _program_id: &Pubkey, _remaining_accounts: &[AccountInfo<'info>], _ix_data: &[u8], diff --git a/lang/syn/src/codegen/accounts/constraints.rs b/lang/syn/src/codegen/accounts/constraints.rs index f3839786e7..1eed429943 100644 --- a/lang/syn/src/codegen/accounts/constraints.rs +++ b/lang/syn/src/codegen/accounts/constraints.rs @@ -1326,9 +1326,30 @@ fn generate_constraint_mint( let name = &f.ident; let account_ref = generate_account_ref(f); + // Check if this is a CToken mint (token_program = CTOKEN_ID) + let is_ctoken_check = if let Some(token_program) = &c.token_program { + // Handle both account references and state field Pubkeys + let token_prog_str = quote! { #token_program }.to_string(); + if token_prog_str.contains('.') { + // State field - already a Pubkey + quote! { + let __is_ctoken = #token_program == anchor_lang::CTOKEN_ID; + } + } else { + // Account - need to call .key() + quote! { + let __is_ctoken = #token_program.key() == anchor_lang::CTOKEN_ID; + } + } + } else { + quote! { + let __is_ctoken = false; + } + }; + let decimal_check = match &c.decimals { Some(decimals) => quote! { - if #name.decimals != #decimals { + if !__is_ctoken && #name.decimals != #decimals { return Err(anchor_lang::error::ErrorCode::ConstraintMintDecimals.into()); } }, @@ -1340,7 +1361,7 @@ fn generate_constraint_mint( let mint_authority_optional_check = optional_check_scope.generate_check(mint_authority); quote! { #mint_authority_optional_check - if #name.mint_authority != anchor_lang::solana_program::program_option::COption::Some(#mint_authority.key()) { + if !__is_ctoken && #name.mint_authority != anchor_lang::solana_program::program_option::COption::Some(#mint_authority.key()) { return Err(anchor_lang::error::ErrorCode::ConstraintMintMintAuthority.into()); } } @@ -1353,7 +1374,7 @@ fn generate_constraint_mint( optional_check_scope.generate_check(freeze_authority); quote! { #freeze_authority_optional_check - if #name.freeze_authority != anchor_lang::solana_program::program_option::COption::Some(#freeze_authority.key()) { + if !__is_ctoken && #name.freeze_authority != anchor_lang::solana_program::program_option::COption::Some(#freeze_authority.key()) { return Err(anchor_lang::error::ErrorCode::ConstraintMintFreezeAuthority.into()); } } @@ -1363,9 +1384,28 @@ fn generate_constraint_mint( let token_program_check = match &c.token_program { Some(token_program) => { let token_program_optional_check = optional_check_scope.generate_check(token_program); + // Handle both account references and state field Pubkeys + let token_prog_str = quote! { #token_program }.to_string(); + let token_prog_key = if token_prog_str.contains('.') { + // State field - already a Pubkey + quote! { &#token_program } + } else { + // Account - need to call .key() + quote! { &#token_program.key() } + }; quote! { #token_program_optional_check - if #account_ref.owner != &#token_program.key() { return Err(anchor_lang::error::ErrorCode::ConstraintMintTokenProgram.into()); } + if __is_ctoken { + // CToken mints are uninitialized accounts owned by system_program + if #account_ref.owner != &anchor_lang::solana_program::system_program::ID { + return Err(anchor_lang::error::ErrorCode::ConstraintMintTokenProgram.into()); + } + } else { + // Regular SPL/Token2022 mints are owned by their token program + if #account_ref.owner != #token_prog_key { + return Err(anchor_lang::error::ErrorCode::ConstraintMintTokenProgram.into()); + } + } } } None => quote! {}, @@ -1553,20 +1593,29 @@ fn generate_constraint_mint( quote! { { + // Check if this is a CToken mint + #is_ctoken_check + #decimal_check #mint_authority_check #freeze_authority_check + + // Check token_program ownership (system_program for CToken, token_program for SPL/T22) #token_program_check - #group_pointer_authority_check - #group_pointer_group_address_check - #group_member_pointer_authority_check - #group_member_pointer_member_address_check - #metadata_pointer_authority_check - #metadata_pointer_metadata_address_check - #close_authority_check - #permanent_delegate_check - #transfer_hook_authority_check - #transfer_hook_program_id_check + + // Skip extension checks for CToken mints + if !__is_ctoken { + #group_pointer_authority_check + #group_pointer_group_address_check + #group_member_pointer_authority_check + #group_member_pointer_member_address_check + #metadata_pointer_authority_check + #metadata_pointer_metadata_address_check + #close_authority_check + #permanent_delegate_check + #transfer_hook_authority_check + #transfer_hook_program_id_check + } } } } diff --git a/lang/syn/src/codegen/accounts/exit.rs b/lang/syn/src/codegen/accounts/exit.rs index 1914536abf..8bdb2e7093 100644 --- a/lang/syn/src/codegen/accounts/exit.rs +++ b/lang/syn/src/codegen/accounts/exit.rs @@ -229,6 +229,8 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { }; // Handle boxed vs unboxed Account + // Generate immutable or mutable reference based on compress_on_init flag + let is_compress_on_init = cpda_compress_on_init_fields.contains(ident); let acc_expr = match accs .fields .iter() @@ -236,7 +238,21 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { AccountField::Field(f) if &f.ident == *ident => { match &f.ty { Ty::Account(account_ty) => { - if account_ty.boxed { Some(quote! { &*self.#ident }) } else { Some(quote! { &self.#ident }) } + if is_compress_on_init { + // Immutable for prepare_accounts_for_compression_on_init + if account_ty.boxed { + Some(quote! { &*self.#ident }) + } else { + Some(quote! { &self.#ident }) + } + } else { + // Mutable for prepare_empty_compressed_accounts_on_init + if account_ty.boxed { + Some(quote! { &mut *self.#ident }) + } else { + Some(quote! { &mut self.#ident }) + } + } } _ => None, } @@ -251,14 +267,6 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { let compressed_address_ident = format_ident!("{}_compressed_address", ident); let compressed_infos_ident = format_ident!("{}_compressed_infos", ident); new_address_params_idents.push(quote! { #new_addr_params_ident }); - - // Choose prepare function based on compress_on_init flag - let is_compress_on_init = cpda_compress_on_init_fields.contains(ident); - let prepare_fn = if is_compress_on_init { - quote! { prepare_accounts_for_compression_on_init } - } else { - quote! { prepare_empty_compressed_accounts_on_init } - }; // Get constraint expressions from CPDA including authority let (address_tree_info_expr, proof_expr, output_tree_expr, cpda_authority_expr) = accs.fields.iter().find_map(|af| { @@ -301,13 +309,28 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { ); // Prepare accounts for compression for #ident - let #compressed_infos_ident = light_sdk::compressible::#prepare_fn::<#acc_ty_path>( - &[#acc_expr], - &[#compressed_address_ident], - &[#new_addr_params_ident], - &[#output_tree_expr], - &cpi_accounts, - )?; + let #compressed_infos_ident = if #is_compress_on_init { + // prepare_accounts_for_compression_on_init takes &[&Account] + light_sdk::compressible::prepare_accounts_for_compression_on_init::<#acc_ty_path>( + &[#acc_expr], + &[#compressed_address_ident], + &[#new_addr_params_ident], + &[#output_tree_expr], + &cpi_accounts, + )? + } else { + // prepare_empty_compressed_accounts_on_init takes &mut [&mut Account] + // anchor_lang::solana_program::msg!("acc_expr before prepare_empty_compressed_accounts_on_init: {:?}", #acc_expr); + + light_sdk::compressible::prepare_empty_compressed_accounts_on_init::<#acc_ty_path>( + &mut [#acc_expr], + &[#compressed_address_ident], + &[#new_addr_params_ident], + &[#output_tree_expr], + &cpi_accounts, + )? + }; + // anchor_lang::solana_program::msg!("acc_expr after: {:?}", #acc_expr); all_compressed_infos.extend(#compressed_infos_ident); }); } @@ -323,7 +346,7 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { // Build mint actions extraction and mint creation block let cmint_block = if let Some(cmint_ident) = mint_ident { - // Get CMint constraints for this field + // Get CToken Mint constraints for this field let cmint_constraints = accs.fields.iter().find_map(|af| { if let AccountField::Field(f) = af { if f.ident.to_string() == cmint_ident.to_string() { @@ -358,23 +381,95 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { }}) .unwrap_or_else(|| quote! { self.authority.key() }); - // Mint authority defaults to regular authority if not specified - let cmint_mint_authority_expr = cmint_constraints - .and_then(|c| c.mint_authority.as_ref()) - .map(|e| quote! { { - let __mint_auth = &self.#e; - __mint_auth.key() - }}) - .unwrap_or_else(|| cmint_authority_expr.clone()); + // Mint authority is always the cmint::authority (required field) + let cmint_mint_authority_expr = quote! { Some(#cmint_authority_expr.into()) }; - // Freeze authority defaults to regular authority if not specified + // Freeze authority defaults to None if not specified (matching SPL behavior) let cmint_freeze_authority_expr = cmint_constraints .and_then(|c| c.freeze_authority.as_ref()) - .map(|e| quote! { { - let __freeze_auth = &self.#e; - __freeze_auth.key() - }}) - .unwrap_or_else(|| cmint_authority_expr.clone()); + .map(|e| { + // Check if explicitly set to None + let expr_str = quote! { #e }.to_string(); + if expr_str == "None" { + quote! { None } + } else { + quote! { { + let __freeze_auth = &self.#e; + Some(__freeze_auth.key().into()) + }} + } + }) + .unwrap_or_else(|| quote! { None }); + + // Metadata extension inputs (optional). Enable only if name+symbol+uri are all provided. + // These expressions can reference instruction data (e.g., metadata_name from args) + // or account fields (e.g., update_authority from accounts) + let metadata_name_expr = cmint_constraints.and_then(|c| c.metadata_name.as_ref()); + let metadata_symbol_expr = cmint_constraints.and_then(|c| c.metadata_symbol.as_ref()); + let metadata_uri_expr = cmint_constraints.and_then(|c| c.metadata_uri.as_ref()); + + // Update authority is optional - defaults to mint_authority if not specified + // Can be explicitly set to None to make metadata immutable + let metadata_update_authority_expr = cmint_constraints.and_then(|c| c.metadata_update_authority.as_ref()).map(|e| { + let expr_str = quote! { #e }.to_string(); + // Check if explicitly set to None + if expr_str == "None" { + quote! { None } + } else if expr_str.contains('.') || expr_str.contains('(') || expr_str.contains('[') { + // Complex expression - use as-is + quote! { { + let __update_auth = #e; + Some(__update_auth.into()) + }} + } else { + // Simple identifier - likely an account field, get its key + quote! { Some(self.#e.key()) } + } + }).unwrap_or_else(|| cmint_mint_authority_expr.clone()); + + let metadata_additional_expr = cmint_constraints.and_then(|c| c.metadata_additional.as_ref()); + + let build_extensions_block = if metadata_name_expr.is_some() && metadata_symbol_expr.is_some() && metadata_uri_expr.is_some() { + let name_expr = metadata_name_expr.unwrap(); + let symbol_expr = metadata_symbol_expr.unwrap(); + let uri_expr = metadata_uri_expr.unwrap(); + let additional_expr = metadata_additional_expr.map(|e| quote! { #e }).unwrap_or_else(|| quote! { None }); + + quote! { + // Build metadata extensions from instruction data or account fields + let metadata_extensions: Option> = { + // Evaluate metadata expressions (can reference instruction args or self.accounts) + let metadata_name = #name_expr; + let metadata_symbol = #symbol_expr; + let metadata_uri = #uri_expr; + let metadata_additional = #additional_expr; + + // Validate metadata size limits + if metadata_name.len() > 32 { + panic!("CMint metadata name exceeds size limit: {} bytes (max: 32 bytes).", metadata_name.len()); + } + if metadata_symbol.len() > 10 { + panic!("CMint metadata symbol exceeds size limit: {} bytes (max: 10 bytes).", metadata_symbol.len()); + } + if metadata_uri.len() > 200 { + panic!("CMint metadata uri exceeds size limit: {} bytes (max: 200 bytes).", metadata_uri.len()); + } + + let token_metadata = light_ctoken_types::instructions::extensions::TokenMetadataInstructionData { + update_authority: #metadata_update_authority_expr, + name: metadata_name, + symbol: metadata_symbol, + uri: metadata_uri, + additional_metadata: metadata_additional, + }; + Some(vec![light_ctoken_types::instructions::extensions::ExtensionInstructionData::TokenMetadata(token_metadata)]) + }; + } + } else { + quote! { + let metadata_extensions: Option> = None; + } + }; let cmint_payer_expr = cmint_constraints .and_then(|c| c.payer.as_ref()) @@ -526,21 +621,24 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { // Get tree accounts using the indices let output_state_queue = *cpi_accounts.tree_accounts().unwrap()[output_state_tree_index as usize].key; let address_tree_pubkey = *cpi_accounts.tree_accounts().unwrap()[address_tree_idx as usize].key; - + use light_compressed_token_sdk::instructions::create_compressed_mint::instruction::derive_compressed_mint_from_spl_mint; // Derive compressed mint address from SPL mint addr (self.#cmint_ident is used as SPL mint key) - let mint_compressed_address = light_compressed_token_sdk::instructions::derive_compressed_mint_from_spl_mint( + let mint_compressed_address = derive_compressed_mint_from_spl_mint( &self.#cmint_ident.key(), &address_tree_pubkey, ); + // Build metadata extensions (if any) + #build_extensions_block // Build compressed mint with context - let compressed_mint_with_context = light_ctoken_types::instructions::mint_action::CompressedMintWithContext::new( + let compressed_mint_with_context = light_ctoken_types::instructions::mint_action::CompressedMintWithContext::new_with_extensions( mint_compressed_address, root_index, self.#cmint_ident.decimals.unwrap_or(9), - Some(#cmint_mint_authority_expr.into()), - Some(#cmint_freeze_authority_expr.into()), + #cmint_mint_authority_expr, + #cmint_freeze_authority_expr, self.#cmint_ident.key().into(), + metadata_extensions, ); // Build actions let actions: Vec = __mint_actions @@ -770,7 +868,7 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { quote! {} } _ => quote! { - anchor_lang::AccountsFinalize::finalize(&self.#ident, program_id, _remaining, _ix_data, _bumps) + anchor_lang::AccountsFinalize::finalize(&mut self.#ident, program_id, _remaining, _ix_data, _bumps) .map_err(|e| e.with_account_name(#name_str))?; }, } @@ -781,7 +879,7 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { #[automatically_derived] impl<#combined_generics> anchor_lang::AccountsFinalize<#trait_generics, #bumps_struct_name> for #name<#struct_generics> #where_clause{ fn finalize( - &self, + &mut self, program_id: &anchor_lang::solana_program::pubkey::Pubkey, _remaining: &[anchor_lang::solana_program::account_info::AccountInfo<#trait_generics>], _ix_data: &[u8], diff --git a/lang/syn/src/codegen/accounts/try_accounts.rs b/lang/syn/src/codegen/accounts/try_accounts.rs index bf917501c3..9ca8eb3809 100644 --- a/lang/syn/src/codegen/accounts/try_accounts.rs +++ b/lang/syn/src/codegen/accounts/try_accounts.rs @@ -187,11 +187,155 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { #cmint_setup } } else { - quote! { - #[cfg(feature = "anchor-debug")] - ::solana_program::log::sol_log(stringify!(#typed_name)); - let #typed_name = anchor_lang::Accounts::try_accounts(__program_id, __accounts, __ix_data, __bumps, __reallocs) - .map_err(|e| e.with_account_name(#name))?; + // Check if this is an InterfaceAccount with mint::token_program constraint + // IMPORTANT: Only mint accounts can be CToken + // Token accounts must always be decompressed on-chain, even for CToken + let token_program_constraint = if matches!(&f.ty, crate::Ty::InterfaceAccount(_)) { + // ONLY check mint:: constraints, NOT token:: constraints + f.constraints.mint.as_ref() + .and_then(|mc| mc.token_program.as_ref()) + } else { + None + }; + + if let Some(token_prog_ref) = token_program_constraint { + // We have a token_program constraint - need to find its position in accounts + // to peek at the right account + let token_prog_name = quote! { #token_prog_ref }.to_string(); + + // Find the index of the token_program field + let token_prog_index = accs.fields.iter().position(|field| { + if let AccountField::Field(f) = field { + f.ident.to_string() == token_prog_name + } else { + false + } + }); + + // Check if we need to wrap in Box + let is_boxed = if let crate::Ty::InterfaceAccount(iac) = &f.ty { + iac.boxed + } else { + false + }; + + let interface_creation = if let Some(prog_idx) = token_prog_index { + // Calculate relative position of token_program + let current_idx = accs.fields.iter().position(|field| { + if let AccountField::Field(other_f) = field { + std::ptr::eq(other_f, f) + } else { + false + } + }).unwrap_or(0); + + if prog_idx < current_idx { + // Backward lookup: token_program was already deserialized + quote! { + if __accounts.is_empty() { + return Err(anchor_lang::error::ErrorCode::AccountNotEnoughKeys.into()); + } + let __acc = &__accounts[0]; + *__accounts = &__accounts[1..]; + + // Use already-deserialized token_program to check if CToken + let __is_ctoken = #token_prog_ref.key() == &anchor_lang::CTOKEN_ID; + + if __is_ctoken { + // Use try_from_ctoken to skip deserialization for compressed accounts + anchor_lang::accounts::interface_account::InterfaceAccount::try_from_ctoken(__acc) + .map_err(|e| e.with_account_name(#name))? + } else { + // Normal deserialization for SPL/T22 + anchor_lang::accounts::interface_account::InterfaceAccount::try_from(__acc) + .map_err(|e| e.with_account_name(#name))? + } + } + } else { + // Forward lookup: peek ahead to token_program + let peek_offset = prog_idx - current_idx; + + quote! { + if __accounts.is_empty() { + return Err(anchor_lang::error::ErrorCode::AccountNotEnoughKeys.into()); + } + let __acc = &__accounts[0]; + + // Peek ahead to check if token_program is CTOKEN_ID + let __is_ctoken = if __accounts.len() > #peek_offset { + __accounts[#peek_offset].key == &anchor_lang::CTOKEN_ID + } else { + false + }; + + *__accounts = &__accounts[1..]; + + if __is_ctoken { + // Use try_from_ctoken to skip deserialization for compressed accounts + anchor_lang::accounts::interface_account::InterfaceAccount::try_from_ctoken(__acc) + .map_err(|e| e.with_account_name(#name))? + } else { + // Normal deserialization for SPL/T22 + anchor_lang::accounts::interface_account::InterfaceAccount::try_from(__acc) + .map_err(|e| e.with_account_name(#name))? + } + } + } + } else { + // Check if this is a state field reference (e.g., pool_state.token_0_program) + if token_prog_name.contains('.') { + // Runtime check - read token_program from already-deserialized account + quote! { + if __accounts.is_empty() { + return Err(anchor_lang::error::ErrorCode::AccountNotEnoughKeys.into()); + } + let __acc = &__accounts[0]; + *__accounts = &__accounts[1..]; + + // Use runtime token_program value from state field + anchor_lang::accounts::interface_account::InterfaceAccount::try_from_with_token_program(__acc, &#token_prog_ref) + .map_err(|e| e.with_account_name(#name))? + } + } else { + // Fallback if we can't find the token_program field in accounts + quote! { + if __accounts.is_empty() { + return Err(anchor_lang::error::ErrorCode::AccountNotEnoughKeys.into()); + } + let __acc = &__accounts[0]; + *__accounts = &__accounts[1..]; + + // Default to normal deserialization if we can't determine token_program + anchor_lang::accounts::interface_account::InterfaceAccount::try_from(__acc) + .map_err(|e| e.with_account_name(#name))? + } + } + }; + + if is_boxed { + quote! { + #[cfg(feature = "anchor-debug")] + ::solana_program::log::sol_log(stringify!(#typed_name)); + let #typed_name = Box::new({ + #interface_creation + }); + } + } else { + quote! { + #[cfg(feature = "anchor-debug")] + ::solana_program::log::sol_log(stringify!(#typed_name)); + let #typed_name = { + #interface_creation + }; + } + } + } else { + quote! { + #[cfg(feature = "anchor-debug")] + ::solana_program::log::sol_log(stringify!(#typed_name)); + let #typed_name = anchor_lang::Accounts::try_accounts(__program_id, __accounts, __ix_data, __bumps, __reallocs) + .map_err(|e| e.with_account_name(#name))?; + } } } } diff --git a/lang/syn/src/codegen/program/handlers.rs b/lang/syn/src/codegen/program/handlers.rs index 87616fdf00..0a444b4913 100644 --- a/lang/syn/src/codegen/program/handlers.rs +++ b/lang/syn/src/codegen/program/handlers.rs @@ -162,7 +162,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { #maybe_set_return_data // Finalize then exit routine. - anchor_lang::AccountsFinalize::finalize(&__accounts, __program_id, __remaining_accounts, __ix_data, &__bumps_for_finalize)?; + anchor_lang::AccountsFinalize::finalize(&mut __accounts, __program_id, __remaining_accounts, __ix_data, &__bumps_for_finalize)?; __accounts.exit(__program_id) } } diff --git a/lang/syn/src/lib.rs b/lang/syn/src/lib.rs index 6be451fb3b..4fa2ee6dd5 100644 --- a/lang/syn/src/lib.rs +++ b/lang/syn/src/lib.rs @@ -708,7 +708,7 @@ pub struct ConstraintGroup { pub mint: Option, pub realloc: Option, // Compressed constraints - pub cmint: Option, + pub cmint: Option, pub cpda: Option, } @@ -804,20 +804,24 @@ pub enum ConstraintToken { ExtensionTokenHookAuthority(Context), ExtensionTokenHookProgramId(Context), ExtensionPermanentDelegate(Context), - // CMint constraints - CMintAuthority(Context), - CMintMintAuthority(Context), - CMintFreezeAuthority(Context), - CMintPayer(Context), - CMintDecimals(Context), - CMintSigner(Context), - CMintSignerSeeds(Context), - CMintSignerBump(Context), - CMintProgramAuthoritySeeds(Context), - CMintProgramAuthorityBump(Context), - CMintAddressTreeInfo(Context), - CMintProof(Context), - CMintOutputStateTreeIndex(Context), + // CToken Mint constraints (syntax: mint::) + CTokenMintAuthority(Context), + CTokenMintFreezeAuthority(Context), + MetadataName(Context), + MetadataSymbol(Context), + MetadataUri(Context), + MetadataUpdateAuthority(Context), + MetadataAdditional(Context), + CTokenMintPayer(Context), + CTokenMintDecimals(Context), + CTokenMintSigner(Context), + CTokenMintSignerSeeds(Context), + CTokenMintSignerBump(Context), + CTokenMintProgramAuthoritySeeds(Context), + CTokenMintProgramAuthorityBump(Context), + CTokenMintAddressTreeInfo(Context), + CTokenMintProof(Context), + CTokenMintOutputStateTreeIndex(Context), // CPDA constraints CPDAAuthority(Context), CPDAAddressTreeInfo(Context), @@ -1094,80 +1098,105 @@ pub struct ConstraintMintCompressed { } #[derive(Debug, Clone)] -pub struct ConstraintCMintAuthority { +pub struct ConstraintCTokenMintAuthority { pub authority: Expr, } #[derive(Debug, Clone)] -pub struct ConstraintCMintMintAuthority { - pub mint_authority: Expr, +pub struct ConstraintCTokenMintFreezeAuthority { + pub freeze_authority: Expr, } #[derive(Debug, Clone)] -pub struct ConstraintCMintFreezeAuthority { - pub freeze_authority: Expr, +pub struct ConstraintMetadataName { + pub name: Expr, +} + +#[derive(Debug, Clone)] +pub struct ConstraintMetadataSymbol { + pub symbol: Expr, +} + +#[derive(Debug, Clone)] +pub struct ConstraintMetadataUri { + pub uri: Expr, +} + +#[derive(Debug, Clone)] +pub struct ConstraintMetadataUpdateAuthority { + pub update_authority: Expr, +} + +#[derive(Debug, Clone)] +pub struct ConstraintMetadataAdditional { + pub additional: Expr, } #[derive(Debug, Clone)] -pub struct ConstraintCMintPayer { +pub struct ConstraintCTokenMintPayer { pub payer: Expr, } #[derive(Debug, Clone)] -pub struct ConstraintCMintDecimals { +pub struct ConstraintCTokenMintDecimals { pub decimals: u8, } #[derive(Debug, Clone)] -pub struct ConstraintCMintSigner { +pub struct ConstraintCTokenMintSigner { pub signer: Expr, } #[derive(Debug, Clone)] -pub struct ConstraintCMintSignerSeeds { +pub struct ConstraintCTokenMintSignerSeeds { pub seeds: Vec, } #[derive(Debug, Clone)] -pub struct ConstraintCMintSignerBump { +pub struct ConstraintCTokenMintSignerBump { pub bump: Expr, } #[derive(Debug, Clone)] -pub struct ConstraintCMintProgramAuthoritySeeds { +pub struct ConstraintCTokenMintProgramAuthoritySeeds { pub seeds: Vec, } #[derive(Debug, Clone)] -pub struct ConstraintCMintProgramAuthorityBump { +pub struct ConstraintCTokenMintProgramAuthorityBump { pub bump: Expr, } #[derive(Debug, Clone)] -pub struct ConstraintCMintAddressTreeInfo { +pub struct ConstraintCTokenMintAddressTreeInfo { pub address_tree_info: Expr, } -/// CMint proof constraint. +/// CToken Mint proof constraint. /// Auto-detected from instruction parameters if not explicitly specified. /// Fails at compile time if multiple proofs exist and none specified. #[derive(Debug, Clone)] -pub struct ConstraintCMintProof { +pub struct ConstraintCTokenMintProof { pub proof: Expr, } -/// CMint output state tree index constraint. +/// CToken Mint output state tree index constraint. /// Defaults to 0 if not explicitly specified. #[derive(Debug, Clone)] -pub struct ConstraintCMintOutputStateTreeIndex { +pub struct ConstraintCTokenMintOutputStateTreeIndex { pub output_state_tree_index: Expr, } #[derive(Debug, Clone)] -pub struct ConstraintCMintGroup { +pub struct ConstraintCTokenMintGroup { pub authority: Option, - pub mint_authority: Option, // Optional mint authority, defaults to authority - pub freeze_authority: Option, // Optional freeze authority, defaults to authority + pub freeze_authority: Option, // Optional freeze authority, defaults to None + // Metadata extension fields (optional). If name+symbol+uri provided, metadata is enabled. + pub metadata_name: Option, + pub metadata_symbol: Option, + pub metadata_uri: Option, + pub metadata_update_authority: Option, + pub metadata_additional: Option, pub decimals: Option, pub payer: Option, pub mint_signer: Option, diff --git a/lang/syn/src/parser/accounts/constraints.rs b/lang/syn/src/parser/accounts/constraints.rs index 86f72fe4d5..424670d43a 100644 --- a/lang/syn/src/parser/accounts/constraints.rs +++ b/lang/syn/src/parser/accounts/constraints.rs @@ -71,24 +71,46 @@ pub fn parse_token(stream: ParseStream) -> ParseResult { .unwrap_or_else(|| ident.span()); match kw.as_str() { - "authority" => ConstraintToken::MintAuthority(Context::new( - span, - ConstraintMintAuthority { - mint_auth: stream.parse()?, - }, - )), - "freeze_authority" => ConstraintToken::MintFreezeAuthority(Context::new( - span, - ConstraintMintFreezeAuthority { - mint_freeze_auth: stream.parse()?, - }, - )), - "decimals" => ConstraintToken::MintDecimals(Context::new( - span, - ConstraintMintDecimals { - decimals: stream.parse()?, - }, - )), + // Shared constraint names - return both SPL and CToken variants + // The validator will use the correct one based on account type + "authority" => { + // For CMint accounts, this creates a CTokenMintAuthority + // For Mint accounts, validator will convert to MintAuthority + ConstraintToken::CTokenMintAuthority(Context::new( + span, + ConstraintCTokenMintAuthority { + authority: stream.parse()?, + }, + )) + }, + "freeze_authority" => { + ConstraintToken::CTokenMintFreezeAuthority(Context::new( + span, + ConstraintCTokenMintFreezeAuthority { + freeze_authority: stream.parse()?, + }, + )) + }, + "decimals" => { + // Try parsing as u8 first (CToken style), fall back to Expr (SPL style) + match stream.parse::() { + Ok(lit) => ConstraintToken::CTokenMintDecimals(Context::new( + span, + ConstraintCTokenMintDecimals { + decimals: lit.base10_parse()?, + }, + )), + Err(_) => { + // Reset stream and try as Expr for SPL + ConstraintToken::MintDecimals(Context::new( + span, + ConstraintMintDecimals { + decimals: stream.parse()?, + }, + )) + } + } + }, "token_program" => ConstraintToken::MintTokenProgram(Context::new( span, ConstraintTokenProgram { @@ -104,7 +126,68 @@ pub fn parse_token(stream: ParseStream) -> ParseResult { }, )) } - _ => return Err(ParseError::new(ident.span(), "Invalid attribute")), + // CToken Mint constraints (for CMint accounts) + "payer" => ConstraintToken::CTokenMintPayer(Context::new( + span, + ConstraintCTokenMintPayer { + payer: stream.parse()?, + }, + )), + "mint_signer" => ConstraintToken::CTokenMintSigner(Context::new( + span, + ConstraintCTokenMintSigner { + signer: stream.parse()?, + }, + )), + "mint_signer_seeds" => { + let seeds_stream; + let bracket = bracketed!(seeds_stream in stream); + let seeds: Punctuated = seeds_stream.parse_terminated(Expr::parse)?; + ConstraintToken::CTokenMintSignerSeeds(Context::new( + span.join(bracket.span).unwrap_or(span), + ConstraintCTokenMintSignerSeeds { seeds: seeds.into_iter().collect() }, + )) + } + "mint_signer_bump" => ConstraintToken::CTokenMintSignerBump(Context::new( + span, + ConstraintCTokenMintSignerBump { + bump: stream.parse()?, + }, + )), + "program_authority_seeds" => { + let seeds_stream; + let bracket = bracketed!(seeds_stream in stream); + let seeds: Punctuated = seeds_stream.parse_terminated(Expr::parse)?; + ConstraintToken::CTokenMintProgramAuthoritySeeds(Context::new( + span.join(bracket.span).unwrap_or(span), + ConstraintCTokenMintProgramAuthoritySeeds { seeds: seeds.into_iter().collect() }, + )) + } + "program_authority_bump" => ConstraintToken::CTokenMintProgramAuthorityBump(Context::new( + span, + ConstraintCTokenMintProgramAuthorityBump { + bump: stream.parse()?, + }, + )), + "address_tree_info" => ConstraintToken::CTokenMintAddressTreeInfo(Context::new( + span, + ConstraintCTokenMintAddressTreeInfo { + address_tree_info: stream.parse()?, + }, + )), + "proof" => ConstraintToken::CTokenMintProof(Context::new( + span, + ConstraintCTokenMintProof { + proof: stream.parse()?, + }, + )), + "output_state_tree_index" => ConstraintToken::CTokenMintOutputStateTreeIndex(Context::new( + span, + ConstraintCTokenMintOutputStateTreeIndex { + output_state_tree_index: stream.parse()?, + }, + )), + _ => return Err(ParseError::new(ident.span(), "Invalid mint attribute")), } } "extensions" => { @@ -362,7 +445,7 @@ pub fn parse_token(stream: ParseStream) -> ParseResult { ConstraintCPDACompressOnInit {}, )) } - "cmint" => { + "metadata" => { stream.parse::()?; stream.parse::()?; let kw = stream.call(Ident::parse_any)?.to_string(); @@ -374,91 +457,49 @@ pub fn parse_token(stream: ParseStream) -> ParseResult { .unwrap_or_else(|| ident.span()); match kw.as_str() { - "authority" => ConstraintToken::CMintAuthority(Context::new( - span, - ConstraintCMintAuthority { - authority: stream.parse()?, - }, - )), - "mint_authority" => ConstraintToken::CMintMintAuthority(Context::new( - span, - ConstraintCMintMintAuthority { - mint_authority: stream.parse()?, - }, - )), - "freeze_authority" => ConstraintToken::CMintFreezeAuthority(Context::new( - span, - ConstraintCMintFreezeAuthority { - freeze_authority: stream.parse()?, - }, - )), - "payer" => ConstraintToken::CMintPayer(Context::new( - span, - ConstraintCMintPayer { - payer: stream.parse()?, - }, - )), - "decimals" => ConstraintToken::CMintDecimals(Context::new( - span, - ConstraintCMintDecimals { - decimals: stream.parse::()?.base10_parse()?, - }, - )), - "mint_signer" => ConstraintToken::CMintSigner(Context::new( - span, - ConstraintCMintSigner { - signer: stream.parse()?, - }, - )), - "mint_signer_seeds" => { - let seeds_stream; - let bracket = bracketed!(seeds_stream in stream); - let seeds: Punctuated = seeds_stream.parse_terminated(Expr::parse)?; - ConstraintToken::CMintSignerSeeds(Context::new( - span.join(bracket.span).unwrap_or(span), - ConstraintCMintSignerSeeds { seeds: seeds.into_iter().collect() }, - )) - } - "mint_signer_bump" => ConstraintToken::CMintSignerBump(Context::new( - span, - ConstraintCMintSignerBump { - bump: stream.parse()?, - }, - )), - "program_authority_seeds" => { - let seeds_stream; - let bracket = bracketed!(seeds_stream in stream); - let seeds: Punctuated = seeds_stream.parse_terminated(Expr::parse)?; - ConstraintToken::CMintProgramAuthoritySeeds(Context::new( - span.join(bracket.span).unwrap_or(span), - ConstraintCMintProgramAuthoritySeeds { seeds: seeds.into_iter().collect() }, - )) - } - "program_authority_bump" => ConstraintToken::CMintProgramAuthorityBump(Context::new( - span, - ConstraintCMintProgramAuthorityBump { - bump: stream.parse()?, - }, - )), - "address_tree_info" => ConstraintToken::CMintAddressTreeInfo(Context::new( - span, - ConstraintCMintAddressTreeInfo { - address_tree_info: stream.parse()?, - }, - )), - "proof" => ConstraintToken::CMintProof(Context::new( + "name" => { + let name_expr: Expr = stream.parse()?; + validate_metadata_size_limit(&name_expr, "name", 32, span)?; + ConstraintToken::MetadataName(Context::new( + span, + ConstraintMetadataName { + name: name_expr, + }, + )) + }, + "symbol" => { + let symbol_expr: Expr = stream.parse()?; + validate_metadata_size_limit(&symbol_expr, "symbol", 10, span)?; + ConstraintToken::MetadataSymbol(Context::new( + span, + ConstraintMetadataSymbol { + symbol: symbol_expr, + }, + )) + }, + "uri" => { + let uri_expr: Expr = stream.parse()?; + validate_metadata_size_limit(&uri_expr, "uri", 200, span)?; + ConstraintToken::MetadataUri(Context::new( + span, + ConstraintMetadataUri { + uri: uri_expr, + }, + )) + }, + "update_authority" => ConstraintToken::MetadataUpdateAuthority(Context::new( span, - ConstraintCMintProof { - proof: stream.parse()?, + ConstraintMetadataUpdateAuthority { + update_authority: stream.parse()?, }, )), - "output_state_tree_index" => ConstraintToken::CMintOutputStateTreeIndex(Context::new( + "additional" => ConstraintToken::MetadataAdditional(Context::new( span, - ConstraintCMintOutputStateTreeIndex { - output_state_tree_index: stream.parse()?, + ConstraintMetadataAdditional { + additional: stream.parse()?, }, )), - _ => return Err(ParseError::new(ident.span(), "Invalid cmint attribute")), + _ => return Err(ParseError::new(ident.span(), "Invalid metadata attribute")), } } "associated_token" => { @@ -713,20 +754,25 @@ pub struct ConstraintGroupBuilder<'ty> { pub realloc: Option>, pub realloc_payer: Option>, pub realloc_zero: Option>, - // CMint constraints - pub cmint_authority: Option>, - pub cmint_mint_authority: Option>, - pub cmint_freeze_authority: Option>, - pub cmint_payer: Option>, - pub cmint_decimals: Option>, - pub cmint_signer: Option>, - pub cmint_signer_seeds: Option>, - pub cmint_signer_bump: Option>, - pub cmint_program_authority_seeds: Option>, - pub cmint_program_authority_bump: Option>, - pub cmint_address_tree_info: Option>, - pub cmint_proof: Option>, - pub cmint_output_state_tree_index: Option>, + // CToken Mint constraints + pub ctoken_mint_authority: Option>, + pub ctoken_mint_freeze_authority: Option>, + pub ctoken_mint_payer: Option>, + pub ctoken_mint_decimals: Option>, + pub ctoken_mint_signer: Option>, + pub ctoken_mint_signer_seeds: Option>, + pub ctoken_mint_signer_bump: Option>, + pub ctoken_mint_program_authority_seeds: Option>, + pub ctoken_mint_program_authority_bump: Option>, + pub ctoken_mint_address_tree_info: Option>, + pub ctoken_mint_proof: Option>, + pub ctoken_mint_output_state_tree_index: Option>, + // Metadata constraints (for CToken mints) + pub metadata_name: Option>, + pub metadata_symbol: Option>, + pub metadata_uri: Option>, + pub metadata_update_authority: Option>, + pub metadata_additional: Option>, // CPDA constraints pub cpda_authority: Option>, pub cpda_address_tree_info: Option>, @@ -780,19 +826,23 @@ impl<'ty> ConstraintGroupBuilder<'ty> { realloc: None, realloc_payer: None, realloc_zero: None, - cmint_authority: None, - cmint_mint_authority: None, - cmint_freeze_authority: None, - cmint_payer: None, - cmint_decimals: None, - cmint_signer: None, - cmint_signer_seeds: None, - cmint_signer_bump: None, - cmint_program_authority_seeds: None, - cmint_program_authority_bump: None, - cmint_address_tree_info: None, - cmint_proof: None, - cmint_output_state_tree_index: None, + ctoken_mint_authority: None, + ctoken_mint_freeze_authority: None, + ctoken_mint_payer: None, + ctoken_mint_decimals: None, + ctoken_mint_signer: None, + ctoken_mint_signer_seeds: None, + ctoken_mint_signer_bump: None, + ctoken_mint_program_authority_seeds: None, + ctoken_mint_program_authority_bump: None, + ctoken_mint_address_tree_info: None, + ctoken_mint_proof: None, + ctoken_mint_output_state_tree_index: None, + metadata_name: None, + metadata_symbol: None, + metadata_uri: None, + metadata_update_authority: None, + metadata_additional: None, cpda_authority: None, cpda_address_tree_info: None, cpda_proof: None, @@ -949,34 +999,34 @@ impl<'ty> ConstraintGroupBuilder<'ty> { } } - // Similar auto-detection for CMint constraints - let has_cmint = self.cmint_authority.is_some() || - self.cmint_payer.is_some() || - self.cmint_decimals.is_some() || - self.cmint_signer.is_some() || - self.cmint_address_tree_info.is_some() || - self.cmint_output_state_tree_index.is_some(); + // Similar auto-detection for CToken Mint constraints + let has_ctoken_mint = self.ctoken_mint_authority.is_some() || + self.ctoken_mint_payer.is_some() || + self.ctoken_mint_decimals.is_some() || + self.ctoken_mint_signer.is_some() || + self.ctoken_mint_address_tree_info.is_some() || + self.ctoken_mint_output_state_tree_index.is_some(); - if has_cmint { + if has_ctoken_mint { // Auto-detect proof if not explicitly set - if self.cmint_proof.is_none() { + if self.ctoken_mint_proof.is_none() { match find_validity_proof_field()? { Some(proof_field) => { let proof_expr: Expr = syn::parse_str(&proof_field) .map_err(|_| ParseError::new( proc_macro2::Span::call_site(), - format!("Failed to parse auto-detected proof field for CMint: {}", proof_field) + format!("Failed to parse auto-detected proof field for CToken Mint: {}", proof_field) ))?; - self.cmint_proof = Some(Context::new( + self.ctoken_mint_proof = Some(Context::new( proc_macro2::Span::call_site(), - ConstraintCMintProof { proof: proof_expr } + ConstraintCTokenMintProof { proof: proof_expr } )); } None => { - // No proof found - this is an error for CMint + // No proof found - this is an error for CToken Mint return Err(ParseError::new( proc_macro2::Span::call_site(), - "CMint constraints require a proof field. Either add 'cmint::proof = ' \ + "CToken Mint constraints require a proof field. Either add 'mint::proof = ' \ or ensure your instruction has a ValidityProof parameter." )); } @@ -984,12 +1034,12 @@ impl<'ty> ConstraintGroupBuilder<'ty> { } // Default output_state_tree_index to 0 if not explicitly set - if self.cmint_output_state_tree_index.is_none() { + if self.ctoken_mint_output_state_tree_index.is_none() { let default_index: Expr = syn::parse_str("0") .expect("Failed to parse default output_state_tree_index"); - self.cmint_output_state_tree_index = Some(Context::new( + self.ctoken_mint_output_state_tree_index = Some(Context::new( proc_macro2::Span::call_site(), - ConstraintCMintOutputStateTreeIndex { output_state_tree_index: default_index } + ConstraintCTokenMintOutputStateTreeIndex { output_state_tree_index: default_index } )); } } @@ -1223,19 +1273,23 @@ impl<'ty> ConstraintGroupBuilder<'ty> { realloc, realloc_payer, realloc_zero, - cmint_authority, - cmint_mint_authority, - cmint_freeze_authority, - cmint_payer, - cmint_decimals, - cmint_signer, - cmint_signer_seeds, - cmint_signer_bump, - cmint_program_authority_seeds, - cmint_program_authority_bump, - cmint_address_tree_info, - cmint_proof, - cmint_output_state_tree_index, + ctoken_mint_authority, + ctoken_mint_freeze_authority, + ctoken_mint_payer, + ctoken_mint_decimals, + ctoken_mint_signer, + ctoken_mint_signer_seeds, + ctoken_mint_signer_bump, + ctoken_mint_program_authority_seeds, + ctoken_mint_program_authority_bump, + ctoken_mint_address_tree_info, + ctoken_mint_proof, + ctoken_mint_output_state_tree_index, + ref metadata_name, + ref metadata_symbol, + ref metadata_uri, + ref metadata_update_authority, + ref metadata_additional, cpda_authority, cpda_address_tree_info, cpda_proof, @@ -1478,27 +1532,31 @@ impl<'ty> ConstraintGroupBuilder<'ty> { seeds, token_account: if !is_init {token_account} else {None}, mint: if !is_init {mint} else {None}, - cmint: if cmint_authority.is_some() || cmint_mint_authority.is_some() || - cmint_freeze_authority.is_some() || cmint_payer.is_some() || cmint_decimals.is_some() || - cmint_signer.is_some() || cmint_signer_seeds.is_some() || - cmint_signer_bump.is_some() || - cmint_program_authority_seeds.is_some() || cmint_program_authority_bump.is_some() || - cmint_address_tree_info.is_some() || cmint_proof.is_some() || - cmint_output_state_tree_index.is_some() { - Some(ConstraintCMintGroup { - authority: cmint_authority.map(|c| c.into_inner().authority), - mint_authority: cmint_mint_authority.map(|c| c.into_inner().mint_authority), - freeze_authority: cmint_freeze_authority.map(|c| c.into_inner().freeze_authority), - decimals: cmint_decimals.map(|c| c.into_inner().decimals), - payer: cmint_payer.map(|c| c.into_inner().payer), - mint_signer: cmint_signer.map(|c| c.into_inner().signer), - mint_signer_seeds: cmint_signer_seeds.map(|c| c.into_inner().seeds), - mint_signer_bump: cmint_signer_bump.map(|c| c.into_inner().bump), - program_authority_seeds: cmint_program_authority_seeds.map(|c| c.into_inner().seeds), - program_authority_bump: cmint_program_authority_bump.map(|c| c.into_inner().bump), - address_tree_info: cmint_address_tree_info.map(|c| c.into_inner().address_tree_info), - proof: cmint_proof.map(|c| c.into_inner().proof), - output_state_tree_index: cmint_output_state_tree_index.map(|c| c.into_inner().output_state_tree_index), + cmint: if ctoken_mint_authority.is_some() || + ctoken_mint_freeze_authority.is_some() || metadata_name.is_some() || metadata_symbol.is_some() || metadata_uri.is_some() || metadata_update_authority.is_some() || metadata_additional.is_some() || ctoken_mint_payer.is_some() || ctoken_mint_decimals.is_some() || + ctoken_mint_signer.is_some() || ctoken_mint_signer_seeds.is_some() || + ctoken_mint_signer_bump.is_some() || + ctoken_mint_program_authority_seeds.is_some() || ctoken_mint_program_authority_bump.is_some() || + ctoken_mint_address_tree_info.is_some() || ctoken_mint_proof.is_some() || + ctoken_mint_output_state_tree_index.is_some() { + Some(ConstraintCTokenMintGroup { + authority: ctoken_mint_authority.map(|c| c.into_inner().authority), + metadata_name: metadata_name.as_ref().map(|c| c.clone().into_inner().name), + metadata_symbol: metadata_symbol.as_ref().map(|c| c.clone().into_inner().symbol), + metadata_uri: metadata_uri.as_ref().map(|c| c.clone().into_inner().uri), + metadata_update_authority: metadata_update_authority.as_ref().map(|c| c.clone().into_inner().update_authority), + metadata_additional: metadata_additional.as_ref().map(|c| c.clone().into_inner().additional), + freeze_authority: ctoken_mint_freeze_authority.map(|c| c.into_inner().freeze_authority), + decimals: ctoken_mint_decimals.map(|c| c.into_inner().decimals), + payer: ctoken_mint_payer.map(|c| c.into_inner().payer), + mint_signer: ctoken_mint_signer.map(|c| c.into_inner().signer), + mint_signer_seeds: ctoken_mint_signer_seeds.map(|c| c.into_inner().seeds), + mint_signer_bump: ctoken_mint_signer_bump.map(|c| c.into_inner().bump), + program_authority_seeds: ctoken_mint_program_authority_seeds.map(|c| c.into_inner().seeds), + program_authority_bump: ctoken_mint_program_authority_bump.map(|c| c.into_inner().bump), + address_tree_info: ctoken_mint_address_tree_info.map(|c| c.into_inner().address_tree_info), + proof: ctoken_mint_proof.map(|c| c.into_inner().proof), + output_state_tree_index: ctoken_mint_output_state_tree_index.map(|c| c.into_inner().output_state_tree_index), }) } else { None @@ -1578,19 +1636,23 @@ impl<'ty> ConstraintGroupBuilder<'ty> { ConstraintToken::ExtensionPermanentDelegate(c) => { self.add_extension_permanent_delegate(c) } - ConstraintToken::CMintAuthority(c) => self.add_cmint_authority(c), - ConstraintToken::CMintMintAuthority(c) => self.add_cmint_mint_authority(c), - ConstraintToken::CMintFreezeAuthority(c) => self.add_cmint_freeze_authority(c), - ConstraintToken::CMintPayer(c) => self.add_cmint_payer(c), - ConstraintToken::CMintDecimals(c) => self.add_cmint_decimals(c), - ConstraintToken::CMintSigner(c) => self.add_cmint_signer(c), - ConstraintToken::CMintSignerSeeds(c) => self.add_cmint_signer_seeds(c), - ConstraintToken::CMintSignerBump(c) => self.add_cmint_signer_bump(c), - ConstraintToken::CMintProgramAuthoritySeeds(c) => self.add_cmint_program_authority_seeds(c), - ConstraintToken::CMintProgramAuthorityBump(c) => self.add_cmint_program_authority_bump(c), - ConstraintToken::CMintAddressTreeInfo(c) => self.add_cmint_address_tree_info(c), - ConstraintToken::CMintProof(c) => self.add_cmint_proof(c), - ConstraintToken::CMintOutputStateTreeIndex(c) => self.add_cmint_output_state_tree_index(c), + ConstraintToken::CTokenMintAuthority(c) => self.add_ctoken_mint_authority(c), + ConstraintToken::CTokenMintFreezeAuthority(c) => self.add_ctoken_mint_freeze_authority(c), + ConstraintToken::CTokenMintPayer(c) => self.add_ctoken_mint_payer(c), + ConstraintToken::CTokenMintDecimals(c) => self.add_ctoken_mint_decimals(c), + ConstraintToken::CTokenMintSigner(c) => self.add_ctoken_mint_signer(c), + ConstraintToken::CTokenMintSignerSeeds(c) => self.add_ctoken_mint_signer_seeds(c), + ConstraintToken::CTokenMintSignerBump(c) => self.add_ctoken_mint_signer_bump(c), + ConstraintToken::CTokenMintProgramAuthoritySeeds(c) => self.add_ctoken_mint_program_authority_seeds(c), + ConstraintToken::CTokenMintProgramAuthorityBump(c) => self.add_ctoken_mint_program_authority_bump(c), + ConstraintToken::CTokenMintAddressTreeInfo(c) => self.add_ctoken_mint_address_tree_info(c), + ConstraintToken::CTokenMintProof(c) => self.add_ctoken_mint_proof(c), + ConstraintToken::CTokenMintOutputStateTreeIndex(c) => self.add_ctoken_mint_output_state_tree_index(c), + ConstraintToken::MetadataName(c) => self.add_metadata_name(c), + ConstraintToken::MetadataSymbol(c) => self.add_metadata_symbol(c), + ConstraintToken::MetadataUri(c) => self.add_metadata_uri(c), + ConstraintToken::MetadataUpdateAuthority(c) => self.add_metadata_update_authority(c), + ConstraintToken::MetadataAdditional(c) => self.add_metadata_additional(c), ConstraintToken::CPDAAuthority(c) => self.add_cpda_authority(c), ConstraintToken::CPDAAddressTreeInfo(c) => self.add_cpda_address_tree_info(c), ConstraintToken::CPDAProof(c) => self.add_cpda_proof(c), @@ -1957,107 +2019,139 @@ impl<'ty> ConstraintGroupBuilder<'ty> { Ok(()) } - fn add_cmint_authority(&mut self, c: Context) -> ParseResult<()> { - if self.cmint_authority.is_some() { - return Err(ParseError::new(c.span(), "cmint authority already provided")); + fn add_ctoken_mint_authority(&mut self, c: Context) -> ParseResult<()> { + if self.ctoken_mint_authority.is_some() { + return Err(ParseError::new(c.span(), "mint::authority already provided")); + } + self.ctoken_mint_authority.replace(c); + Ok(()) + } + + fn add_ctoken_mint_freeze_authority(&mut self, c: Context) -> ParseResult<()> { + if self.ctoken_mint_freeze_authority.is_some() { + return Err(ParseError::new(c.span(), "mint::freeze_authority already provided")); + } + self.ctoken_mint_freeze_authority.replace(c); + Ok(()) + } + + fn add_ctoken_mint_payer(&mut self, c: Context) -> ParseResult<()> { + if self.ctoken_mint_payer.is_some() { + return Err(ParseError::new(c.span(), "mint::payer already provided")); + } + self.ctoken_mint_payer.replace(c); + Ok(()) + } + + fn add_ctoken_mint_decimals(&mut self, c: Context) -> ParseResult<()> { + if self.ctoken_mint_decimals.is_some() { + return Err(ParseError::new(c.span(), "mint::decimals already provided")); } - self.cmint_authority.replace(c); + self.ctoken_mint_decimals.replace(c); Ok(()) } - fn add_cmint_mint_authority(&mut self, c: Context) -> ParseResult<()> { - if self.cmint_mint_authority.is_some() { - return Err(ParseError::new(c.span(), "cmint mint_authority already provided")); + fn add_ctoken_mint_signer(&mut self, c: Context) -> ParseResult<()> { + if self.ctoken_mint_signer.is_some() { + return Err(ParseError::new(c.span(), "mint::mint_signer already provided")); } - self.cmint_mint_authority.replace(c); + self.ctoken_mint_signer.replace(c); Ok(()) } - fn add_cmint_freeze_authority(&mut self, c: Context) -> ParseResult<()> { - if self.cmint_freeze_authority.is_some() { - return Err(ParseError::new(c.span(), "cmint freeze_authority already provided")); + fn add_ctoken_mint_signer_seeds(&mut self, c: Context) -> ParseResult<()> { + if self.ctoken_mint_signer_seeds.is_some() { + return Err(ParseError::new(c.span(), "mint::mint_signer_seeds already provided")); } - self.cmint_freeze_authority.replace(c); + self.ctoken_mint_signer_seeds.replace(c); Ok(()) } - fn add_cmint_payer(&mut self, c: Context) -> ParseResult<()> { - if self.cmint_payer.is_some() { - return Err(ParseError::new(c.span(), "cmint payer already provided")); + fn add_ctoken_mint_signer_bump(&mut self, c: Context) -> ParseResult<()> { + if self.ctoken_mint_signer_bump.is_some() { + return Err(ParseError::new(c.span(), "mint::mint_signer_bump already provided")); } - self.cmint_payer.replace(c); + self.ctoken_mint_signer_bump.replace(c); Ok(()) } - fn add_cmint_decimals(&mut self, c: Context) -> ParseResult<()> { - if self.cmint_decimals.is_some() { - return Err(ParseError::new(c.span(), "cmint decimals already provided")); + fn add_ctoken_mint_program_authority_seeds(&mut self, c: Context) -> ParseResult<()> { + if self.ctoken_mint_program_authority_seeds.is_some() { + return Err(ParseError::new(c.span(), "mint::program_authority_seeds already provided")); } - self.cmint_decimals.replace(c); + self.ctoken_mint_program_authority_seeds.replace(c); Ok(()) } - fn add_cmint_signer(&mut self, c: Context) -> ParseResult<()> { - if self.cmint_signer.is_some() { - return Err(ParseError::new(c.span(), "cmint signer already provided")); + fn add_ctoken_mint_program_authority_bump(&mut self, c: Context) -> ParseResult<()> { + if self.ctoken_mint_program_authority_bump.is_some() { + return Err(ParseError::new(c.span(), "mint::program_authority_bump already provided")); } - self.cmint_signer.replace(c); + self.ctoken_mint_program_authority_bump.replace(c); Ok(()) } - fn add_cmint_signer_seeds(&mut self, c: Context) -> ParseResult<()> { - if self.cmint_signer_seeds.is_some() { - return Err(ParseError::new(c.span(), "cmint mint_signer_seeds already provided")); + fn add_ctoken_mint_address_tree_info(&mut self, c: Context) -> ParseResult<()> { + if self.ctoken_mint_address_tree_info.is_some() { + return Err(ParseError::new(c.span(), "mint::address_tree_info already provided")); } - self.cmint_signer_seeds.replace(c); + self.ctoken_mint_address_tree_info.replace(c); Ok(()) } - fn add_cmint_signer_bump(&mut self, c: Context) -> ParseResult<()> { - if self.cmint_signer_bump.is_some() { - return Err(ParseError::new(c.span(), "cmint mint_signer_bump already provided")); + fn add_ctoken_mint_proof(&mut self, c: Context) -> ParseResult<()> { + if self.ctoken_mint_proof.is_some() { + return Err(ParseError::new(c.span(), "mint::proof already provided")); } - self.cmint_signer_bump.replace(c); + self.ctoken_mint_proof.replace(c); Ok(()) } - fn add_cmint_program_authority_seeds(&mut self, c: Context) -> ParseResult<()> { - if self.cmint_program_authority_seeds.is_some() { - return Err(ParseError::new(c.span(), "cmint program_authority_seeds already provided")); + fn add_ctoken_mint_output_state_tree_index(&mut self, c: Context) -> ParseResult<()> { + if self.ctoken_mint_output_state_tree_index.is_some() { + return Err(ParseError::new(c.span(), "mint::output_state_tree_index already provided")); } - self.cmint_program_authority_seeds.replace(c); + self.ctoken_mint_output_state_tree_index.replace(c); Ok(()) } - fn add_cmint_program_authority_bump(&mut self, c: Context) -> ParseResult<()> { - if self.cmint_program_authority_bump.is_some() { - return Err(ParseError::new(c.span(), "cmint program_authority_bump already provided")); + fn add_metadata_name(&mut self, c: Context) -> ParseResult<()> { + if self.metadata_name.is_some() { + return Err(ParseError::new(c.span(), "metadata::name already provided")); } - self.cmint_program_authority_bump.replace(c); + self.metadata_name.replace(c); Ok(()) } - fn add_cmint_address_tree_info(&mut self, c: Context) -> ParseResult<()> { - if self.cmint_address_tree_info.is_some() { - return Err(ParseError::new(c.span(), "cmint address_tree_info already provided")); + fn add_metadata_symbol(&mut self, c: Context) -> ParseResult<()> { + if self.metadata_symbol.is_some() { + return Err(ParseError::new(c.span(), "metadata::symbol already provided")); } - self.cmint_address_tree_info.replace(c); + self.metadata_symbol.replace(c); Ok(()) } - fn add_cmint_proof(&mut self, c: Context) -> ParseResult<()> { - if self.cmint_proof.is_some() { - return Err(ParseError::new(c.span(), "cmint proof already provided")); + fn add_metadata_uri(&mut self, c: Context) -> ParseResult<()> { + if self.metadata_uri.is_some() { + return Err(ParseError::new(c.span(), "metadata::uri already provided")); } - self.cmint_proof.replace(c); + self.metadata_uri.replace(c); Ok(()) } - fn add_cmint_output_state_tree_index(&mut self, c: Context) -> ParseResult<()> { - if self.cmint_output_state_tree_index.is_some() { - return Err(ParseError::new(c.span(), "cmint output_state_tree_index already provided")); + fn add_metadata_update_authority(&mut self, c: Context) -> ParseResult<()> { + if self.metadata_update_authority.is_some() { + return Err(ParseError::new(c.span(), "metadata::update_authority already provided")); } - self.cmint_output_state_tree_index.replace(c); + self.metadata_update_authority.replace(c); + Ok(()) + } + + fn add_metadata_additional(&mut self, c: Context) -> ParseResult<()> { + if self.metadata_additional.is_some() { + return Err(ParseError::new(c.span(), "metadata::additional already provided")); + } + self.metadata_additional.replace(c); Ok(()) } @@ -2339,3 +2433,51 @@ impl<'ty> ConstraintGroupBuilder<'ty> { Ok(()) } } + +/// Validates that metadata field expressions have appropriate size limits at compile time. +/// This function checks if the expression is a string literal and validates its length. +fn validate_metadata_size_limit( + expr: &Expr, + field_name: &str, + max_bytes: usize, + span: proc_macro2::Span, +) -> ParseResult<()> { + match expr { + // Check string literals + Expr::Lit(syn::ExprLit { lit: syn::Lit::Str(lit_str), .. }) => { + let str_value = lit_str.value(); + let byte_len = str_value.len(); + + if byte_len > max_bytes { + return Err(ParseError::new( + span, + format!( + "CMint metadata {} exceeds size limit: {} bytes (max: {} bytes).", + field_name, byte_len, max_bytes + ) + )); + } + } + // Check byte string literals + Expr::Lit(syn::ExprLit { lit: syn::Lit::ByteStr(lit_bytes), .. }) => { + let byte_len = lit_bytes.value().len(); + + if byte_len > max_bytes { + return Err(ParseError::new( + span, + format!( + "CMint metadata {} exceeds size limit: {} bytes (max: {} bytes).", field_name, byte_len, max_bytes + ) + )); + } + } + // For other expressions (variables, function calls, etc.), we can't validate at compile time + // The runtime validation will be handled in the generated code + _ => { + // No compile-time validation possible for dynamic expressions + // Runtime validation will be added in the generated code + } + } + + Ok(()) +} From b9d7e407cc09735f991bce6b6a6467653524ddef Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Sun, 12 Oct 2025 15:39:29 -0400 Subject: [PATCH 08/20] wip --- ts/packages/anchor/package.json | 2 + .../anchor/src/program/namespace/methods.ts | 266 ++++++++++++++++++ ts/yarn.lock | 75 ++++- 3 files changed, 342 insertions(+), 1 deletion(-) diff --git a/ts/packages/anchor/package.json b/ts/packages/anchor/package.json index 6b54e99302..038975a411 100644 --- a/ts/packages/anchor/package.json +++ b/ts/packages/anchor/package.json @@ -35,6 +35,8 @@ "dependencies": { "@coral-xyz/anchor-errors": "^0.31.1", "@coral-xyz/borsh": "^0.31.1", + "@lightprotocol/compressed-token": "link:../../../../light-protocol/js/compressed-token", + "@lightprotocol/stateless.js": "link:../../../../light-protocol/js/stateless.js", "@noble/hashes": "^1.3.1", "@solana/web3.js": "^1.69.0", "bn.js": "^5.1.2", diff --git a/ts/packages/anchor/src/program/namespace/methods.ts b/ts/packages/anchor/src/program/namespace/methods.ts index 2dec004506..d1fbc43f68 100644 --- a/ts/packages/anchor/src/program/namespace/methods.ts +++ b/ts/packages/anchor/src/program/namespace/methods.ts @@ -34,6 +34,93 @@ import { MethodsFn, } from "./types.js"; import { ViewFn } from "./views.js"; +import { createRpc, type Rpc } from "@lightprotocol/stateless.js"; +import { + buildDecompressParams, + getAccountInterface, +} from "@lightprotocol/compressed-token"; + +/** + * Check if an IDL type has compression_info field (is compressible) + */ +function isCompressibleType(typeName: string, idlTypes: IdlTypeDef[]): boolean { + const type = idlTypes.find((t) => t.name === typeName); + if (!type) return false; + + if (type.type.kind === "struct") { + return ( + type.type.fields?.some( + (f) => f.name === "compression_info" || f.name === "compressionInfo" + ) ?? false + ); + } + + // For enums, check if any variant has compression_info + if (type.type.kind === "enum") { + return ( + type.type.variants?.some((v) => + v.fields?.some( + (f) => + (f as any).name === "compression_info" || + (f as any).name === "compressionInfo" + ) + ) ?? false + ); + } + + return false; +} + +/** + * Get the defined type name from an account + */ +function getDefinedTypeName(account: IdlInstructionAccountItem): string | null { + if (!("type" in account)) return null; + const accType: any = (account as any).type; + if (accType && typeof accType === "object" && "defined" in accType) { + const defined: any = accType.defined; + if (typeof defined === "string") return defined; + if (defined && typeof defined === "object" && "name" in defined) + return defined.name as string; + } + return null; +} + +/** + * Detect if type is CTokenData by checking if it's an enum with token-like variants + */ +function isCTokenDataType(typeName: string, idlTypes: IdlTypeDef[]): boolean { + const type = idlTypes.find((t) => t.name === typeName); + if (!type || type.type.kind !== "enum") return false; + + // Check if it has typical cToken variant names + const variants = type.type.variants?.map((v) => v.name.toLowerCase()) ?? []; + const tokenKeywords = ["vault", "token", "account", "mint"]; + return variants.some((v) => tokenKeywords.some((kw) => v.includes(kw))); +} + +/** + * Extract enum variant from account name for CTokenData + * e.g., "lpVault" -> "lpVault", "token0Vault" -> "token0Vault" + */ +function extractTokenVariant( + accountName: string, + typeName: string, + idlTypes: IdlTypeDef[] +): string | undefined { + const type = idlTypes.find((t) => t.name === typeName); + if (!type || type.type.kind !== "enum") return undefined; + + // Try to match account name to variant name (case-insensitive) + const variants = type.type.variants ?? []; + const matchedVariant = variants.find( + (v) => + accountName.toLowerCase().includes(v.name.toLowerCase()) || + v.name.toLowerCase().includes(accountName.toLowerCase()) + ); + + return matchedVariant?.name; +} export type MethodsNamespace< IDL extends Idl = Idl, @@ -164,6 +251,7 @@ export class MethodsBuilder< private _postInstructions: Array = []; private _accountsResolver: AccountsResolver; private _resolveAccounts: boolean = true; + private _enableAutoDecompress: boolean = false; constructor( private _args: Array, @@ -294,6 +382,30 @@ export class MethodsBuilder< return this; } + /** + * Enable automatic decompression for all compressible accounts. + * + * Automatically detects compressible accounts from IDL, fetches their data, + * and injects decompress instructions if any are compressed. + * + * No configuration required - everything is derived from the IDL! + * + * @returns this builder for chaining + * + * @example + * ```ts + * await program.methods + * .swap(amount) + * .decompressIfNeeded() // That's it! + * .accounts({ poolState, lpVault, token0Vault, ... }) + * .rpc(); + * ``` + */ + public decompressIfNeeded() { + this._enableAutoDecompress = true; + return this; + } + /** * Get the public keys of the instruction accounts. * @@ -313,6 +425,151 @@ export class MethodsBuilder< return this._accounts; } + /** + * Automatically detect and fetch compressible accounts based on IDL. + * Returns account inputs for buildDecompressParams. + */ + private async _detectAndFetchCompressibleAccounts(): Promise { + const idlIx = this._accountsResolver["_idlIx"]; + const idlTypes = this._accountsResolver["_idlTypes"]; + const provider = this._accountsResolver["_provider"] as Provider & { + rpc?: any; + }; + + // Find all compressible account definitions from IDL + const compressibleAccounts: Array<{ + name: string; + address: PublicKey; + typeName: string; + isCToken: boolean; + variant?: string; + }> = []; + + // Recursively process accounts (handles nested account structures) + const processAccounts = ( + accounts: readonly IdlInstructionAccountItem[] + ) => { + for (const account of accounts) { + if ("accounts" in account) { + // Nested accounts struct + processAccounts(account.accounts); + continue; + } + + const typeName = getDefinedTypeName(account); + if (!typeName) continue; + + // Check if this type is compressible + if (!isCompressibleType(typeName, idlTypes)) continue; + + const address = translateAddress( + this._accounts[account.name] as Address + ); + if (!address) { + console.warn( + `Compressible account ${account.name} not found in accounts` + ); + continue; + } + + const isCToken = isCTokenDataType(typeName, idlTypes); + const variant = isCToken + ? extractTokenVariant(account.name, typeName, idlTypes) + : undefined; + + compressibleAccounts.push({ + name: account.name, + address, + typeName, + isCToken, + variant, + }); + } + }; + + processAccounts(idlIx.accounts); + + if (compressibleAccounts.length === 0) { + return []; + } + + // Ensure Rpc instance (lightprotocol) is available + let rpc: Rpc = (provider as any).rpc; + if (!rpc) { + rpc = createRpc(provider.connection); + (provider as any).rpc = rpc; + } + + // Batch fetch all compressible accounts in parallel + + const fetchPromises = compressibleAccounts.map(async (acc) => { + try { + const info = await getAccountInterface(rpc, acc.address); + + return { + address: acc.address, + info: { + accountInfo: info.accountInfo, + parsed: info.parsed, + merkleContext: info.merkleContext, + }, + accountType: acc.isCToken ? "cTokenData" : acc.typeName, + tokenVariant: acc.variant, + }; + } catch (err) { + console.warn(`Failed to fetch compressible account ${acc.name}:`, err); + return null; + } + }); + + const results = await Promise.all(fetchPromises); + return results.filter((r) => r !== null); + } + + /** + * Internal method to inject decompress instruction if needed. + * Fully automatic based on IDL analysis. + */ + private async _injectDecompressIfNeeded(): Promise { + if (!this._enableAutoDecompress) return; + + // Detect and fetch compressible accounts + const accountInputs = await this._detectAndFetchCompressibleAccounts(); + + if (accountInputs.length === 0) return; + + const programId = this._accountsResolver["_programId"]; + const provider = this._accountsResolver["_provider"] as Provider & { + rpc?: Rpc; + }; + // Prefer a cached Rpc on provider; otherwise construct one from the Connection endpoint + let rpc: Rpc = provider.rpc!; + if (!rpc) { + rpc = createRpc(provider.connection); + (provider as any).rpc = rpc; + } + + // Build decompress params using the helper + const params = await buildDecompressParams(programId, rpc, accountInputs); + + if (!params) return; // No compressed accounts + + // Use Anchor's own instruction builder to create decompressAccountsIdempotent + // This instruction exists in the IDL (generated by the proc macro) + const decompressIx = await this._ixFn["decompressAccountsIdempotent"]( + params.proofOption, + params.compressedAccounts, + params.systemAccountsOffset, + { + accounts: this._accounts, + remainingAccounts: params.remainingAccounts, + } + ); + + // Prepend decompress instruction + this.preInstructions([decompressIx], true); + } + /** * Create an instruction based on the current configuration. * @@ -325,6 +582,9 @@ export class MethodsBuilder< await this._accountsResolver.resolve(); } + // Inject decompress if configured + await this._injectDecompressIfNeeded(); + // @ts-ignore return this._ixFn(...this._args, { accounts: this._accounts, @@ -350,6 +610,9 @@ export class MethodsBuilder< await this._accountsResolver.resolve(); } + // Inject decompress if configured + await this._injectDecompressIfNeeded(); + // @ts-ignore return this._txFn(...this._args, { accounts: this._accounts, @@ -430,6 +693,9 @@ export class MethodsBuilder< await this._accountsResolver.resolve(); } + // Inject decompress if configured + await this._injectDecompressIfNeeded(); + // @ts-ignore return this._rpcFn(...this._args, { accounts: this._accounts, diff --git a/ts/yarn.lock b/ts/yarn.lock index af0b205be3..e7d1bf37b8 100644 --- a/ts/yarn.lock +++ b/ts/yarn.lock @@ -513,6 +513,14 @@ resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-11.0.0.tgz#719cf05fcc1abb6533610a2e0f5dd1e61eac14fe" integrity sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ== +"@coral-xyz/borsh@^0.29.0": + version "0.29.0" + resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.29.0.tgz#79f7045df2ef66da8006d47f5399c7190363e71f" + integrity sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ== + dependencies: + bn.js "^5.1.2" + buffer-layout "^1.2.0" + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -822,6 +830,14 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@lightprotocol/compressed-token@link:../../light-protocol/js/compressed-token": + version "0.0.0" + uid "" + +"@lightprotocol/stateless.js@link:../../light-protocol/js/stateless.js": + version "0.0.0" + uid "" + "@native-to-anchor/buffer-layout@=0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@native-to-anchor/buffer-layout/-/buffer-layout-0.1.0.tgz#ff0cb66341bc820b8ee73bb1d1d43bae7e3554b0" @@ -835,6 +851,11 @@ resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.1.tgz#6899660f6fbb97798a6fbd227227c4589a454724" integrity sha512-Rk4SkJFaXZiznFyC/t77Q0NKS4FL7TLJJsVG2V2oiEq3kJVeTdxysEe/yRWSpnWMe808XRDJ+VFh5pt/FN5plw== +"@noble/hashes@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" + integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== + "@noble/hashes@^1.1.2": version "1.1.3" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.3.tgz#360afc77610e0a61f3417e497dcf36862e4f8111" @@ -1522,6 +1543,11 @@ base-x@^3.0.2, base-x@^3.0.6: dependencies: safe-buffer "^5.0.1" +base-x@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-5.0.1.tgz#16bf35254be1df8aca15e36b7c1dda74b2aa6b03" + integrity sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg== + base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -1551,6 +1577,11 @@ bn.js@^5.0.0, bn.js@^5.1.2, bn.js@^5.2.0: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== +bn.js@^5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.2.tgz#82c09f9ebbb17107cd72cb7fd39bd1f9d0aaa566" + integrity sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw== + borsh@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" @@ -1611,6 +1642,13 @@ bs58@^4.0.0, bs58@^4.0.1: dependencies: base-x "^3.0.2" +bs58@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-6.0.0.tgz#a2cda0130558535dd281a2f8697df79caaf425d8" + integrity sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw== + dependencies: + base-x "^5.0.0" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -1636,7 +1674,7 @@ buffer@6.0.1: base64-js "^1.3.1" ieee754 "^1.2.1" -buffer@~6.0.3: +buffer@6.0.3, buffer@~6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -1670,6 +1708,16 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" +camelcase-keys@^9.1.3: + version "9.1.3" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-9.1.3.tgz#6367b2f9ec5724af541f58f0dcfee9b200022e5c" + integrity sha512-Rircqi9ch8AnZscQcsA1C47NFdaO3wukpmIRzYcDOrmvgt78hM/sj5pZhZNec2NM12uk5vTwRHZ4anGcrC4ZTg== + dependencies: + camelcase "^8.0.0" + map-obj "5.0.0" + quick-lru "^6.1.1" + type-fest "^4.3.2" + camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -1680,6 +1728,11 @@ camelcase@^6.2.0, camelcase@^6.3.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +camelcase@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-8.0.0.tgz#c0d36d418753fb6ad9c5e0437579745c1c14a534" + integrity sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA== + caniuse-lite@^1.0.30001400: version "1.0.30001435" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001435.tgz#502c93dbd2f493bee73a408fe98e98fb1dad10b2" @@ -3611,6 +3664,11 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +map-obj@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-5.0.0.tgz#126c98596b63927d7360f287cccc67177aa1938b" + integrity sha512-2L3MIgJynYrZ3TYMriLDLWocz15okFakV6J12HXvMXDHui2x/zgChzg1u9mFFGbbGWE+GsLpQByt4POb9Or+uA== + map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -4026,6 +4084,11 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +quick-lru@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-6.1.2.tgz#e9a90524108629be35287d0b864e7ad6ceb3659e" + integrity sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ== + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -4468,6 +4531,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +superstruct@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-2.0.2.tgz#3f6d32fbdc11c357deff127d591a39b996300c54" + integrity sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A== + superstruct@^0.14.2: version "0.14.2" resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" @@ -4754,6 +4822,11 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^4.3.2: + version "4.41.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" + integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" From fe1041fa79607f232ef0f4ab96d48e60701e4c45 Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Wed, 15 Oct 2025 08:05:04 -0400 Subject: [PATCH 09/20] wip --- lang/syn/src/codegen/accounts/constraints.rs | 1 + lang/syn/src/idl/accounts.rs | 15 + lang/syn/src/lib.rs | 13 + lang/syn/src/parser/accounts/constraints.rs | 25 + ts/packages/anchor/package.json | 5 +- .../anchor/src/program/namespace/index.ts | 12 +- .../anchor/src/program/namespace/methods.ts | 622 ++++--- ts/yarn.lock | 1547 +++++++++-------- 8 files changed, 1305 insertions(+), 935 deletions(-) diff --git a/lang/syn/src/codegen/accounts/constraints.rs b/lang/syn/src/codegen/accounts/constraints.rs index 1eed429943..b1d3a2af39 100644 --- a/lang/syn/src/codegen/accounts/constraints.rs +++ b/lang/syn/src/codegen/accounts/constraints.rs @@ -88,6 +88,7 @@ pub fn linearize(c_group: &ConstraintGroup) -> Vec { realloc, cmint: _, cpda: _, + cctoken: _, } = c_group.clone(); let mut constraints = Vec::new(); diff --git a/lang/syn/src/idl/accounts.rs b/lang/syn/src/idl/accounts.rs index a66957bc71..67e46212bc 100644 --- a/lang/syn/src/idl/accounts.rs +++ b/lang/syn/src/idl/accounts.rs @@ -33,6 +33,21 @@ pub fn gen_idl_build_impl_accounts_struct(accounts: &AccountsStruct) -> TokenStr _ => quote! { vec![] }, }; + // Append compressibility tags to docs based on parsed constraints + let docs = { + let mut d = docs; + let has_cpda = acc.constraints.cpda.is_some(); + let has_cctoken = acc.constraints.cctoken.is_some(); + + if has_cpda { + d = quote! {{ let mut v = #d; v.push("cpda".into()); v }}; + } + if has_cctoken { + d = quote! {{ let mut v = #d; v.push("cctoken".into()); v }}; + } + d + }; + let (address, pda, relations) = if resolution { ( get_address(acc), diff --git a/lang/syn/src/lib.rs b/lang/syn/src/lib.rs index 4fa2ee6dd5..deb69a47cb 100644 --- a/lang/syn/src/lib.rs +++ b/lang/syn/src/lib.rs @@ -710,6 +710,7 @@ pub struct ConstraintGroup { // Compressed constraints pub cmint: Option, pub cpda: Option, + pub cctoken: Option, } impl ConstraintGroup { @@ -828,6 +829,8 @@ pub enum ConstraintToken { CPDAProof(Context), CPDAOutputStateTreeIndex(Context), CPDACompressOnInit(Context), + // CCToken constraint + CCToken(Context), } impl Parse for ConstraintToken { @@ -1246,6 +1249,16 @@ pub struct ConstraintCPDAOutputStateTreeIndex { #[derive(Debug, Clone)] pub struct ConstraintCPDACompressOnInit {} +#[derive(Debug, Clone)] +pub struct ConstraintCCTokenGroup { + pub mint: Option, +} + +#[derive(Debug, Clone)] +pub struct ConstraintCCToken { + pub mint: Option, +} + #[derive(Debug, Clone)] pub struct ConstraintTokenBump { pub bump: Option, diff --git a/lang/syn/src/parser/accounts/constraints.rs b/lang/syn/src/parser/accounts/constraints.rs index 424670d43a..0abdf7e282 100644 --- a/lang/syn/src/parser/accounts/constraints.rs +++ b/lang/syn/src/parser/accounts/constraints.rs @@ -445,6 +445,15 @@ pub fn parse_token(stream: ParseStream) -> ParseResult { ConstraintCPDACompressOnInit {}, )) } + "cctoken" => { + // Marks this account as a compressible compressed-token account + ConstraintToken::CCToken(Context::new( + ident.span(), + ConstraintCCToken { + mint: None, + }, + )) + } "metadata" => { stream.parse::()?; stream.parse::()?; @@ -779,6 +788,8 @@ pub struct ConstraintGroupBuilder<'ty> { pub cpda_proof: Option>, pub cpda_output_state_tree_index: Option>, pub cpda_compress_on_init: Option>, + // CCToken constraint + pub cctoken: Option>, } impl<'ty> ConstraintGroupBuilder<'ty> { @@ -848,6 +859,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { cpda_proof: None, cpda_output_state_tree_index: None, cpda_compress_on_init: None, + cctoken: None, } } @@ -1295,6 +1307,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { cpda_proof, cpda_output_state_tree_index, cpda_compress_on_init, + cctoken, } = self; // Converts Option> -> Option. @@ -1573,6 +1586,9 @@ impl<'ty> ConstraintGroupBuilder<'ty> { } else { None }, + cctoken: cctoken.map(|c| ConstraintCCTokenGroup { + mint: c.into_inner().mint, + }), }) } @@ -1658,6 +1674,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { ConstraintToken::CPDAProof(c) => self.add_cpda_proof(c), ConstraintToken::CPDAOutputStateTreeIndex(c) => self.add_cpda_output_state_tree_index(c), ConstraintToken::CPDACompressOnInit(c) => self.add_cpda_compress_on_init(c), + ConstraintToken::CCToken(c) => self.add_cctoken(c), } } @@ -2195,6 +2212,14 @@ impl<'ty> ConstraintGroupBuilder<'ty> { Ok(()) } + fn add_cctoken(&mut self, c: Context) -> ParseResult<()> { + if self.cctoken.is_some() { + return Err(ParseError::new(c.span(), "cctoken already provided")); + } + self.cctoken.replace(c); + Ok(()) + } + fn add_mut(&mut self, c: Context) -> ParseResult<()> { if self.mutable.is_some() { return Err(ParseError::new(c.span(), "mut already provided")); diff --git a/ts/packages/anchor/package.json b/ts/packages/anchor/package.json index 038975a411..753d2995f5 100644 --- a/ts/packages/anchor/package.json +++ b/ts/packages/anchor/package.json @@ -35,9 +35,10 @@ "dependencies": { "@coral-xyz/anchor-errors": "^0.31.1", "@coral-xyz/borsh": "^0.31.1", - "@lightprotocol/compressed-token": "link:../../../../light-protocol/js/compressed-token", - "@lightprotocol/stateless.js": "link:../../../../light-protocol/js/stateless.js", + "@lightprotocol/compressed-token": "file:../../../../light-protocol/js/compressed-token", + "@lightprotocol/stateless.js": "file:../../../../light-protocol/js/stateless.js", "@noble/hashes": "^1.3.1", + "@solana/spl-token": ">=0.3.9", "@solana/web3.js": "^1.69.0", "bn.js": "^5.1.2", "bs58": "^4.0.1", diff --git a/ts/packages/anchor/src/program/namespace/index.ts b/ts/packages/anchor/src/program/namespace/index.ts index b294282c61..112254980e 100644 --- a/ts/packages/anchor/src/program/namespace/index.ts +++ b/ts/packages/anchor/src/program/namespace/index.ts @@ -56,12 +56,20 @@ export default class NamespaceFactory { ? AccountFactory.build(idl, coder, programId, provider) : ({} as AccountNamespace); + // First pass: build all instruction functions + const allInstructionFns: Record = {}; idl.instructions.forEach((idlIx) => { const ixItem = InstructionFactory.build( idlIx, (ixName, ix) => coder.instruction.encode(ixName, ix), programId ); + allInstructionFns[idlIx.name] = ixItem; + }); + + // Second pass: build all other namespaces with access to all instruction functions + idl.instructions.forEach((idlIx) => { + const ixItem = allInstructionFns[idlIx.name]; const txItem = TransactionFactory.build(idlIx, ixItem); const rpcItem = RpcFactory.build(idlIx, txItem, idlErrors, provider); const simulateItem = SimulateFactory.build( @@ -85,7 +93,9 @@ export default class NamespaceFactory { viewItem, account, idl.types || [], - getCustomResolver?.(idlIx) + getCustomResolver?.(idlIx), + idl, + allInstructionFns ); const name = idlIx.name; diff --git a/ts/packages/anchor/src/program/namespace/methods.ts b/ts/packages/anchor/src/program/namespace/methods.ts index d1fbc43f68..31dd27b1c2 100644 --- a/ts/packages/anchor/src/program/namespace/methods.ts +++ b/ts/packages/anchor/src/program/namespace/methods.ts @@ -1,4 +1,5 @@ import { + AccountInfo, AccountMeta, ConfirmOptions, PublicKey, @@ -7,6 +8,7 @@ import { TransactionInstruction, TransactionSignature, } from "@solana/web3.js"; +import { Buffer } from "buffer"; import { Idl, IdlInstructionAccount, @@ -34,92 +36,73 @@ import { MethodsFn, } from "./types.js"; import { ViewFn } from "./views.js"; -import { createRpc, type Rpc } from "@lightprotocol/stateless.js"; import { + createRpc, + type Rpc, + getDefaultAddressTreeInfo, + TreeType, + VERSION, + featureFlags, + deriveAddressV2, + MerkleContext, + parseTokenData, + TreeInfo, + deriveCompressionConfigAddress, + getRegisteredProgramPda, + deriveTokenProgramConfig, +} from "@lightprotocol/stateless.js"; +import { + AccountInput, buildDecompressParams, + CompressedTokenProgram, getAccountInterface, + CTOKEN_RENT_SPONSOR, } from "@lightprotocol/compressed-token"; +featureFlags.version = VERSION.V2; /** - * Check if an IDL type has compression_info field (is compressible) + * Infer account type and variant from IDL for compression. + * Returns { accountType, tokenVariant? } based STRICTLY on IDL definitions. + * NO FALLBACKS OR HEURISTICS - if not found in IDL, returns null. */ -function isCompressibleType(typeName: string, idlTypes: IdlTypeDef[]): boolean { - const type = idlTypes.find((t) => t.name === typeName); - if (!type) return false; - - if (type.type.kind === "struct") { - return ( - type.type.fields?.some( - (f) => f.name === "compression_info" || f.name === "compressionInfo" - ) ?? false - ); - } +function inferAccountTypeFromIDL( + accountName: string, + idl: Idl | undefined, + idlTypes: IdlTypeDef[] +): { accountType: string; tokenVariant?: string } | null { + if (!idl) return null; - // For enums, check if any variant has compression_info - if (type.type.kind === "enum") { - return ( - type.type.variants?.some((v) => - v.fields?.some( - (f) => - (f as any).name === "compression_info" || - (f as any).name === "compressionInfo" - ) - ) ?? false - ); + // 1. Check if it's a named program account in idl.accounts + const accountDef = idl.accounts?.find((acc) => acc.name === accountName); + if (accountDef) { + return { accountType: accountName }; } - return false; -} - -/** - * Get the defined type name from an account - */ -function getDefinedTypeName(account: IdlInstructionAccountItem): string | null { - if (!("type" in account)) return null; - const accType: any = (account as any).type; - if (accType && typeof accType === "object" && "defined" in accType) { - const defined: any = accType.defined; - if (typeof defined === "string") return defined; - if (defined && typeof defined === "object" && "name" in defined) - return defined.name as string; - } - return null; -} + // 2. Check if it matches a compressed token variant enum + // Look for the enum type that defines token variants (e.g., cTokenAccountVariant) + const compressedVariantType = idlTypes.find( + (t) => + t.name.toLowerCase().includes("compressedaccountvariant") || + t.name.toLowerCase().includes("ctokenaccountvariant") || + t.name.toLowerCase().includes("tokenvariant") + ); -/** - * Detect if type is CTokenData by checking if it's an enum with token-like variants - */ -function isCTokenDataType(typeName: string, idlTypes: IdlTypeDef[]): boolean { - const type = idlTypes.find((t) => t.name === typeName); - if (!type || type.type.kind !== "enum") return false; - - // Check if it has typical cToken variant names - const variants = type.type.variants?.map((v) => v.name.toLowerCase()) ?? []; - const tokenKeywords = ["vault", "token", "account", "mint"]; - return variants.some((v) => tokenKeywords.some((kw) => v.includes(kw))); -} + if (compressedVariantType && compressedVariantType.type.kind === "enum") { + const variants = compressedVariantType.type.variants ?? []; + const matchedVariant = variants.find( + (v) => v.name.toLowerCase() === accountName.toLowerCase() + ); -/** - * Extract enum variant from account name for CTokenData - * e.g., "lpVault" -> "lpVault", "token0Vault" -> "token0Vault" - */ -function extractTokenVariant( - accountName: string, - typeName: string, - idlTypes: IdlTypeDef[] -): string | undefined { - const type = idlTypes.find((t) => t.name === typeName); - if (!type || type.type.kind !== "enum") return undefined; - - // Try to match account name to variant name (case-insensitive) - const variants = type.type.variants ?? []; - const matchedVariant = variants.find( - (v) => - accountName.toLowerCase().includes(v.name.toLowerCase()) || - v.name.toLowerCase().includes(accountName.toLowerCase()) - ); + if (matchedVariant) { + return { + accountType: "cTokenData", + tokenVariant: matchedVariant.name, + }; + } + } - return matchedVariant?.name; + // NOT FOUND IN IDL - return null (don't guess!) + return null; } export type MethodsNamespace< @@ -139,7 +122,9 @@ export class MethodsBuilderFactory { viewFn: ViewFn | undefined, accountNamespace: AccountNamespace, idlTypes: IdlTypeDef[], - customResolver?: CustomAccountResolver + customResolver?: CustomAccountResolver, + idl?: IDL, + allInstructionFns?: Record> ): MethodsFn> { return (...args) => new MethodsBuilder( @@ -154,7 +139,9 @@ export class MethodsBuilderFactory { idlIx, accountNamespace, idlTypes, - customResolver + customResolver, + idl, + allInstructionFns ); } } @@ -239,10 +226,63 @@ export function flattenPartialAccounts( return toReturn; } +// Scan the IDL for compressible accounts using explicit tags in account docs. +// - "cpda" tag indicates a compressible program-derived account +// - "cctoken" tag indicates a compressible token account (CompressedTokenProgram) +function scanCompressibleNames(idl: Idl | undefined): { + cpda: Set; + cctoken: Set; +} { + const cpda = new Set(); + const cctoken = new Set(); + if (!idl) return { cpda, cctoken }; + + const visitAccounts = (items: readonly IdlInstructionAccountItem[]) => { + for (const item of items) { + if ("accounts" in item) { + visitAccounts(item.accounts); + continue; + } + const acc = item as IdlInstructionAccount; + const docs = (acc.docs || []).map((d) => d.toLowerCase()); + if (docs.some((d) => d.includes("cctoken"))) { + cctoken.add(acc.name); + } + if (docs.some((d) => d.includes("cpda"))) { + cpda.add(acc.name); + } + } + }; + + for (const ix of idl.instructions) { + visitAccounts(ix.accounts); + } + + return { cpda, cctoken }; +} + +// Helper to extract decompress instruction accounts type +type DecompressAccounts = Extract< + AllInstructions, + { name: "decompressAccountsIdempotent" } +> extends { accounts: readonly any[] } + ? Extract< + AllInstructions, + { name: "decompressAccountsIdempotent" } + >["accounts"][number] + : never; + +// Helper to extract the decompress instruction type +type DecompressInstruction = Extract< + AllInstructions, + { name: "decompressAccountsIdempotent" } +>; + export class MethodsBuilder< IDL extends Idl, I extends AllInstructions, - A extends I["accounts"][number] = I["accounts"][number] + A extends I["accounts"][number] = I["accounts"][number], + D extends DecompressAccounts = DecompressAccounts > { private _accounts: AccountsGeneric = {}; private _remainingAccounts: Array = []; @@ -252,6 +292,12 @@ export class MethodsBuilder< private _accountsResolver: AccountsResolver; private _resolveAccounts: boolean = true; private _enableAutoDecompress: boolean = false; + private _decompressAccounts?: AccountsGeneric; + private _idl?: IDL; + private _idlTypes: IdlTypeDef[]; + private _allInstructionFns?: Record>; + private _programId: PublicKey; + private _accountNamespace: AccountNamespace; constructor( private _args: Array, @@ -265,8 +311,15 @@ export class MethodsBuilder< idlIx: AllInstructions, accountNamespace: AccountNamespace, idlTypes: IdlTypeDef[], - customResolver?: CustomAccountResolver + customResolver?: CustomAccountResolver, + idl?: IDL, + allInstructionFns?: Record> ) { + this._programId = programId; + this._idl = idl; + this._idlTypes = idlTypes; + this._allInstructionFns = allInstructionFns; + this._accountNamespace = accountNamespace; this._accountsResolver = new AccountsResolver( _args, this._accounts, @@ -383,26 +436,45 @@ export class MethodsBuilder< } /** - * Enable automatic decompression for all compressible accounts. - * - * Automatically detects compressible accounts from IDL, fetches their data, - * and injects decompress instructions if any are compressed. + * Enable automatic decompression for compressible accounts. * - * No configuration required - everything is derived from the IDL! + * Requires ALL accounts needed by decompressAccountsIdempotent instruction to be provided. + * Automatically infers account types and variants from IDL, fetches compression state, + * and injects decompress instruction if needed. * + * @param accounts - All accounts for decompressAccountsIdempotent instruction. * @returns this builder for chaining * * @example * ```ts * await program.methods * .swap(amount) - * .decompressIfNeeded() // That's it! - * .accounts({ poolState, lpVault, token0Vault, ... }) + * .decompressIfNeeded({ + * feePayer: owner.publicKey, + * config: compressionConfig, + * rentPayer: owner.publicKey, + * ctokenRentSponsor: CTOKEN_RENT_SPONSOR, + * ctokenProgram: CompressedTokenProgram.programId, + * ctokenCpiAuthority: CompressedTokenProgram.deriveCpiAuthorityPda, + * ctokenConfig, + * ammConfig, + * poolState, + * token0Mint, + * token1Mint, + * lpMint, + * token0Vault, + * token1Vault, + * lpVault, + * }) + * .accounts({ ... }) * .rpc(); * ``` */ - public decompressIfNeeded() { + public decompressIfNeeded( + accounts: Accounts & { [name: string]: Address } + ) { this._enableAutoDecompress = true; + this._decompressAccounts = flattenPartialAccounts(accounts as any, true); return this; } @@ -426,146 +498,300 @@ export class MethodsBuilder< } /** - * Automatically detect and fetch compressible accounts based on IDL. - * Returns account inputs for buildDecompressParams. + * Fetch and check compression state for provided accounts. + * Returns AccountInput[] for buildDecompressParams. */ - private async _detectAndFetchCompressibleAccounts(): Promise { - const idlIx = this._accountsResolver["_idlIx"]; - const idlTypes = this._accountsResolver["_idlTypes"]; - const provider = this._accountsResolver["_provider"] as Provider & { - rpc?: any; - }; - - // Find all compressible account definitions from IDL - const compressibleAccounts: Array<{ - name: string; - address: PublicKey; - typeName: string; - isCToken: boolean; - variant?: string; - }> = []; - - // Recursively process accounts (handles nested account structures) - const processAccounts = ( - accounts: readonly IdlInstructionAccountItem[] - ) => { - for (const account of accounts) { - if ("accounts" in account) { - // Nested accounts struct - processAccounts(account.accounts); - continue; - } + private async _fetchCompressibleAccounts( + accountsToCheck: Array<{ name: string; address: PublicKey }> + ): Promise { + if (accountsToCheck.length === 0) return []; + + const programId = this._programId; + const rpc = createRpc(); + + const defaultAddressTreeInfo = getDefaultAddressTreeInfo(); + + const accountInputs: AccountInput[] = []; + + // Determine compressible names by tags once + const tags = scanCompressibleNames(this._idl); + for (const { name, address } of accountsToCheck) { + // Only consider accounts explicitly tagged in IDL + const isCpda = tags.cpda.has(name); + const isCCToken = tags.cctoken.has(name); + if (!isCpda && !isCCToken) { + console.log( + `[decompressIfNeeded] Skipping account '${name}' (no 'cpda' or 'cctoken' tag)` + ); + continue; + } - const typeName = getDefinedTypeName(account); - if (!typeName) continue; + // Try fetching as CPDA + // @ts-ignore + const cpdaResult = await rpc.getAccountInfoInterface( + address, + programId, + //@ts-ignore + defaultAddressTreeInfo + ); - // Check if this type is compressible - if (!isCompressibleType(typeName, idlTypes)) continue; + if (cpdaResult && cpdaResult.merkleContext && cpdaResult.isCompressed) { + // It's a compressed CPDA + if ( + isCCToken || + cpdaResult.accountInfo.owner.equals(CompressedTokenProgram.programId) + ) { + // It's a compressed token account + try { + const parsed = parseTokenData(cpdaResult.accountInfo.data); + if (parsed) { + accountInputs.push({ + address, + info: { + accountInfo: cpdaResult.accountInfo, + parsed, + merkleContext: cpdaResult.merkleContext, + }, + accountType: "cTokenData", + tokenVariant: name, + }); + } + } catch { + // Not a token account, ignore + } + } else { + // It's a compressed program account + let parsed = null; + const accountClient = (this._accountNamespace as any)[name]; + if (accountClient?.coder) { + try { + parsed = accountClient.coder.accounts.decode( + name, + cpdaResult.accountInfo.data + ); + } catch { + try { + parsed = accountClient.coder.accounts.decodeAny( + cpdaResult.accountInfo.data + ); + } catch { + // Parsing failed, use null + } + } + } + + accountInputs.push({ + address, + info: { + accountInfo: cpdaResult.accountInfo, + parsed, + merkleContext: cpdaResult.merkleContext, + }, + accountType: name, // cpda accountType equals the IDL account name + }); + } + continue; + } - const address = translateAddress( - this._accounts[account.name] as Address - ); - if (!address) { - console.warn( - `Compressible account ${account.name} not found in accounts` + // Fallback: try as compressed token via getAccountInterface + if (isCCToken) { + try { + const tokenRes = await getAccountInterface( + rpc, + address, + undefined, + CompressedTokenProgram.programId ); - continue; + if (tokenRes && (tokenRes as any).merkleContext) { + accountInputs.push({ + address, + info: tokenRes as any, + accountType: "cTokenData", + tokenVariant: name, + }); + } + } catch { + // Not a compressed token } - - const isCToken = isCTokenDataType(typeName, idlTypes); - const variant = isCToken - ? extractTokenVariant(account.name, typeName, idlTypes) - : undefined; - - compressibleAccounts.push({ - name: account.name, - address, - typeName, - isCToken, - variant, - }); } - }; - - processAccounts(idlIx.accounts); - - if (compressibleAccounts.length === 0) { - return []; - } - - // Ensure Rpc instance (lightprotocol) is available - let rpc: Rpc = (provider as any).rpc; - if (!rpc) { - rpc = createRpc(provider.connection); - (provider as any).rpc = rpc; } - // Batch fetch all compressible accounts in parallel - - const fetchPromises = compressibleAccounts.map(async (acc) => { - try { - const info = await getAccountInterface(rpc, acc.address); - - return { - address: acc.address, - info: { - accountInfo: info.accountInfo, - parsed: info.parsed, - merkleContext: info.merkleContext, - }, - accountType: acc.isCToken ? "cTokenData" : acc.typeName, - tokenVariant: acc.variant, - }; - } catch (err) { - console.warn(`Failed to fetch compressible account ${acc.name}:`, err); - return null; - } + console.log( + `[decompressIfNeeded] Found ${accountInputs.length} compressed account(s):` + ); + accountInputs.forEach((acc, idx) => { + console.log( + ` [${idx}] ${acc.address.toBase58()} - type: ${ + acc.accountType + }, variant: ${acc.tokenVariant || "N/A"}` + ); }); - const results = await Promise.all(fetchPromises); - return results.filter((r) => r !== null); + return accountInputs; } /** * Internal method to inject decompress instruction if needed. - * Fully automatic based on IDL analysis. */ private async _injectDecompressIfNeeded(): Promise { - if (!this._enableAutoDecompress) return; + if (!this._enableAutoDecompress || !this._decompressAccounts) return; - // Detect and fetch compressible accounts - const accountInputs = await this._detectAndFetchCompressibleAccounts(); + if (!this._idl || !this._allInstructionFns) { + console.warn( + "[decompressIfNeeded] Missing IDL or instruction functions." + ); + return; + } - if (accountInputs.length === 0) return; + const decompressInstruction = this._idl.instructions.find( + (ix: any) => ix.name === "decompressAccountsIdempotent" + ); - const programId = this._accountsResolver["_programId"]; - const provider = this._accountsResolver["_provider"] as Provider & { - rpc?: Rpc; - }; - // Prefer a cached Rpc on provider; otherwise construct one from the Connection endpoint - let rpc: Rpc = provider.rpc!; - if (!rpc) { - rpc = createRpc(provider.connection); - (provider as any).rpc = rpc; + if (!decompressInstruction) { + console.warn( + "[decompressIfNeeded] decompressAccountsIdempotent instruction not found in IDL." + ); + return; + } + + console.log("[decompressIfNeeded] Starting auto-decompression..."); + + // Known non-compressible system accounts to skip + const SKIP_ACCOUNTS = new Set([ + "feePayer", + "config", + "rentPayer", + "ctokenRentSponsor", + "ctokenProgram", + "ctokenCpiAuthority", + "ctokenConfig", + "compressionAuthority", + "ctokenCompressionAuthority", + ]); + + // Collect accounts to check for compression + const accountsToCheck: Array<{ name: string; address: PublicKey }> = []; + for (const [name, addr] of Object.entries(this._decompressAccounts)) { + if (SKIP_ACCOUNTS.has(name)) continue; + + try { + const pubkey = translateAddress(addr as Address); + accountsToCheck.push({ name, address: pubkey }); + } catch { + console.warn( + `[decompressIfNeeded] Invalid address for ${name}, skipping` + ); + } + } + + // Fetch compression state for all accounts + const accountInputs = await this._fetchCompressibleAccounts( + accountsToCheck + ); + + if (accountInputs.length === 0) { + console.log( + "[decompressIfNeeded] No compressed accounts found. Skipping decompress." + ); + return; } - // Build decompress params using the helper + // Build decompress params + const programId = this._programId; + const rpc = createRpc(); + + console.log( + `[decompressIfNeeded] Building decompress params for ${accountInputs.length} compressed account(s)` + ); + console.log( + `[decompressIfNeeded] Calling buildDecompressParams with inputs:`, + // JSON.stringify( + accountInputs.map((ai: any) => ({ + address: ai.address.toBase58(), + accountType: ai.accountType, + info: ai.info, + tokenVariant: ai.tokenVariant || undefined, + hasMerkleContext: !!ai.info?.merkleContext, + hasParsed: !!ai.info?.parsed, + })) + // null, + // 2 + // ) + ); const params = await buildDecompressParams(programId, rpc, accountInputs); - if (!params) return; // No compressed accounts - - // Use Anchor's own instruction builder to create decompressAccountsIdempotent - // This instruction exists in the IDL (generated by the proc macro) - const decompressIx = await this._ixFn["decompressAccountsIdempotent"]( - params.proofOption, - params.compressedAccounts, - params.systemAccountsOffset, - { - accounts: this._accounts, - remainingAccounts: params.remainingAccounts, + if (!params) { + console.log("[decompressIfNeeded] buildDecompressParams returned null."); + return; + } + + console.log( + `[decompressIfNeeded] Built params with ${params.compressedAccounts.length} compressed account(s), ${params.remainingAccounts.length} remaining account(s)` + ); + console.log( + `[decompressIfNeeded] compressedAccounts:`, + JSON.stringify(params.compressedAccounts, null, 2) + ); + console.log( + `[decompressIfNeeded] systemAccountsOffset: ${params.systemAccountsOffset}` + ); + + // Unwrap array-wrapped variant data (SDK packs as arrays, Anchor IDL expects structs) + const unwrappedCompressedAccounts = params.compressedAccounts.map( + (acc: any) => { + if (!acc?.data) return acc; + + const unwrappedData: any = {}; + for (const key in acc.data) { + const value = acc.data[key]; + unwrappedData[key] = + Array.isArray(value) && value.length === 1 ? value[0] : value; + } + + return { ...acc, data: unwrappedData }; } ); + // Build the decompress instruction + const decompressIxFn = this._allInstructionFns[ + "decompressAccountsIdempotent" + ] as InstructionFn>; + + if (!decompressIxFn) { + console.warn( + "[decompressIfNeeded] decompressAccountsIdempotent instruction function not found" + ); + return; + } + + console.log( + `[decompressIfNeeded] Building instruction with accounts:`, + Object.keys(this._decompressAccounts) + ); + + let decompressIx; + try { + decompressIx = decompressIxFn( + params.proofOption, + unwrappedCompressedAccounts, + params.systemAccountsOffset, + { + accounts: this._decompressAccounts as Accounts, + remainingAccounts: params.remainingAccounts, + } + ); + } catch (error) { + console.error( + `[decompressIfNeeded] ERROR building decompress instruction:`, + (error as Error).message + ); + throw error; + } + + console.log( + `[decompressIfNeeded] SUCCESS! Decompress instruction built. Prepending to transaction.` + ); + // Prepend decompress instruction this.preInstructions([decompressIx], true); } diff --git a/ts/yarn.lock b/ts/yarn.lock index e7d1bf37b8..b790faabec 100644 --- a/ts/yarn.lock +++ b/ts/yarn.lock @@ -4,7 +4,7 @@ "@ampproject/remapping@^2.1.0": version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: "@jridgewell/gen-mapping" "^0.1.0" @@ -12,21 +12,21 @@ "@babel/code-frame@7.12.11": version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: "@babel/highlight" "^7.18.6" "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1": version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz" integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== dependencies: "@babel/highlight" "^7.24.2" @@ -34,12 +34,12 @@ "@babel/compat-data@^7.20.0": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz" integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz" integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== dependencies: "@ampproject/remapping" "^2.1.0" @@ -60,7 +60,7 @@ "@babel/generator@^7.20.5", "@babel/generator@^7.7.2": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz" integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== dependencies: "@babel/types" "^7.20.5" @@ -69,7 +69,7 @@ "@babel/generator@^7.24.1": version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz" integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== dependencies: "@babel/types" "^7.24.0" @@ -79,7 +79,7 @@ "@babel/helper-compilation-targets@^7.20.0": version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz" integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== dependencies: "@babel/compat-data" "^7.20.0" @@ -89,17 +89,17 @@ "@babel/helper-environment-visitor@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== "@babel/helper-environment-visitor@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== "@babel/helper-function-name@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: "@babel/template" "^7.22.15" @@ -107,21 +107,21 @@ "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: "@babel/types" "^7.22.5" "@babel/helper-module-imports@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-module-transforms@^7.20.2": version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz" integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" @@ -135,58 +135,58 @@ "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0": version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== "@babel/helper-simple-access@^7.20.2": version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: "@babel/types" "^7.20.2" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" "@babel/helper-string-parser@^7.19.4": version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== "@babel/helper-string-parser@^7.23.4": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz" integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== "@babel/helper-validator-option@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== "@babel/helpers@^7.20.5": version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz" integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== dependencies: "@babel/template" "^7.18.10" @@ -195,7 +195,7 @@ "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== dependencies: "@babel/helper-validator-identifier" "^7.18.6" @@ -204,7 +204,7 @@ "@babel/highlight@^7.24.2": version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz" integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== dependencies: "@babel/helper-validator-identifier" "^7.22.20" @@ -214,115 +214,115 @@ "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz" integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== "@babel/parser@^7.24.0", "@babel/parser@^7.24.1": version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz" integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz" integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== dependencies: "@babel/helper-plugin-utils" "^7.19.0" "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.2": version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz" integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== dependencies: regenerator-runtime "^0.13.11" "@babel/template@^7.18.10", "@babel/template@^7.3.3": version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== dependencies: "@babel/code-frame" "^7.18.6" @@ -331,7 +331,7 @@ "@babel/template@^7.22.15": version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz" integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== dependencies: "@babel/code-frame" "^7.23.5" @@ -340,7 +340,7 @@ "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.7.2": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz" integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== dependencies: "@babel/code-frame" "^7.24.1" @@ -356,7 +356,7 @@ "@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz" integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== dependencies: "@babel/helper-string-parser" "^7.19.4" @@ -365,7 +365,7 @@ "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0": version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz" integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== dependencies: "@babel/helper-string-parser" "^7.23.4" @@ -374,12 +374,12 @@ "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@commitlint/cli@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-11.0.0.tgz#698199bc52afed50aa28169237758fa14a67b5d3" + resolved "https://registry.npmjs.org/@commitlint/cli/-/cli-11.0.0.tgz" integrity sha512-YWZWg1DuqqO5Zjh7vUOeSX76vm0FFyz4y0cpGMFhrhvUi5unc4IVfCXZ6337R9zxuBtmveiRuuhQqnRRer+13g== dependencies: "@babel/runtime" "^7.11.2" @@ -397,14 +397,14 @@ "@commitlint/config-conventional@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-11.0.0.tgz#3fa300a1b639273946de3c3f15e1cda518333422" + resolved "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-11.0.0.tgz" integrity sha512-SNDRsb5gLuDd2PL83yCOQX6pE7gevC79UPFx+GLbLfw6jGnnbO9/tlL76MLD8MOViqGbo7ZicjChO9Gn+7tHhA== dependencies: conventional-changelog-conventionalcommits "^4.3.1" "@commitlint/ensure@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-11.0.0.tgz#3e796b968ab5b72bc6f8a6040076406306c987fb" + resolved "https://registry.npmjs.org/@commitlint/ensure/-/ensure-11.0.0.tgz" integrity sha512-/T4tjseSwlirKZdnx4AuICMNNlFvRyPQimbZIOYujp9DSO6XRtOy9NrmvWujwHsq9F5Wb80QWi4WMW6HMaENug== dependencies: "@commitlint/types" "^11.0.0" @@ -412,12 +412,12 @@ "@commitlint/execute-rule@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz#3ed60ab7a33019e58d90e2d891b75d7df77b4b4d" + resolved "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz" integrity sha512-g01p1g4BmYlZ2+tdotCavrMunnPFPhTzG1ZiLKTCYrooHRbmvqo42ZZn4QMStUEIcn+jfLb6BRZX3JzIwA1ezQ== "@commitlint/format@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-11.0.0.tgz#ac47b0b9ca46540c0082c721b290794e67bdc51b" + resolved "https://registry.npmjs.org/@commitlint/format/-/format-11.0.0.tgz" integrity sha512-bpBLWmG0wfZH/svzqD1hsGTpm79TKJWcf6EXZllh2J/LSSYKxGlv967lpw0hNojme0sZd4a/97R3qA2QHWWSLg== dependencies: "@commitlint/types" "^11.0.0" @@ -425,7 +425,7 @@ "@commitlint/is-ignored@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-11.0.0.tgz#7b803eda56276dbe7fec51eb1510676198468f39" + resolved "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-11.0.0.tgz" integrity sha512-VLHOUBN+sOlkYC4tGuzE41yNPO2w09sQnOpfS+pSPnBFkNUUHawEuA44PLHtDvQgVuYrMAmSWFQpWabMoP5/Xg== dependencies: "@commitlint/types" "^11.0.0" @@ -433,7 +433,7 @@ "@commitlint/lint@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-11.0.0.tgz#01e062cd1b0e7c3d756aa2c246462e0b6a3348a4" + resolved "https://registry.npmjs.org/@commitlint/lint/-/lint-11.0.0.tgz" integrity sha512-Q8IIqGIHfwKr8ecVZyYh6NtXFmKw4YSEWEr2GJTB/fTZXgaOGtGFZDWOesCZllQ63f1s/oWJYtVv5RAEuwN8BQ== dependencies: "@commitlint/is-ignored" "^11.0.0" @@ -443,7 +443,7 @@ "@commitlint/load@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-11.0.0.tgz#f736562f0ffa7e773f8808fea93319042ee18211" + resolved "https://registry.npmjs.org/@commitlint/load/-/load-11.0.0.tgz" integrity sha512-t5ZBrtgvgCwPfxmG811FCp39/o3SJ7L+SNsxFL92OR4WQxPcu6c8taD0CG2lzOHGuRyuMxZ7ps3EbngT2WpiCg== dependencies: "@commitlint/execute-rule" "^11.0.0" @@ -456,12 +456,12 @@ "@commitlint/message@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-11.0.0.tgz#83554c3cbbc884fd07b473593bc3e94bcaa3ee05" + resolved "https://registry.npmjs.org/@commitlint/message/-/message-11.0.0.tgz" integrity sha512-01ObK/18JL7PEIE3dBRtoMmU6S3ecPYDTQWWhcO+ErA3Ai0KDYqV5VWWEijdcVafNpdeUNrEMigRkxXHQLbyJA== "@commitlint/parse@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-11.0.0.tgz#d18b08cf67c35d02115207d7009306a2e8e7c901" + resolved "https://registry.npmjs.org/@commitlint/parse/-/parse-11.0.0.tgz" integrity sha512-DekKQAIYWAXIcyAZ6/PDBJylWJ1BROTfDIzr9PMVxZRxBPc1gW2TG8fLgjZfBP5mc0cuthPkVi91KQQKGri/7A== dependencies: conventional-changelog-angular "^5.0.0" @@ -469,7 +469,7 @@ "@commitlint/read@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-11.0.0.tgz#f24240548c63587bba139fa5a364cab926077016" + resolved "https://registry.npmjs.org/@commitlint/read/-/read-11.0.0.tgz" integrity sha512-37V0V91GSv0aDzMzJioKpCoZw6l0shk7+tRG8RkW1GfZzUIytdg3XqJmM+IaIYpaop0m6BbZtfq+idzUwJnw7g== dependencies: "@commitlint/top-level" "^11.0.0" @@ -478,7 +478,7 @@ "@commitlint/resolve-extends@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-11.0.0.tgz#158ecbe27d4a2a51d426111a01478e216fbb1036" + resolved "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-11.0.0.tgz" integrity sha512-WinU6Uv6L7HDGLqn/To13KM1CWvZ09VHZqryqxXa1OY+EvJkfU734CwnOEeNlSCK7FVLrB4kmodLJtL1dkEpXw== dependencies: import-fresh "^3.0.0" @@ -488,7 +488,7 @@ "@commitlint/rules@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-11.0.0.tgz#bdb310cc6fc55c9f8d7d917a22b69055c535c375" + resolved "https://registry.npmjs.org/@commitlint/rules/-/rules-11.0.0.tgz" integrity sha512-2hD9y9Ep5ZfoNxDDPkQadd2jJeocrwC4vJ98I0g8pNYn/W8hS9+/FuNpolREHN8PhmexXbkjrwyQrWbuC0DVaA== dependencies: "@commitlint/ensure" "^11.0.0" @@ -498,19 +498,19 @@ "@commitlint/to-lines@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-11.0.0.tgz#86dea151c10eea41e39ea96fa4de07839258a7fe" + resolved "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-11.0.0.tgz" integrity sha512-TIDTB0Y23jlCNubDROUVokbJk6860idYB5cZkLWcRS9tlb6YSoeLn1NLafPlrhhkkkZzTYnlKYzCVrBNVes1iw== "@commitlint/top-level@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-11.0.0.tgz#bb2d1b6e5ed3be56874633b59e1f7de118c32783" + resolved "https://registry.npmjs.org/@commitlint/top-level/-/top-level-11.0.0.tgz" integrity sha512-O0nFU8o+Ws+py5pfMQIuyxOtfR/kwtr5ybqTvR+C2lUPer2x6lnQU+OnfD7hPM+A+COIUZWx10mYQvkR3MmtAA== dependencies: find-up "^5.0.0" "@commitlint/types@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-11.0.0.tgz#719cf05fcc1abb6533610a2e0f5dd1e61eac14fe" + resolved "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz" integrity sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ== "@coral-xyz/borsh@^0.29.0": @@ -523,14 +523,14 @@ "@cspotcode/source-map-support@^0.8.0": version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" "@eslint/eslintrc@^0.4.3": version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" @@ -545,7 +545,7 @@ "@humanwhocodes/config-array@^0.5.0": version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz" integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== dependencies: "@humanwhocodes/object-schema" "^1.2.0" @@ -554,12 +554,12 @@ "@humanwhocodes/object-schema@^1.2.0": version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -570,12 +570,12 @@ "@istanbuljs/schema@^0.1.2": version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/console@^27.5.1": version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" + resolved "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz" integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== dependencies: "@jest/types" "^27.5.1" @@ -587,7 +587,7 @@ "@jest/core@^27.3.1", "@jest/core@^27.5.1": version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" + resolved "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz" integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== dependencies: "@jest/console" "^27.5.1" @@ -621,7 +621,7 @@ "@jest/environment@^27.5.1": version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz" integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== dependencies: "@jest/fake-timers" "^27.5.1" @@ -631,7 +631,7 @@ "@jest/fake-timers@^27.5.1": version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz" integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== dependencies: "@jest/types" "^27.5.1" @@ -643,7 +643,7 @@ "@jest/globals@^27.5.1": version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz" integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== dependencies: "@jest/environment" "^27.5.1" @@ -652,7 +652,7 @@ "@jest/reporters@^27.5.1": version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz" integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== dependencies: "@bcoe/v8-coverage" "^0.2.3" @@ -683,7 +683,7 @@ "@jest/source-map@^27.5.1": version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz" integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== dependencies: callsites "^3.0.0" @@ -692,7 +692,7 @@ "@jest/test-result@^27.5.1": version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz" integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== dependencies: "@jest/console" "^27.5.1" @@ -702,7 +702,7 @@ "@jest/test-sequencer@^27.3.1", "@jest/test-sequencer@^27.5.1": version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz" integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== dependencies: "@jest/test-result" "^27.5.1" @@ -712,7 +712,7 @@ "@jest/transform@^27.5.1": version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz" integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== dependencies: "@babel/core" "^7.1.0" @@ -733,7 +733,7 @@ "@jest/types@^27.2.5", "@jest/types@^27.5.1": version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + resolved "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz" integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" @@ -744,7 +744,7 @@ "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== dependencies: "@jridgewell/set-array" "^1.0.0" @@ -752,7 +752,7 @@ "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== dependencies: "@jridgewell/set-array" "^1.0.1" @@ -761,7 +761,7 @@ "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: "@jridgewell/set-array" "^1.2.1" @@ -770,27 +770,27 @@ "@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/source-map@^0.3.2": version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz" integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== dependencies: "@jridgewell/gen-mapping" "^0.3.0" @@ -798,17 +798,17 @@ "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" @@ -816,7 +816,7 @@ "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -824,23 +824,32 @@ "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@lightprotocol/compressed-token@link:../../light-protocol/js/compressed-token": - version "0.0.0" - uid "" +"@lightprotocol/compressed-token@file:../../light-protocol/js/compressed-token": + version "0.22.1-alpha.0" + dependencies: + "@coral-xyz/borsh" "^0.29.0" + bn.js "^5.2.1" + buffer "6.0.3" -"@lightprotocol/stateless.js@link:../../light-protocol/js/stateless.js": - version "0.0.0" - uid "" +"@lightprotocol/stateless.js@file:../../light-protocol/js/stateless.js": + version "0.22.1-alpha.0" + dependencies: + "@coral-xyz/borsh" "^0.29.0" + "@noble/hashes" "1.5.0" + bs58 "^6.0.0" + buffer "6.0.3" + buffer-layout "^1.2.2" + superstruct "2.0.2" "@native-to-anchor/buffer-layout@=0.1.0": version "0.1.0" - resolved "https://registry.yarnpkg.com/@native-to-anchor/buffer-layout/-/buffer-layout-0.1.0.tgz#ff0cb66341bc820b8ee73bb1d1d43bae7e3554b0" + resolved "https://registry.npmjs.org/@native-to-anchor/buffer-layout/-/buffer-layout-0.1.0.tgz" integrity sha512-7Ykz9KRAm53XqHj5blDUKPX+OXAPO4GZBW4zJhfHGIAbzmqsUFh9kMqR66Bak3mp6wyv1OVTwSr8ZGHKswPxDg== dependencies: "@solana/buffer-layout" "=4.0.0" @@ -848,7 +857,7 @@ "@noble/ed25519@^1.7.0": version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.1.tgz#6899660f6fbb97798a6fbd227227c4589a454724" + resolved "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.1.tgz" integrity sha512-Rk4SkJFaXZiznFyC/t77Q0NKS4FL7TLJJsVG2V2oiEq3kJVeTdxysEe/yRWSpnWMe808XRDJ+VFh5pt/FN5plw== "@noble/hashes@1.5.0": @@ -856,24 +865,19 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== -"@noble/hashes@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.3.tgz#360afc77610e0a61f3417e497dcf36862e4f8111" - integrity sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A== - -"@noble/hashes@^1.3.1": +"@noble/hashes@^1.1.2", "@noble/hashes@^1.3.1": version "1.3.1" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz" integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== "@noble/secp256k1@^1.6.3": version "1.7.0" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.0.tgz#d15357f7c227e751d90aa06b05a0e5cf993ba8c1" + resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.0.tgz" integrity sha512-kbacwGSsH/CTout0ZnZWxnW1B+jH/7r/WAAKLBtrRJ/+CUH7lgmQzl3GTrQua3SGKWNSDsS6lmjnDpIJ5Dxyaw== "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -881,12 +885,12 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -894,7 +898,7 @@ "@rollup/plugin-commonjs@=21.0.2": version "21.0.2" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.2.tgz#0b9c539aa1837c94abfaf87945838b0fc8564891" + resolved "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.2.tgz" integrity sha512-d/OmjaLVO4j/aQX69bwpWPpbvI3TJkQuxoAk7BH8ew1PyoMBLTOuvJTjzG8oEoW7drIIqB0KCJtfFLu/2GClWg== dependencies: "@rollup/pluginutils" "^3.1.0" @@ -907,7 +911,7 @@ "@rollup/plugin-commonjs@^21.0.1": version "21.1.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-21.1.0.tgz#45576d7b47609af2db87f55a6d4b46e44fc3a553" + resolved "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.1.0.tgz" integrity sha512-6ZtHx3VHIp2ReNNDxHjuUml6ur+WcQ28N1yHgCQwsbNkQg2suhxGMDQGJOn/KuDxKtd1xuZP5xSTwBA4GQ8hbA== dependencies: "@rollup/pluginutils" "^3.1.0" @@ -920,7 +924,7 @@ "@rollup/plugin-node-resolve@=13.1.3": version "13.1.3" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.3.tgz#2ed277fb3ad98745424c1d2ba152484508a92d79" + resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.3.tgz" integrity sha512-BdxNk+LtmElRo5d06MGY4zoepyrXX1tkzX2hrnPEZ53k78GuOMWLqmJDGIIOPwVRIFZrLQOo+Yr6KtCuLIA0AQ== dependencies: "@rollup/pluginutils" "^3.1.0" @@ -932,7 +936,7 @@ "@rollup/plugin-node-resolve@^13.0.6": version "13.3.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz#da1c5c5ce8316cef96a2f823d111c1e4e498801c" + resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz" integrity sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw== dependencies: "@rollup/pluginutils" "^3.1.0" @@ -944,7 +948,7 @@ "@rollup/plugin-replace@=3.1.0", "@rollup/plugin-replace@^3.0.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-3.1.0.tgz#d31e3a90c6b47064f3c9f2ce0ded5bcf0d3b82f6" + resolved "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-3.1.0.tgz" integrity sha512-pA3XRUrSKybVYqmH5TqWNZpGxF+VV+1GrYchKgCNIj2vsSOX7CVm2RCtx8p2nrC7xvkziYyK+lSi74T93MU3YA== dependencies: "@rollup/pluginutils" "^3.1.0" @@ -952,7 +956,7 @@ "@rollup/plugin-typescript@=8.3.1": version "8.3.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-8.3.1.tgz#b7dc75ed6b4876e260b9e80624fab23bc98e4ac1" + resolved "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.3.1.tgz" integrity sha512-84rExe3ICUBXzqNX48WZV2Jp3OddjTMX97O2Py6D1KJaGSwWp0mDHXj+bCGNJqWHIEKDIT2U0sDjhP4czKi6cA== dependencies: "@rollup/pluginutils" "^3.1.0" @@ -960,7 +964,7 @@ "@rollup/plugin-typescript@^8.3.0": version "8.5.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-8.5.0.tgz#7ea11599a15b0a30fa7ea69ce3b791d41b862515" + resolved "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.5.0.tgz" integrity sha512-wMv1/scv0m/rXx21wD2IsBbJFba8wGF3ErJIr6IKRfRj49S85Lszbxb4DCo8iILpluTjk2GAAu9CoZt4G3ppgQ== dependencies: "@rollup/pluginutils" "^3.1.0" @@ -968,7 +972,7 @@ "@rollup/pluginutils@^3.1.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz" integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== dependencies: "@types/estree" "0.0.39" @@ -977,21 +981,21 @@ "@sinonjs/commons@^1.7.0": version "1.8.6" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz" integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^8.0.1": version "8.1.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz" integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== dependencies: "@sinonjs/commons" "^1.7.0" -"@solana/buffer-layout-utils@=0.2.0": +"@solana/buffer-layout-utils@=0.2.0", "@solana/buffer-layout-utils@^0.2.0": version "0.2.0" - resolved "https://registry.yarnpkg.com/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz#b45a6cab3293a2eb7597cceb474f229889d875ca" + resolved "https://registry.npmjs.org/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz" integrity sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g== dependencies: "@solana/buffer-layout" "^4.0.0" @@ -1001,14 +1005,102 @@ "@solana/buffer-layout@=4.0.0", "@solana/buffer-layout@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.0.tgz#75b1b11adc487234821c81dfae3119b73a5fd734" + resolved "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.0.tgz" integrity sha512-lR0EMP2HC3+Mxwd4YcnZb0smnaDw7Bl2IQWZiTevRH5ZZBZn6VRWn3/92E3qdU4SSImJkA6IDHawOHAnx/qUvQ== dependencies: buffer "~6.0.3" +"@solana/codecs-core@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-rc.1.tgz" + integrity sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ== + dependencies: + "@solana/errors" "2.0.0-rc.1" + +"@solana/codecs-data-structures@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-rc.1.tgz" + integrity sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog== + dependencies: + "@solana/codecs-core" "2.0.0-rc.1" + "@solana/codecs-numbers" "2.0.0-rc.1" + "@solana/errors" "2.0.0-rc.1" + +"@solana/codecs-numbers@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-rc.1.tgz" + integrity sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ== + dependencies: + "@solana/codecs-core" "2.0.0-rc.1" + "@solana/errors" "2.0.0-rc.1" + +"@solana/codecs-strings@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-rc.1.tgz" + integrity sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g== + dependencies: + "@solana/codecs-core" "2.0.0-rc.1" + "@solana/codecs-numbers" "2.0.0-rc.1" + "@solana/errors" "2.0.0-rc.1" + +"@solana/codecs@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-rc.1.tgz" + integrity sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ== + dependencies: + "@solana/codecs-core" "2.0.0-rc.1" + "@solana/codecs-data-structures" "2.0.0-rc.1" + "@solana/codecs-numbers" "2.0.0-rc.1" + "@solana/codecs-strings" "2.0.0-rc.1" + "@solana/options" "2.0.0-rc.1" + +"@solana/errors@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-rc.1.tgz" + integrity sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ== + dependencies: + chalk "^5.3.0" + commander "^12.1.0" + +"@solana/options@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@solana/options/-/options-2.0.0-rc.1.tgz" + integrity sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA== + dependencies: + "@solana/codecs-core" "2.0.0-rc.1" + "@solana/codecs-data-structures" "2.0.0-rc.1" + "@solana/codecs-numbers" "2.0.0-rc.1" + "@solana/codecs-strings" "2.0.0-rc.1" + "@solana/errors" "2.0.0-rc.1" + +"@solana/spl-token-group@^0.0.7": + version "0.0.7" + resolved "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.7.tgz" + integrity sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug== + dependencies: + "@solana/codecs" "2.0.0-rc.1" + +"@solana/spl-token-metadata@^0.1.6": + version "0.1.6" + resolved "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.6.tgz" + integrity sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA== + dependencies: + "@solana/codecs" "2.0.0-rc.1" + +"@solana/spl-token@>=0.3.9": + version "0.4.14" + resolved "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.14.tgz" + integrity sha512-u09zr96UBpX4U685MnvQsNzlvw9TiY005hk1vJmJr7gMJldoPG1eYU5/wNEyOA5lkMLiR/gOi9SFD4MefOYEsA== + dependencies: + "@solana/buffer-layout" "^4.0.0" + "@solana/buffer-layout-utils" "^0.2.0" + "@solana/spl-token-group" "^0.0.7" + "@solana/spl-token-metadata" "^0.1.6" + buffer "^6.0.3" + "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.69.0": version "1.69.0" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.69.0.tgz#1756b1a26087172291c0b5163d3b44d24eef8aa7" + resolved "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.69.0.tgz" integrity sha512-iU2Q0IG25RITsxBkY1Vkk74LffRokViEcSblz4CGxyt+/V7xSkC2DNM0n0rB3aY/9+FvMiz4l5wHnD9UC4Ac/w== dependencies: "@babel/runtime" "^7.12.5" @@ -1029,32 +1121,32 @@ "@tootallnate/once@1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@tsconfig/node10@^1.0.7": version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz" integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": version "7.1.20" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz" integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== dependencies: "@babel/parser" "^7.1.0" @@ -1065,14 +1157,14 @@ "@types/babel__generator@*": version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" @@ -1080,78 +1172,78 @@ "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": version "7.18.3" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz" integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== dependencies: "@babel/types" "^7.3.0" "@types/bn.js@^4.11.6": version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== dependencies: "@types/node" "*" "@types/bs58@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/bs58/-/bs58-4.0.1.tgz#3d51222aab067786d3bc3740a84a7f5a0effaa37" + resolved "https://registry.npmjs.org/@types/bs58/-/bs58-4.0.1.tgz" integrity sha512-yfAgiWgVLjFCmRv8zAcOIHywYATEwiTVccTLnRp6UxTNavT55M9d/uhK3T03St/+8/z/wW+CRjGKUNmEqoHHCA== dependencies: base-x "^3.0.6" "@types/connect@^3.4.33": version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== dependencies: "@types/node" "*" "@types/crypto-hash@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/crypto-hash/-/crypto-hash-1.1.2.tgz#5a993deb0e6ba7c42f86eaa65d9bf563378f4569" + resolved "https://registry.npmjs.org/@types/crypto-hash/-/crypto-hash-1.1.2.tgz" integrity sha512-sOmi+4Go2XKodLV4+lfP+5QMQ+6ZYqRJhK8D/n6xsxIUvlerEulmU9S4Lo02pXCH3qPBeJXEy+g8ZERktDJLSg== dependencies: crypto-hash "*" "@types/estree@*": version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz" integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== "@types/estree@0.0.39": version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/graceful-fs@^4.1.2": version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@^27.4.1": version "27.5.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.5.2.tgz#ec49d29d926500ffb9fd22b84262e862049c026c" + resolved "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz" integrity sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA== dependencies: jest-matcher-utils "^27.0.0" @@ -1159,83 +1251,85 @@ "@types/json-schema@^7.0.7": version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/minimist@^1.2.0": version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/node@*", "@types/node@^18.11.10": - version "18.11.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.10.tgz#4c64759f3c2343b7e6c4b9caf761c7a3a05cee34" - integrity sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ== + version "18.19.130" + resolved "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz" + integrity sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg== + dependencies: + undici-types "~5.26.4" "@types/node@=17.0.21": version "17.0.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz" integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== "@types/node@^12.12.54": version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== "@types/normalize-package-data@^2.4.0": version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== "@types/pako@^1.0.1": version "1.0.4" - resolved "https://registry.yarnpkg.com/@types/pako/-/pako-1.0.4.tgz#b4262aef92680a9331fcdb8420c69cf3dd98d3f3" + resolved "https://registry.npmjs.org/@types/pako/-/pako-1.0.4.tgz" integrity sha512-Z+5bJSm28EXBSUJEgx29ioWeEEHUh6TiMkZHDhLwjc9wVFH+ressbkmX6waUZc5R3Gobn4Qu5llGxaoflZ+yhA== "@types/parse-json@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prettier@^2.1.5": version "2.7.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz" integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== "@types/resolve@1.17.1": version "1.17.1" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz" integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== dependencies: "@types/node" "*" "@types/stack-utils@^2.0.0": version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/ws@^7.4.4": version "7.4.7" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + resolved "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz" integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== dependencies: "@types/node" "*" "@types/yargs-parser@*": version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^16.0.0": version "16.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz" integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^4.6.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz" integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== dependencies: "@typescript-eslint/experimental-utils" "4.33.0" @@ -1249,7 +1343,7 @@ "@typescript-eslint/experimental-utils@4.33.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz" integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== dependencies: "@types/json-schema" "^7.0.7" @@ -1261,7 +1355,7 @@ "@typescript-eslint/parser@^4.6.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz" integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== dependencies: "@typescript-eslint/scope-manager" "4.33.0" @@ -1271,7 +1365,7 @@ "@typescript-eslint/scope-manager@4.33.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz" integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== dependencies: "@typescript-eslint/types" "4.33.0" @@ -1279,12 +1373,12 @@ "@typescript-eslint/types@4.33.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz" integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== "@typescript-eslint/typescript-estree@4.33.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz" integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== dependencies: "@typescript-eslint/types" "4.33.0" @@ -1297,7 +1391,7 @@ "@typescript-eslint/visitor-keys@4.33.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz" integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== dependencies: "@typescript-eslint/types" "4.33.0" @@ -1305,7 +1399,7 @@ JSONStream@^1.0.4, JSONStream@^1.3.5: version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== dependencies: jsonparse "^1.2.0" @@ -1313,12 +1407,12 @@ JSONStream@^1.0.4, JSONStream@^1.3.5: abab@^2.0.3, abab@^2.0.5: version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== acorn-globals@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== dependencies: acorn "^7.1.1" @@ -1326,39 +1420,39 @@ acorn-globals@^6.0.0: acorn-jsx@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^7.1.1: version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn-walk@^8.1.1: version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== acorn@^7.1.1, acorn@^7.4.0: version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0: version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== agent-base@6: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -1366,7 +1460,7 @@ aggregate-error@^3.0.0: ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -1376,7 +1470,7 @@ ajv@^6.10.0, ajv@^6.12.4: ajv@^8.0.1: version "8.11.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz" integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== dependencies: fast-deep-equal "^3.1.1" @@ -1386,43 +1480,43 @@ ajv@^8.0.1: ansi-colors@^4.1.1: version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== anymatch@^3.0.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -1430,49 +1524,49 @@ anymatch@^3.0.3: arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" array-ify@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== arrify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== babel-jest@^27.3.1, babel-jest@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz" integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== dependencies: "@jest/transform" "^27.5.1" @@ -1486,7 +1580,7 @@ babel-jest@^27.3.1, babel-jest@^27.5.1: babel-plugin-istanbul@^6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -1497,7 +1591,7 @@ babel-plugin-istanbul@^6.1.1: babel-plugin-jest-hoist@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz" integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== dependencies: "@babel/template" "^7.3.3" @@ -1507,7 +1601,7 @@ babel-plugin-jest-hoist@^27.5.1: babel-preset-current-node-syntax@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -1525,7 +1619,7 @@ babel-preset-current-node-syntax@^1.0.0: babel-preset-jest@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz" integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== dependencies: babel-plugin-jest-hoist "^27.5.1" @@ -1533,12 +1627,12 @@ babel-preset-jest@^27.5.1: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2, base-x@^3.0.6: version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== dependencies: safe-buffer "^5.0.1" @@ -1550,31 +1644,31 @@ base-x@^5.0.0: base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== bigint-buffer@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" + resolved "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz" integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== dependencies: bindings "^1.3.0" bignumber.js@^9.0.1: version "9.1.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz" integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== bindings@^1.3.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== dependencies: file-uri-to-path "1.0.0" bn.js@^5.0.0, bn.js@^5.1.2, bn.js@^5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== bn.js@^5.2.1: @@ -1584,7 +1678,7 @@ bn.js@^5.2.1: borsh@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" + resolved "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz" integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== dependencies: bn.js "^5.2.0" @@ -1593,7 +1687,7 @@ borsh@^0.7.0: brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -1601,26 +1695,26 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" browser-process-hrtime@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browserslist@^4.21.3: version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz" integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== dependencies: caniuse-lite "^1.0.30001400" @@ -1630,14 +1724,14 @@ browserslist@^4.21.3: bs-logger@0.x: version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== dependencies: fast-json-stable-stringify "2.x" bs58@^4.0.0, bs58@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" @@ -1651,32 +1745,32 @@ bs58@^6.0.0: bser@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-layout@^1.2.0, buffer-layout@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" + resolved "https://registry.npmjs.org/buffer-layout/-/buffer-layout-1.2.2.tgz" integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== buffer@6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.1.tgz#3cbea8c1463e5a0779e30b66d4c88c6ffa182ac2" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz" integrity sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ== dependencies: base64-js "^1.3.1" ieee754 "^1.2.1" -buffer@6.0.3, buffer@~6.0.3: +buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" @@ -1684,63 +1778,48 @@ buffer@6.0.3, buffer@~6.0.3: bufferutil@^4.0.1: version "4.0.7" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" + resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz" integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== dependencies: node-gyp-build "^4.3.0" builtin-modules@^3.1.0, builtin-modules@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase-keys@^6.2.2: version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz" integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== dependencies: camelcase "^5.3.1" map-obj "^4.0.0" quick-lru "^4.0.1" -camelcase-keys@^9.1.3: - version "9.1.3" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-9.1.3.tgz#6367b2f9ec5724af541f58f0dcfee9b200022e5c" - integrity sha512-Rircqi9ch8AnZscQcsA1C47NFdaO3wukpmIRzYcDOrmvgt78hM/sj5pZhZNec2NM12uk5vTwRHZ4anGcrC4ZTg== - dependencies: - camelcase "^8.0.0" - map-obj "5.0.0" - quick-lru "^6.1.1" - type-fest "^4.3.2" - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0, camelcase@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -camelcase@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-8.0.0.tgz#c0d36d418753fb6ad9c5e0437579745c1c14a534" - integrity sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA== - caniuse-lite@^1.0.30001400: version "1.0.30001435" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001435.tgz#502c93dbd2f493bee73a408fe98e98fb1dad10b2" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001435.tgz" integrity sha512-kdCkUTjR+v4YAJelyiDTqiu82BDr4W4CP5sgTA0ZBmqn30XfS2ZghPLMowik9TPhS+psWJiUNxsqLyurDbmutA== chalk@4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz" integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== dependencies: ansi-styles "^4.1.0" @@ -1748,7 +1827,7 @@ chalk@4.1.0: chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -1757,47 +1836,52 @@ chalk@^2.0.0, chalk@^2.4.2: chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.3.0: + version "5.6.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz" + integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== + char-regex@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== ci-info@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: version "3.7.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.0.tgz#6d01b3696c59915b6ce057e4aa4adfc2fa25f5ef" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz" integrity sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog== cjs-module-lexer@^1.0.0: version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" cli-truncate@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: slice-ansi "^3.0.0" @@ -1805,7 +1889,7 @@ cli-truncate@^2.1.0: cliui@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: string-width "^4.2.0" @@ -1814,7 +1898,7 @@ cliui@^6.0.0: cliui@^7.0.2: version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -1823,68 +1907,73 @@ cliui@^7.0.2: co@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== collect-v8-coverage@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colorette@^2.0.16: version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" +commander@^12.1.0: + version "12.1.0" + resolved "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + commander@^2.20.0, commander@^2.20.3: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^6.2.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== commondir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== compare-func@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz" integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== dependencies: array-ify "^1.0.0" @@ -1892,17 +1981,17 @@ compare-func@^2.0.0: compare-versions@^3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" + resolved "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz" integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== conventional-changelog-angular@^5.0.0: version "5.0.13" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" + resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz" integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== dependencies: compare-func "^2.0.0" @@ -1910,7 +1999,7 @@ conventional-changelog-angular@^5.0.0: conventional-changelog-conventionalcommits@^4.3.1: version "4.6.3" - resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz#0765490f56424b46f6cb4db9135902d6e5a36dc2" + resolved "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz" integrity sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g== dependencies: compare-func "^2.0.0" @@ -1919,7 +2008,7 @@ conventional-changelog-conventionalcommits@^4.3.1: conventional-commits-parser@^3.0.0: version "3.2.4" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" + resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz" integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== dependencies: JSONStream "^1.0.4" @@ -1931,17 +2020,17 @@ conventional-commits-parser@^3.0.0: convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== core-js@^3.6.1: version "3.26.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.26.1.tgz#7a9816dabd9ee846c1c0fe0e8fcad68f3709134e" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.26.1.tgz" integrity sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA== cosmiconfig@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" @@ -1952,19 +2041,19 @@ cosmiconfig@^7.0.0: create-require@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-fetch@^3.1.5: version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== dependencies: node-fetch "2.6.7" cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -1973,34 +2062,34 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: crypto-hash@*: version "2.0.1" - resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-2.0.1.tgz#46c3732e65a078ea06b8b4ae686db41216f81213" + resolved "https://registry.npmjs.org/crypto-hash/-/crypto-hash-2.0.1.tgz" integrity sha512-t4mkp7Vh6MuCZRBf0XLzBOfhkH3nW6YEAotMDSjshVQ1GffCMGdPLSr7pKH0rdXY02jTjAZ7QW2apD0buaZXcQ== cssom@^0.4.4: version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== cssom@~0.3.6: version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssstyle@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: cssom "~0.3.6" dargs@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + resolved "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== data-urls@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== dependencies: abab "^2.0.3" @@ -2009,14 +2098,14 @@ data-urls@^2.0.0: debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" decamelize-keys@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz" integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" @@ -2024,153 +2113,153 @@ decamelize-keys@^1.1.0: decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js@^10.2.1: version "10.4.2" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.2.tgz#0341651d1d997d86065a2ce3a441fbd0d8e8b98e" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz" integrity sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA== dedent@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== delay@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + resolved "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz" integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== detect-newline@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== diff-sequences@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== diff@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" domexception@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz" integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== dependencies: webidl-conversions "^5.0.0" dot-prop@^5.1.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" electron-to-chromium@^1.4.251: version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== emittery@^0.8.1: version "0.8.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz" integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== end-of-stream@^1.1.0: version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es6-promise@^4.0.3: version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== es6-promisify@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz" integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== dependencies: es6-promise "^4.0.3" escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz" integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== dependencies: esprima "^4.0.1" @@ -2182,14 +2271,14 @@ escodegen@^2.0.0: eslint-config-prettier@^6.15.0: version "6.15.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz" integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== dependencies: get-stdin "^6.0.0" eslint-scope@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -2197,31 +2286,31 @@ eslint-scope@^5.1.1: eslint-utils@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" eslint-utils@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: eslint-visitor-keys "^2.0.0" eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint@^7.12.1: version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: "@babel/code-frame" "7.12.11" @@ -2267,7 +2356,7 @@ eslint@^7.12.1: espree@^7.3.0, espree@^7.3.1: version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: acorn "^7.4.0" @@ -2276,56 +2365,56 @@ espree@^7.3.0, espree@^7.3.1: esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-walker@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== estree-walker@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== eventemitter3@^4.0.7: version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== execa@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== dependencies: cross-spawn "^7.0.0" @@ -2340,7 +2429,7 @@ execa@^4.1.0: execa@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -2355,12 +2444,12 @@ execa@^5.0.0: exit@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expect@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" + resolved "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz" integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== dependencies: "@jest/types" "^27.5.1" @@ -2370,17 +2459,17 @@ expect@^27.5.1: eyes@^0.1.8: version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + resolved "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.9: version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -2391,55 +2480,55 @@ fast-glob@^3.2.9: fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-stable-stringify@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" + resolved "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz" integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== fastq@^1.6.0: version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" fb-watchman@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" file-uri-to-path@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -2447,7 +2536,7 @@ find-up@^4.0.0, find-up@^4.1.0: find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -2455,14 +2544,14 @@ find-up@^5.0.0: find-versions@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-4.0.0.tgz#3c57e573bf97769b8cb8df16934b627915da4965" + resolved "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz" integrity sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ== dependencies: semver-regex "^3.1.2" flat-cache@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: flatted "^3.1.0" @@ -2470,12 +2559,12 @@ flat-cache@^3.0.4: flatted@^3.1.0: version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== form-data@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" @@ -2484,7 +2573,7 @@ form-data@^3.0.0: fs-extra@^9.0.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" @@ -2494,69 +2583,69 @@ fs-extra@^9.0.0: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== functional-red-black-tree@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-stdin@8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz" integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== get-stdin@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== get-stream@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" get-stream@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== git-raw-commits@^2.0.0: version "2.0.11" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" + resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz" integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== dependencies: dargs "^7.0.0" @@ -2567,14 +2656,14 @@ git-raw-commits@^2.0.0: glob-parent@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -2586,7 +2675,7 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: glob@^8.0.3: version "8.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" + resolved "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz" integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== dependencies: fs.realpath "^1.0.0" @@ -2597,26 +2686,26 @@ glob@^8.0.3: global-dirs@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz" integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== dependencies: ini "^1.3.4" globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: version "13.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" + resolved "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz" integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== dependencies: type-fest "^0.20.2" globby@^11.0.3: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -2628,58 +2717,58 @@ globby@^11.0.3: graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== hard-rejection@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hosted-git-info@^2.1.4: version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== hosted-git-info@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== dependencies: lru-cache "^6.0.0" html-encoding-sniffer@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz" integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== dependencies: whatwg-encoding "^1.0.5" html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== http-proxy-agent@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== dependencies: "@tootallnate/once" "1" @@ -2688,7 +2777,7 @@ http-proxy-agent@^4.0.1: https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -2696,17 +2785,17 @@ https-proxy-agent@^5.0.0: human-signals@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== husky@^4.3.0: version "4.3.8" - resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.8.tgz#31144060be963fd6850e5cc8f019a1dfe194296d" + resolved "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz" integrity sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow== dependencies: chalk "^4.0.0" @@ -2722,29 +2811,29 @@ husky@^4.3.0: iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.1.8, ignore@^5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz" integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -2752,7 +2841,7 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: import-local@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" @@ -2760,17 +2849,17 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -2778,137 +2867,137 @@ inflight@^1.0.4: inherits@2, inherits@^2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@^1.3.4: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-builtin-module@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.0.tgz#bb0310dfe881f144ca83f30100ceb10cf58835e0" + resolved "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz" integrity sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw== dependencies: builtin-modules "^3.3.0" is-core-module@^2.5.0, is-core-module@^2.9.0: version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-fn@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-glob@^4.0.0, is-glob@^4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-module@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz" integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== is-obj@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-plain-obj@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== is-potential-custom-element-name@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-reference@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + resolved "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz" integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== dependencies: "@types/estree" "*" is-regexp@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-text-path@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz" integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== dependencies: text-extensions "^1.0.0" is-typedarray@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isomorphic-ws@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + resolved "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz" integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" @@ -2919,7 +3008,7 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-report@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -2928,7 +3017,7 @@ istanbul-lib-report@^3.0.0: istanbul-lib-source-maps@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" @@ -2937,7 +3026,7 @@ istanbul-lib-source-maps@^4.0.0: istanbul-reports@^3.1.3: version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" @@ -2945,7 +3034,7 @@ istanbul-reports@^3.1.3: jayson@^3.4.4: version "3.7.0" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.7.0.tgz#b735b12d06d348639ae8230d7a1e2916cb078f25" + resolved "https://registry.npmjs.org/jayson/-/jayson-3.7.0.tgz" integrity sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ== dependencies: "@types/connect" "^3.4.33" @@ -2964,7 +3053,7 @@ jayson@^3.4.4: jest-changed-files@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz" integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== dependencies: "@jest/types" "^27.5.1" @@ -2973,7 +3062,7 @@ jest-changed-files@^27.5.1: jest-circus@^27.3.1, jest-circus@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz" integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== dependencies: "@jest/environment" "^27.5.1" @@ -2998,7 +3087,7 @@ jest-circus@^27.3.1, jest-circus@^27.5.1: jest-cli@^27.3.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz" integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== dependencies: "@jest/core" "^27.5.1" @@ -3016,7 +3105,7 @@ jest-cli@^27.3.1: jest-config@27.3.1: version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.3.1.tgz#cb3b7f6aaa8c0a7daad4f2b9573899ca7e09bbad" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-27.3.1.tgz" integrity sha512-KY8xOIbIACZ/vdYCKSopL44I0xboxC751IX+DXL2+Wx6DKNycyEfV3rryC3BPm5Uq/BBqDoMrKuqLEUNJmMKKg== dependencies: "@babel/core" "^7.1.0" @@ -3043,7 +3132,7 @@ jest-config@27.3.1: jest-config@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz" integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== dependencies: "@babel/core" "^7.8.0" @@ -3073,7 +3162,7 @@ jest-config@^27.5.1: jest-diff@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz" integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== dependencies: chalk "^4.0.0" @@ -3083,14 +3172,14 @@ jest-diff@^27.5.1: jest-docblock@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz" integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== dependencies: detect-newline "^3.0.0" jest-each@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz" integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== dependencies: "@jest/types" "^27.5.1" @@ -3101,7 +3190,7 @@ jest-each@^27.5.1: jest-environment-jsdom@^27.3.1, jest-environment-jsdom@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz" integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== dependencies: "@jest/environment" "^27.5.1" @@ -3114,7 +3203,7 @@ jest-environment-jsdom@^27.3.1, jest-environment-jsdom@^27.5.1: jest-environment-node@^27.3.1, jest-environment-node@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz" integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== dependencies: "@jest/environment" "^27.5.1" @@ -3126,12 +3215,12 @@ jest-environment-node@^27.3.1, jest-environment-node@^27.5.1: jest-get-type@^27.3.1, jest-get-type@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz" integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== jest-haste-map@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz" integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== dependencies: "@jest/types" "^27.5.1" @@ -3151,7 +3240,7 @@ jest-haste-map@^27.5.1: jest-jasmine2@^27.3.1, jest-jasmine2@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz" integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== dependencies: "@jest/environment" "^27.5.1" @@ -3174,7 +3263,7 @@ jest-jasmine2@^27.3.1, jest-jasmine2@^27.5.1: jest-leak-detector@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz" integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== dependencies: jest-get-type "^27.5.1" @@ -3182,7 +3271,7 @@ jest-leak-detector@^27.5.1: jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz" integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== dependencies: chalk "^4.0.0" @@ -3192,7 +3281,7 @@ jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: jest-message-util@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz" integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== dependencies: "@babel/code-frame" "^7.12.13" @@ -3207,7 +3296,7 @@ jest-message-util@^27.5.1: jest-mock@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz" integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== dependencies: "@jest/types" "^27.5.1" @@ -3215,17 +3304,17 @@ jest-mock@^27.5.1: jest-pnp-resolver@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^27.0.6, jest-regex-util@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz" integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== jest-resolve-dependencies@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz" integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== dependencies: "@jest/types" "^27.5.1" @@ -3234,7 +3323,7 @@ jest-resolve-dependencies@^27.5.1: jest-resolve@^27.2.5, jest-resolve@^27.3.1, jest-resolve@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz" integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== dependencies: "@jest/types" "^27.5.1" @@ -3250,7 +3339,7 @@ jest-resolve@^27.2.5, jest-resolve@^27.3.1, jest-resolve@^27.5.1: jest-runner@^27.3.1, jest-runner@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz" integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== dependencies: "@jest/console" "^27.5.1" @@ -3277,7 +3366,7 @@ jest-runner@^27.3.1, jest-runner@^27.5.1: jest-runtime@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz" integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== dependencies: "@jest/environment" "^27.5.1" @@ -3305,7 +3394,7 @@ jest-runtime@^27.5.1: jest-serializer@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" + resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz" integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== dependencies: "@types/node" "*" @@ -3313,7 +3402,7 @@ jest-serializer@^27.5.1: jest-snapshot@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz" integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== dependencies: "@babel/core" "^7.7.2" @@ -3341,7 +3430,7 @@ jest-snapshot@^27.5.1: jest-util@^27.0.0, jest-util@^27.3.1, jest-util@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz" integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== dependencies: "@jest/types" "^27.5.1" @@ -3353,7 +3442,7 @@ jest-util@^27.0.0, jest-util@^27.3.1, jest-util@^27.5.1: jest-validate@^27.3.1, jest-validate@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz" integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== dependencies: "@jest/types" "^27.5.1" @@ -3365,7 +3454,7 @@ jest-validate@^27.3.1, jest-validate@^27.5.1: jest-watcher@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz" integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== dependencies: "@jest/test-result" "^27.5.1" @@ -3378,7 +3467,7 @@ jest-watcher@^27.5.1: jest-worker@^26.2.1: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz" integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== dependencies: "@types/node" "*" @@ -3387,7 +3476,7 @@ jest-worker@^26.2.1: jest-worker@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: "@types/node" "*" @@ -3396,7 +3485,7 @@ jest-worker@^27.5.1: jest@27.3.1: version "27.3.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.3.1.tgz#b5bab64e8f56b6f7e275ba1836898b0d9f1e5c8a" + resolved "https://registry.npmjs.org/jest/-/jest-27.3.1.tgz" integrity sha512-U2AX0AgQGd5EzMsiZpYt8HyZ+nSVIh5ujQ9CPp9EQZJMjXIiSZpJNweZl0swatKRoqHWgGKM3zaSwm4Zaz87ng== dependencies: "@jest/core" "^27.3.1" @@ -3405,12 +3494,12 @@ jest@27.3.1: js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -3418,7 +3507,7 @@ js-yaml@^3.13.1: jsdom@^16.6.0: version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== dependencies: abab "^2.0.5" @@ -3451,47 +3540,47 @@ jsdom@^16.6.0: jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stringify-safe@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== json5@2.x, json5@^2.2.1: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonc-parser@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -3500,27 +3589,27 @@ jsonfile@^6.0.1: jsonparse@^1.2.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== kind-of@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== kleur@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== leven@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -3528,7 +3617,7 @@ levn@^0.4.1: levn@~0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" @@ -3536,12 +3625,12 @@ levn@~0.3.0: lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== lint-staged@^10.5.0: version "10.5.4" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.4.tgz#cd153b5f0987d2371fc1d2847a409a2fe705b665" + resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.4.tgz" integrity sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg== dependencies: chalk "^4.1.0" @@ -3562,7 +3651,7 @@ lint-staged@^10.5.0: listr2@^3.2.2: version "3.14.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + resolved "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz" integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== dependencies: cli-truncate "^2.1.0" @@ -3576,41 +3665,41 @@ listr2@^3.2.2: locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.memoize@4.x: version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.truncate@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.7.0: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -3618,7 +3707,7 @@ log-symbols@^4.0.0: log-update@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== dependencies: ansi-escapes "^4.3.0" @@ -3628,65 +3717,60 @@ log-update@^4.0.0: lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" lunr@^2.3.9: version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz" integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== magic-string@^0.25.7: version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== dependencies: sourcemap-codec "^1.4.8" make-dir@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" make-error@1.x, make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== makeerror@1.0.12: version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: tmpl "1.0.5" -map-obj@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-5.0.0.tgz#126c98596b63927d7360f287cccc67177aa1938b" - integrity sha512-2L3MIgJynYrZ3TYMriLDLWocz15okFakV6J12HXvMXDHui2x/zgChzg1u9mFFGbbGWE+GsLpQByt4POb9Or+uA== - map-obj@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== map-obj@^4.0.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== marked@^4.0.16: version "4.2.3" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.3.tgz#bd76a5eb510ff1d8421bc6c3b2f0b93488c15bea" + resolved "https://registry.npmjs.org/marked/-/marked-4.2.3.tgz" integrity sha512-slWRdJkbTZ+PjkyJnE30Uid64eHwbwa1Q25INCAYfZlK4o6ylagBy/Le9eWntqJFoFT93ikUKMv47GZ4gTwHkw== meow@^8.0.0: version "8.1.2" - resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" + resolved "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz" integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== dependencies: "@types/minimist" "^1.2.0" @@ -3703,17 +3787,17 @@ meow@^8.0.0: merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -3721,43 +3805,43 @@ micromatch@^4.0.2, micromatch@^4.0.4: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== min-indent@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^5.0.1, minimatch@^5.1.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.1.tgz#6c9dffcf9927ff2a31e74b5af11adf8b9604b022" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz" integrity sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g== dependencies: brace-expansion "^2.0.1" minimist-options@4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== dependencies: arrify "^1.0.1" @@ -3766,39 +3850,39 @@ minimist-options@4.1.0: ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== node-fetch@2, node-fetch@2.6.7: version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" node-gyp-build@^4.3.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz" integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-releases@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== normalize-package-data@^2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" @@ -3808,7 +3892,7 @@ normalize-package-data@^2.5.0: normalize-package-data@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz" integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== dependencies: hosted-git-info "^4.0.1" @@ -3818,43 +3902,43 @@ normalize-package-data@^3.0.0: normalize-path@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" nwsapi@^2.2.0: version "2.2.2" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz" integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" opencollective-postinstall@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + resolved "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz" integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== optionator@^0.8.1: version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" @@ -3866,7 +3950,7 @@ optionator@^0.8.1: optionator@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: deep-is "^0.1.3" @@ -3878,59 +3962,59 @@ optionator@^0.9.1: p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pako@^2.0.3: version "2.1.0" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + resolved "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz" integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -3940,93 +4024,93 @@ parse-json@^5.0.0, parse-json@^5.2.0: parse5@6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pirates@^4.0.4: version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" pkg-dir@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz" integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== dependencies: find-up "^5.0.0" please-upgrade-node@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + resolved "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz" integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== dependencies: semver-compare "^1.0.0" prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prelude-ls@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prettier@=2.7.1: version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz" integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== prettier@^2.1.2: version "2.8.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz" integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== pretty-format@^27.0.0, pretty-format@^27.3.1, pretty-format@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: ansi-regex "^5.0.1" @@ -4035,12 +4119,12 @@ pretty-format@^27.0.0, pretty-format@^27.3.1, pretty-format@^27.5.1: progress@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== prompts@^2.0.1: version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -4048,12 +4132,12 @@ prompts@^2.0.1: psl@^1.1.33: version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== pump@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" @@ -4061,49 +4145,44 @@ pump@^3.0.0: punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== q@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== querystringify@^2.1.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== quick-lru@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -quick-lru@^6.1.1: - version "6.1.2" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-6.1.2.tgz#e9a90524108629be35287d0b864e7ad6ceb3659e" - integrity sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ== - randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" react-is@^17.0.1: version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== read-pkg-up@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== dependencies: find-up "^4.1.0" @@ -4112,7 +4191,7 @@ read-pkg-up@^7.0.1: read-pkg@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== dependencies: "@types/normalize-package-data" "^2.4.0" @@ -4122,7 +4201,7 @@ read-pkg@^5.2.0: readable-stream@3, readable-stream@^3.0.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" @@ -4131,7 +4210,7 @@ readable-stream@3, readable-stream@^3.0.0: redent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: indent-string "^4.0.0" @@ -4139,66 +4218,66 @@ redent@^3.0.0: regenerator-runtime@^0.13.11: version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== regexpp@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== require-main-filename@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@5.0.0, resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-global@1.0.0, resolve-global@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" + resolved "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz" integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== dependencies: global-dirs "^0.1.1" resolve.exports@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== resolve@^1.10.0, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0: version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: is-core-module "^2.9.0" @@ -4207,7 +4286,7 @@ resolve@^1.10.0, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0: restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" @@ -4215,24 +4294,24 @@ restore-cursor@^3.1.0: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rfdc@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== rimraf@*, rimraf@=3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" rollup-plugin-terser@=7.0.2: version "7.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" + resolved "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz" integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== dependencies: "@babel/code-frame" "^7.10.4" @@ -4242,21 +4321,21 @@ rollup-plugin-terser@=7.0.2: rollup@=2.70.1: version "2.70.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.70.1.tgz#824b1f1f879ea396db30b0fc3ae8d2fead93523e" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz" integrity sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA== optionalDependencies: fsevents "~2.3.2" rollup@^2.60.2: version "2.79.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz" integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== optionalDependencies: fsevents "~2.3.2" rpc-websockets@^7.5.0: version "7.5.0" - resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.5.0.tgz#bbeb87572e66703ff151e50af1658f98098e2748" + resolved "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.5.0.tgz" integrity sha512-9tIRi1uZGy7YmDjErf1Ax3wtqdSSLIlnmL5OtOzgd5eqPKbsPpwDP5whUDO2LQay3Xp0CcHlcNSGzacNRluBaQ== dependencies: "@babel/runtime" "^7.17.2" @@ -4269,94 +4348,94 @@ rpc-websockets@^7.5.0: run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" rxjs@^7.5.1: version "7.5.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz" integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== dependencies: tslib "^2.1.0" safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== "safer-buffer@>= 2.1.2 < 3": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== saxes@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== dependencies: xmlchars "^2.2.0" semver-compare@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz" integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== semver-regex@^3.1.2: version "3.1.4" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.4.tgz#13053c0d4aa11d070a2f2872b6b1e3ae1e1971b4" + resolved "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz" integrity sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA== "semver@2 || 3 || 4 || 5": version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@7.3.2: version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" semver@^6.0.0, semver@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== serialize-javascript@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== dependencies: randombytes "^2.1.0" set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shiki@^0.10.1: version "0.10.1" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.10.1.tgz#6f9a16205a823b56c072d0f1a0bcd0f2646bef14" + resolved "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz" integrity sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng== dependencies: jsonc-parser "^3.0.0" @@ -4365,22 +4444,22 @@ shiki@^0.10.1: signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== dependencies: ansi-styles "^4.0.0" @@ -4389,7 +4468,7 @@ slice-ansi@^3.0.0: slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" @@ -4398,7 +4477,7 @@ slice-ansi@^4.0.0: source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" @@ -4406,22 +4485,22 @@ source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.2 source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@^0.7.3: version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== sourcemap-codec@^1.4.8: version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== spdx-correct@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" @@ -4429,12 +4508,12 @@ spdx-correct@^3.0.0: spdx-exceptions@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" @@ -4442,36 +4521,36 @@ spdx-expression-parse@^3.0.0: spdx-license-ids@^3.0.0: version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz" integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== split2@^3.0.0: version "3.2.2" - resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + resolved "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz" integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== dependencies: readable-stream "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== stack-utils@^2.0.3: version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" string-argv@0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== string-length@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" @@ -4479,7 +4558,7 @@ string-length@^4.0.1: string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -4488,14 +4567,14 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" stringify-object@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== dependencies: get-own-enumerable-property-symbols "^3.0.0" @@ -4504,31 +4583,31 @@ stringify-object@^3.3.0: strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-indent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: min-indent "^1.0.0" strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== superstruct@2.0.2: @@ -4538,38 +4617,38 @@ superstruct@2.0.2: superstruct@^0.14.2: version "0.14.2" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" + resolved "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz" integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== superstruct@^0.15.4: version "0.15.5" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.5.tgz#0f0a8d3ce31313f0d84c6096cd4fa1bfdedc9dab" + resolved "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz" integrity sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-hyperlinks@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz" integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== dependencies: has-flag "^4.0.0" @@ -4577,17 +4656,17 @@ supports-hyperlinks@^2.0.0: supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== symbol-tree@^3.2.4: version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== table@^6.0.9: version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + resolved "https://registry.npmjs.org/table/-/table-6.8.1.tgz" integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" @@ -4598,7 +4677,7 @@ table@^6.0.9: terminal-link@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== dependencies: ansi-escapes "^4.2.1" @@ -4606,7 +4685,7 @@ terminal-link@^2.0.0: terser@^5.0.0: version "5.16.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" + resolved "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz" integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== dependencies: "@jridgewell/source-map" "^0.3.2" @@ -4616,7 +4695,7 @@ terser@^5.0.0: test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -4625,61 +4704,61 @@ test-exclude@^6.0.0: text-encoding-utf-8@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" + resolved "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz" integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== text-extensions@^1.0.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== throat@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" + resolved "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz" integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== through2@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + resolved "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz" integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== dependencies: readable-stream "3" "through@>=2.2.7 <3", through@^2.3.8: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tmpl@1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toml@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" + resolved "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz" integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== tough-cookie@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz" integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== dependencies: psl "^1.1.33" @@ -4689,31 +4768,31 @@ tough-cookie@^4.0.0: tr46@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== dependencies: punycode "^2.1.1" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== trim-newlines@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== ts-jest-resolver@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ts-jest-resolver/-/ts-jest-resolver-2.0.0.tgz#45ff6b328b32748bb0bd39a7aa0da0fa45589f3f" + resolved "https://registry.npmjs.org/ts-jest-resolver/-/ts-jest-resolver-2.0.0.tgz" integrity sha512-yr/lgqJtVBUXhnaxD5Es0XFGHoIYT6NgbUW1VUiAPTEDINHByiUfcnfDf6VOK3CRibqaqWyTEAppBBcXeIuGAw== dependencies: jest-resolve "^27.2.5" ts-jest@^27.0.7: version "27.1.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.5.tgz#0ddf1b163fbaae3d5b7504a1e65c914a95cff297" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.5.tgz" integrity sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA== dependencies: bs-logger "0.x" @@ -4727,7 +4806,7 @@ ts-jest@^27.0.7: ts-node@*: version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== dependencies: "@cspotcode/source-map-support" "^0.8.0" @@ -4746,7 +4825,7 @@ ts-node@*: ts-node@^9.0.0: version "9.1.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz" integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== dependencies: arg "^4.1.0" @@ -4758,85 +4837,80 @@ ts-node@^9.0.0: tslib@=2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== tslib@^1.8.1: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.1.0, tslib@^2.3.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== tsutils@^3.21.0: version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-check@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" type-detect@4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.18.0: version "0.18.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz" integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== type-fest@^0.8.1: version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-fest@^4.3.2: - version "4.41.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" - integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== - typedarray-to-buffer@^3.1.5: version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" typedoc@^0.22.10: version "0.22.18" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.18.tgz#1d000c33b66b88fd8cdfea14a26113a83b7e6591" + resolved "https://registry.npmjs.org/typedoc/-/typedoc-0.22.18.tgz" integrity sha512-NK9RlLhRUGMvc6Rw5USEYgT4DVAUFk7IF7Q6MYfpJ88KnTZP7EneEa4RcP+tX1auAcz7QT1Iy0bUSZBYYHdoyA== dependencies: glob "^8.0.3" @@ -4847,32 +4921,37 @@ typedoc@^0.22.10: typescript@*: version "4.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz" integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== typescript@=4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz" integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg== typescript@^5.5.4: version "5.5.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + universalify@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== update-browserslist-db@^1.0.9: version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== dependencies: escalade "^3.1.1" @@ -4880,14 +4959,14 @@ update-browserslist-db@^1.0.9: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url-parse@^1.5.3: version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: querystringify "^2.1.1" @@ -4895,34 +4974,34 @@ url-parse@^1.5.3: utf-8-validate@^5.0.2: version "5.0.10" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz" integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== dependencies: node-gyp-build "^4.3.0" util-deprecate@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-compile-cache-lib@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== v8-compile-cache@^2.0.3: version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== v8-to-istanbul@^8.1.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz" integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" @@ -4931,7 +5010,7 @@ v8-to-istanbul@^8.1.0: validate-npm-package-license@^3.0.1: version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" @@ -4939,65 +5018,65 @@ validate-npm-package-license@^3.0.1: vscode-oniguruma@^1.6.1: version "1.7.0" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" + resolved "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz" integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== vscode-textmate@5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" + resolved "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz" integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== w3c-hr-time@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: browser-process-hrtime "^1.0.0" w3c-xmlserializer@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz" integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== dependencies: xml-name-validator "^3.0.0" walker@^1.0.7: version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webidl-conversions@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz" integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== webidl-conversions@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== whatwg-encoding@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: iconv-lite "0.4.24" whatwg-mimetype@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -5005,7 +5084,7 @@ whatwg-url@^5.0.0: whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== dependencies: lodash "^4.7.0" @@ -5014,29 +5093,29 @@ whatwg-url@^8.0.0, whatwg-url@^8.5.0: which-module@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== which-pm-runs@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz#35ccf7b1a0fce87bd8b92a478c9d045785d3bf35" + resolved "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz" integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -5045,7 +5124,7 @@ wrap-ansi@^6.2.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -5054,12 +5133,12 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" @@ -5069,52 +5148,52 @@ write-file-atomic@^3.0.0: ws@^7.4.5, ws@^7.4.6: version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== ws@^8.5.0: version "8.11.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + resolved "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz" integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== xml-name-validator@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== xmlchars@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== y18n@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.10.0: version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3: version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== yargs-parser@^18.1.2: version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" @@ -5122,7 +5201,7 @@ yargs-parser@^18.1.2: yargs@^15.1.0: version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" @@ -5139,7 +5218,7 @@ yargs@^15.1.0: yargs@^16.2.0: version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" @@ -5152,10 +5231,10 @@ yargs@^16.2.0: yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 4203ae51dd602aa709ec817e1a26cef1978d3e13 Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Wed, 15 Oct 2025 13:25:49 -0400 Subject: [PATCH 10/20] wip - decompressIfNeededWorks --- .../anchor/src/program/namespace/methods.ts | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/ts/packages/anchor/src/program/namespace/methods.ts b/ts/packages/anchor/src/program/namespace/methods.ts index 31dd27b1c2..01dcb7e481 100644 --- a/ts/packages/anchor/src/program/namespace/methods.ts +++ b/ts/packages/anchor/src/program/namespace/methods.ts @@ -669,14 +669,30 @@ export class MethodsBuilder< "ctokenCompressionAuthority", ]); - // Collect accounts to check for compression + // Collect potentially compressible accounts in deterministic order + // Order: CPDA accounts first (poolState, observationState), then ctoken accounts (vaults) + // This is CRITICAL: buildDecompressParams is order-sensitive const accountsToCheck: Array<{ name: string; address: PublicKey }> = []; + + // Determine compressible names by tags + const tags = scanCompressibleNames(this._idl); + + // Separate CPDA and ctoken accounts for proper ordering + const cpdaAccounts: Array<{ name: string; address: PublicKey }> = []; + const ctokenAccounts: Array<{ name: string; address: PublicKey }> = []; + for (const [name, addr] of Object.entries(this._decompressAccounts)) { if (SKIP_ACCOUNTS.has(name)) continue; try { const pubkey = translateAddress(addr as Address); - accountsToCheck.push({ name, address: pubkey }); + + // Sort by type: CPDAs first, then ctokens + if (tags.cpda.has(name)) { + cpdaAccounts.push({ name, address: pubkey }); + } else if (tags.cctoken.has(name)) { + ctokenAccounts.push({ name, address: pubkey }); + } } catch { console.warn( `[decompressIfNeeded] Invalid address for ${name}, skipping` @@ -684,6 +700,9 @@ export class MethodsBuilder< } } + // Concatenate: CPDAs first, then ctokens (matches SDK/reference ordering) + accountsToCheck.push(...cpdaAccounts, ...ctokenAccounts); + // Fetch compression state for all accounts const accountInputs = await this._fetchCompressibleAccounts( accountsToCheck @@ -711,8 +730,6 @@ export class MethodsBuilder< accountType: ai.accountType, info: ai.info, tokenVariant: ai.tokenVariant || undefined, - hasMerkleContext: !!ai.info?.merkleContext, - hasParsed: !!ai.info?.parsed, })) // null, // 2 @@ -736,22 +753,6 @@ export class MethodsBuilder< `[decompressIfNeeded] systemAccountsOffset: ${params.systemAccountsOffset}` ); - // Unwrap array-wrapped variant data (SDK packs as arrays, Anchor IDL expects structs) - const unwrappedCompressedAccounts = params.compressedAccounts.map( - (acc: any) => { - if (!acc?.data) return acc; - - const unwrappedData: any = {}; - for (const key in acc.data) { - const value = acc.data[key]; - unwrappedData[key] = - Array.isArray(value) && value.length === 1 ? value[0] : value; - } - - return { ...acc, data: unwrappedData }; - } - ); - // Build the decompress instruction const decompressIxFn = this._allInstructionFns[ "decompressAccountsIdempotent" @@ -773,7 +774,7 @@ export class MethodsBuilder< try { decompressIx = decompressIxFn( params.proofOption, - unwrappedCompressedAccounts, + params.compressedAccounts, params.systemAccountsOffset, { accounts: this._decompressAccounts as Accounts, From 7a42ad0dff94394b392f96422864fba5da8443b6 Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Fri, 17 Oct 2025 11:38:33 -0400 Subject: [PATCH 11/20] works: optional seeds --- .../anchor/src/program/namespace/methods.ts | 102 ++++++++++++++++-- 1 file changed, 91 insertions(+), 11 deletions(-) diff --git a/ts/packages/anchor/src/program/namespace/methods.ts b/ts/packages/anchor/src/program/namespace/methods.ts index 01dcb7e481..4a6bd97379 100644 --- a/ts/packages/anchor/src/program/namespace/methods.ts +++ b/ts/packages/anchor/src/program/namespace/methods.ts @@ -438,11 +438,15 @@ export class MethodsBuilder< /** * Enable automatic decompression for compressible accounts. * - * Requires ALL accounts needed by decompressAccountsIdempotent instruction to be provided. + * System accounts (feePayer, config, etc.) are REQUIRED. + * Seed accounts (lpMint, ammConfig, etc.) are OPTIONAL - only provide them + * if their dependent compressible accounts are being decompressed. + * * Automatically infers account types and variants from IDL, fetches compression state, * and injects decompress instruction if needed. * - * @param accounts - All accounts for decompressAccountsIdempotent instruction. + * @param accounts - Accounts for decompressAccountsIdempotent instruction. + * System accounts required, seed accounts optional. * @returns this builder for chaining * * @example @@ -450,6 +454,7 @@ export class MethodsBuilder< * await program.methods * .swap(amount) * .decompressIfNeeded({ + * // System accounts (required) * feePayer: owner.publicKey, * config: compressionConfig, * rentPayer: owner.publicKey, @@ -457,24 +462,25 @@ export class MethodsBuilder< * ctokenProgram: CompressedTokenProgram.programId, * ctokenCpiAuthority: CompressedTokenProgram.deriveCpiAuthorityPda, * ctokenConfig, - * ammConfig, + * // Seed accounts (optional - only provide what's needed) + * ammConfig, // Only if poolState is compressed + * token0Mint, // Only if token0Vault is compressed + * token1Mint, // Only if token1Vault is compressed + * // lpMint: omitted because lpVault not being decompressed + * // Compressible accounts * poolState, - * token0Mint, - * token1Mint, - * lpMint, * token0Vault, * token1Vault, - * lpVault, * }) * .accounts({ ... }) * .rpc(); * ``` */ public decompressIfNeeded( - accounts: Accounts & { [name: string]: Address } + accounts: Partial> & { [name: string]: Address } ) { this._enableAutoDecompress = true; - this._decompressAccounts = flattenPartialAccounts(accounts as any, true); + this._decompressAccounts = flattenPartialAccounts(accounts as any, false); return this; } @@ -765,9 +771,83 @@ export class MethodsBuilder< return; } + // Determine which seed accounts are required by the compressible accounts being decompressed + const requiredSeeds = new Set(); + for (const input of accountInputs) { + if (input.tokenVariant) { + // For CToken accounts, determine the required mint seed + // token0Vault → token0Mint, token1Vault → token1Mint, lpVault → lpMint + const variant = input.tokenVariant as string; + const mintSeed = variant.replace("Vault", "Mint"); + requiredSeeds.add(mintSeed); + console.log( + `[decompressIfNeeded] Account '${variant}' is being decompressed, requires seed: '${mintSeed}'` + ); + } + // For CPDA accounts, we could add more sophisticated logic here if needed + // For now, CPDA accounts like poolState, observationState typically don't have seed dependencies + // or their seeds are derived from other accounts already in the structure + } + + // Validate that all required seeds are provided + const missingRequiredSeeds: string[] = []; + for (const seedName of requiredSeeds) { + if (!(seedName in this._decompressAccounts)) { + missingRequiredSeeds.push(seedName); + } else { + try { + const seedPubkey = translateAddress( + this._decompressAccounts[seedName] as Address + ); + if (seedPubkey.equals(programId)) { + // Seed is set to program ID (not provided) + missingRequiredSeeds.push(seedName); + } + } catch { + missingRequiredSeeds.push(seedName); + } + } + } + + if (missingRequiredSeeds.length > 0) { + const compressibleNames = accountInputs + .filter((ai) => ai.tokenVariant) + .map((ai) => ai.tokenVariant) + .join(", "); + throw new Error( + `[decompressIfNeeded] Cannot decompress accounts [${compressibleNames}] because required seed accounts are missing: ${missingRequiredSeeds.join( + ", " + )}.\n\n` + + `These seed accounts must be provided when decompressing their associated compressible accounts. ` + + `Please include them in the decompressIfNeeded() call.` + ); + } + + // Fill in any missing accounts with program ID (represents "None" for optional accounts) + // This ensures all accounts from the IDL are present, even if not used + // BUT we only auto-fill accounts that are NOT required by compressible accounts being decompressed + const completeAccounts = { ...this._decompressAccounts }; + const decompressIxAccounts = decompressInstruction.accounts || []; + + for (const acc of decompressIxAccounts) { + const accountName = typeof acc === "string" ? acc : acc.name; + if (!(accountName in completeAccounts)) { + if (requiredSeeds.has(accountName)) { + // This should have been caught above, but double-check + throw new Error( + `[decompressIfNeeded] Required seed account '${accountName}' is missing but needed for decompression.` + ); + } + console.log( + `[decompressIfNeeded] Auto-filling optional account '${accountName}' with program ID (not needed for current decompression)` + ); + completeAccounts[accountName] = programId; + } + } + console.log( `[decompressIfNeeded] Building instruction with accounts:`, - Object.keys(this._decompressAccounts) + Object.keys(completeAccounts) ); let decompressIx; @@ -777,7 +857,7 @@ export class MethodsBuilder< params.compressedAccounts, params.systemAccountsOffset, { - accounts: this._decompressAccounts as Accounts, + accounts: completeAccounts as Accounts, remainingAccounts: params.remainingAccounts, } ); From ef09ee13281deb5ba7b064b8301b4f102316a7fd Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Fri, 17 Oct 2025 20:18:16 -0400 Subject: [PATCH 12/20] wip --- .../anchor/src/program/namespace/methods.ts | 231 +++++++++++++++++- 1 file changed, 221 insertions(+), 10 deletions(-) diff --git a/ts/packages/anchor/src/program/namespace/methods.ts b/ts/packages/anchor/src/program/namespace/methods.ts index 4a6bd97379..0b23c4c3e1 100644 --- a/ts/packages/anchor/src/program/namespace/methods.ts +++ b/ts/packages/anchor/src/program/namespace/methods.ts @@ -636,6 +636,145 @@ export class MethodsBuilder< return accountInputs; } + /** + * Helper to get account from main instruction if it exists with the same name + */ + private _getFromMainInstruction(accountName: string): PublicKey | null { + const programId = this._programId; + if (this._accounts && accountName in this._accounts) { + try { + const pubkey = translateAddress(this._accounts[accountName] as Address); + if (!pubkey.equals(programId)) { + console.log( + `[decompressIfNeeded] Using '${accountName}' from main instruction:`, + pubkey.toBase58() + ); + return pubkey; + } + } catch { + // Invalid address, ignore + } + } + return null; + } + + /** + * Auto-resolve constant and default accounts for decompressAccountsIdempotent. + * Priority: 1) User explicit values in decompressIfNeeded, 2) Main instruction accounts, 3) Auto-resolved defaults + */ + private _autoResolveDecompressAccounts(): void { + if (!this._decompressAccounts) return; + + const programId = this._programId; + + // Helper to check if an account is missing or set to program ID (placeholder) + const isAccountMissing = (name: string): boolean => { + if (!this._decompressAccounts || !(name in this._decompressAccounts)) + return true; + try { + const pubkey = translateAddress( + this._decompressAccounts![name] as Address + ); + return pubkey.equals(programId); + } catch { + return true; + } + }; + + // Constants (ALWAYS these values - enforced by Rust constraints) + const CTOKEN_PROGRAM_ID = new PublicKey( + "cTokenmWW8bLPjZEBAUgYy3zKxQZW6VKi7bqNFEVv3m" + ); + const CTOKEN_CPI_AUTHORITY_PDA = new PublicKey( + "GXtd2izAiMJPwMEjfgTRH3d7k9mjn4Jq3JrWFv9gySYy" + ); + + // Auto-resolve ctokenProgram (check main instruction first) + if (isAccountMissing("ctokenProgram")) { + const fromMain = this._getFromMainInstruction("ctokenProgram"); + if (fromMain && fromMain.equals(CTOKEN_PROGRAM_ID)) { + this._decompressAccounts.ctokenProgram = fromMain; + } else { + console.log( + "[decompressIfNeeded] Auto-resolving ctokenProgram to constant:", + CTOKEN_PROGRAM_ID.toBase58() + ); + this._decompressAccounts.ctokenProgram = CTOKEN_PROGRAM_ID; + } + } + + // Auto-resolve ctokenCpiAuthority (check main instruction first) + if (isAccountMissing("ctokenCpiAuthority")) { + const fromMain = this._getFromMainInstruction("ctokenCpiAuthority"); + if (fromMain && fromMain.equals(CTOKEN_CPI_AUTHORITY_PDA)) { + this._decompressAccounts.ctokenCpiAuthority = fromMain; + } else { + console.log( + "[decompressIfNeeded] Auto-resolving ctokenCpiAuthority to constant:", + CTOKEN_CPI_AUTHORITY_PDA.toBase58() + ); + this._decompressAccounts.ctokenCpiAuthority = CTOKEN_CPI_AUTHORITY_PDA; + } + } + + // Auto-resolve config (check main instruction first, then derive) + console.log("CHECKING if CONFIG IS MISSING"); + if (isAccountMissing("config")) { + console.log("CONFIG IS MISSING"); + const fromMain = this._getFromMainInstruction("config"); + if (fromMain) { + console.log("CONFIG IS in MAIN"); + console.log("FROM MAIN:", fromMain.toString()); + this._decompressAccounts.config = fromMain; + } else { + // Derive compression config PDA owned by the user's program. + // defaults to index 0 + const [configPda] = deriveCompressionConfigAddress(programId); + console.log("programId:", programId.toString()); + console.log( + "SHOULD BE THE SAME:", + deriveCompressionConfigAddress(programId)[0].toString() + ); + console.log( + "[decompressIfNeeded] Auto-resolving config to program's config PDA:", + configPda.toBase58(), + "(Note: must be initialized first via initialize_compression_config)" + ); + this._decompressAccounts.config = configPda; + } + } + + // Auto-resolve ctokenRentSponsor (check main instruction first, then fallback to feePayer) + if (isAccountMissing("ctokenRentSponsor")) { + const fromMain = this._getFromMainInstruction("ctokenRentSponsor"); + if (fromMain) { + this._decompressAccounts.ctokenRentSponsor = fromMain; + } else { + console.log( + "[decompressIfNeeded] Auto-resolving ctokenRentSponsor to cosntant CTOKEN_RENT_SPONSOR:", + CTOKEN_RENT_SPONSOR.toBase58() + ); + this._decompressAccounts.ctokenRentSponsor = CTOKEN_RENT_SPONSOR; + } + } + + // Auto-resolve ctokenConfig (check main instruction first, then derive) + if (isAccountMissing("ctokenConfig")) { + const fromMain = this._getFromMainInstruction("ctokenConfig"); + if (fromMain) { + this._decompressAccounts.ctokenConfig = fromMain; + } else { + // Derive ctoken config PDA using the correct SDK function + const [ctokenConfigPda] = deriveTokenProgramConfig(); + console.log( + "[decompressIfNeeded] Auto-resolving ctokenConfig to default PDA:", + ctokenConfigPda.toBase58() + ); + this._decompressAccounts.ctokenConfig = ctokenConfigPda; + } + } + } + /** * Internal method to inject decompress instruction if needed. */ @@ -771,8 +910,53 @@ export class MethodsBuilder< return; } + // Auto-resolve constant and default accounts before validation + this._autoResolveDecompressAccounts(); + // Determine which seed accounts are required by the compressible accounts being decompressed + // Extract seed dependencies from IDL's pda.seeds field const requiredSeeds = new Set(); + + // Helper to extract seed account names from IDL account definition + // Searches all instructions to find where the account is defined as a PDA + const extractSeedAccountsFromIdl = (accountName: string): string[] => { + if (!this._idl) return []; + + // Helper to find account in nested structure + const findAccount = (accounts: readonly any[], name: string): any => { + for (const acc of accounts) { + if ("accounts" in acc) { + const found = findAccount(acc.accounts, name); + if (found) return found; + } else if (acc.name === name) { + return acc; + } + } + return null; + }; + + // Search all instructions for this account's PDA definition + // TypeScript IDL is already in camelCase, use account names as-is + for (const ix of this._idl.instructions) { + const accountDef = findAccount(ix.accounts, accountName); + if (accountDef && accountDef.pda && accountDef.pda.seeds) { + // Found PDA definition - extract seed account names + const seedAccounts: string[] = []; + for (const seed of accountDef.pda.seeds) { + if (seed.kind === "account" && seed.path) { + // Path is already in camelCase in TS IDL (e.g., "ammConfig", "token0Mint") + // Just extract the base account name before any dots or parens + const baseName = seed.path.split(".")[0].split("(")[0]; + seedAccounts.push(baseName); + } + } + return seedAccounts; + } + } + + return []; + }; + for (const input of accountInputs) { if (input.tokenVariant) { // For CToken accounts, determine the required mint seed @@ -783,27 +967,52 @@ export class MethodsBuilder< console.log( `[decompressIfNeeded] Account '${variant}' is being decompressed, requires seed: '${mintSeed}'` ); + } else { + // For CPDA accounts, extract seed dependencies from IDL + const accountType = input.accountType as string; + const seedAccounts = extractSeedAccountsFromIdl(accountType); + + for (const seed of seedAccounts) { + requiredSeeds.add(seed); + console.log( + `[decompressIfNeeded] Account '${accountType}' is being decompressed, requires seed: '${seed}' (from IDL)` + ); + } } - // For CPDA accounts, we could add more sophisticated logic here if needed - // For now, CPDA accounts like poolState, observationState typically don't have seed dependencies - // or their seeds are derived from other accounts already in the structure } - // Validate that all required seeds are provided + // Auto-pull required seeds from main instruction if not explicitly provided const missingRequiredSeeds: string[] = []; for (const seedName of requiredSeeds) { + let isMissing = false; + + // Check if seed is in decompressAccounts if (!(seedName in this._decompressAccounts)) { - missingRequiredSeeds.push(seedName); + isMissing = true; } else { try { const seedPubkey = translateAddress( this._decompressAccounts[seedName] as Address ); if (seedPubkey.equals(programId)) { - // Seed is set to program ID (not provided) - missingRequiredSeeds.push(seedName); + // Seed is set to program ID (placeholder, not provided) + isMissing = true; } } catch { + isMissing = true; + } + } + + // If missing, try to get from main instruction + if (isMissing) { + const fromMain = this._getFromMainInstruction(seedName); + if (fromMain) { + console.log( + `[decompressIfNeeded] Auto-pulling required seed '${seedName}' from main instruction:`, + fromMain.toBase58() + ); + this._decompressAccounts[seedName] = fromMain; + } else { missingRequiredSeeds.push(seedName); } } @@ -811,15 +1020,17 @@ export class MethodsBuilder< if (missingRequiredSeeds.length > 0) { const compressibleNames = accountInputs - .filter((ai) => ai.tokenVariant) - .map((ai) => ai.tokenVariant) + .map((ai) => ai.tokenVariant || ai.accountType) .join(", "); throw new Error( `[decompressIfNeeded] Cannot decompress accounts [${compressibleNames}] because required seed accounts are missing: ${missingRequiredSeeds.join( ", " )}.\n\n` + `These seed accounts must be provided when decompressing their associated compressible accounts. ` + - `Please include them in the decompressIfNeeded() call.` + `Please include them in either:\n` + + ` 1. The main instruction's .accounts() or .accountsStrict() call, OR\n` + + ` 2. The .decompressIfNeeded() call\n\n` + + `The framework will automatically pull seeds from the main instruction if available.` ); } From 15aa9d5dbab20b9369499cb40488d0824aec6d80 Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Sat, 18 Oct 2025 10:32:07 -0400 Subject: [PATCH 13/20] fix deps --- ts/packages/anchor/package.json | 2 +- ts/packages/anchor/src/provider.ts | 18 ++- ts/packages/anchor/src/utils/rpc.ts | 11 +- ts/yarn.lock | 185 +++++++++++++++++++++++++++- 4 files changed, 206 insertions(+), 10 deletions(-) diff --git a/ts/packages/anchor/package.json b/ts/packages/anchor/package.json index 753d2995f5..2341d2509d 100644 --- a/ts/packages/anchor/package.json +++ b/ts/packages/anchor/package.json @@ -39,7 +39,7 @@ "@lightprotocol/stateless.js": "file:../../../../light-protocol/js/stateless.js", "@noble/hashes": "^1.3.1", "@solana/spl-token": ">=0.3.9", - "@solana/web3.js": "^1.69.0", + "@solana/web3.js": "^1.95.3", "bn.js": "^5.1.2", "bs58": "^4.0.1", "buffer-layout": "^1.2.2", diff --git a/ts/packages/anchor/src/provider.ts b/ts/packages/anchor/src/provider.ts index 88dcf63875..7a6bcb1ad9 100644 --- a/ts/packages/anchor/src/provider.ts +++ b/ts/packages/anchor/src/provider.ts @@ -187,7 +187,14 @@ export class AnchorProvider implements Provider { throw err; } else { const logs = failedTx.meta?.logMessages; - throw !logs ? err : new SendTransactionError(err.message, logs); + throw !logs + ? err + : new SendTransactionError({ + action: "send", + signature: txSig, + transactionMessage: err.message, + logs, + }); } } else { throw err; @@ -271,7 +278,14 @@ export class AnchorProvider implements Provider { throw err; } else { const logs = failedTx.meta?.logMessages; - throw !logs ? err : new SendTransactionError(err.message, logs); + throw !logs + ? err + : new SendTransactionError({ + action: "send", + signature: txSig, + transactionMessage: err.message, + logs, + }); } } else { throw err; diff --git a/ts/packages/anchor/src/utils/rpc.ts b/ts/packages/anchor/src/utils/rpc.ts index 309869d075..c4e0142a45 100644 --- a/ts/packages/anchor/src/utils/rpc.ts +++ b/ts/packages/anchor/src/utils/rpc.ts @@ -202,10 +202,13 @@ export async function simulateTransaction( console.error(res.error.message, logTrace); } } - throw new SendTransactionError( - "failed to simulate transaction: " + res.error.message, - logs - ); + throw new SendTransactionError({ + action: "simulate", + signature: "", // We don't have a signature for simulation errors + transactionMessage: + "failed to simulate transaction: " + res.error.message, + logs, + }); } return res.result; } diff --git a/ts/yarn.lock b/ts/yarn.lock index b790faabec..38481da2c7 100644 --- a/ts/yarn.lock +++ b/ts/yarn.lock @@ -320,6 +320,11 @@ dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.25.0": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.4.tgz#a70226016fabe25c5783b2f22d3e1c9bc5ca3326" + integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ== + "@babel/template@^7.18.10", "@babel/template@^7.3.3": version "7.18.10" resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" @@ -855,6 +860,13 @@ "@solana/buffer-layout" "=4.0.0" "@solana/buffer-layout-utils" "=0.2.0" +"@noble/curves@^1.4.2": + version "1.9.7" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.9.7.tgz#79d04b4758a43e4bca2cbdc62e7771352fa6b951" + integrity sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw== + dependencies: + "@noble/hashes" "1.8.0" + "@noble/ed25519@^1.7.0": version "1.7.1" resolved "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.1.tgz" @@ -865,6 +877,11 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== +"@noble/hashes@1.8.0", "@noble/hashes@^1.4.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" + integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== + "@noble/hashes@^1.1.2", "@noble/hashes@^1.3.1": version "1.3.1" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz" @@ -1010,6 +1027,13 @@ dependencies: buffer "~6.0.3" +"@solana/buffer-layout@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" + integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== + dependencies: + buffer "~6.0.3" + "@solana/codecs-core@2.0.0-rc.1": version "2.0.0-rc.1" resolved "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-rc.1.tgz" @@ -1017,6 +1041,13 @@ dependencies: "@solana/errors" "2.0.0-rc.1" +"@solana/codecs-core@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@solana/codecs-core/-/codecs-core-2.3.0.tgz#6bf2bb565cb1ae880f8018635c92f751465d8695" + integrity sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw== + dependencies: + "@solana/errors" "2.3.0" + "@solana/codecs-data-structures@2.0.0-rc.1": version "2.0.0-rc.1" resolved "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-rc.1.tgz" @@ -1034,6 +1065,14 @@ "@solana/codecs-core" "2.0.0-rc.1" "@solana/errors" "2.0.0-rc.1" +"@solana/codecs-numbers@^2.1.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@solana/codecs-numbers/-/codecs-numbers-2.3.0.tgz#ac7e7f38aaf7fcd22ce2061fbdcd625e73828dc6" + integrity sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg== + dependencies: + "@solana/codecs-core" "2.3.0" + "@solana/errors" "2.3.0" + "@solana/codecs-strings@2.0.0-rc.1": version "2.0.0-rc.1" resolved "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-rc.1.tgz" @@ -1062,6 +1101,14 @@ chalk "^5.3.0" commander "^12.1.0" +"@solana/errors@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@solana/errors/-/errors-2.3.0.tgz#4ac9380343dbeffb9dffbcb77c28d0e457c5fa31" + integrity sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ== + dependencies: + chalk "^5.4.1" + commander "^14.0.0" + "@solana/options@2.0.0-rc.1": version "2.0.0-rc.1" resolved "https://registry.npmjs.org/@solana/options/-/options-2.0.0-rc.1.tgz" @@ -1098,7 +1145,7 @@ "@solana/spl-token-metadata" "^0.1.6" buffer "^6.0.3" -"@solana/web3.js@^1.32.0", "@solana/web3.js@^1.69.0": +"@solana/web3.js@^1.32.0": version "1.69.0" resolved "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.69.0.tgz" integrity sha512-iU2Q0IG25RITsxBkY1Vkk74LffRokViEcSblz4CGxyt+/V7xSkC2DNM0n0rB3aY/9+FvMiz4l5wHnD9UC4Ac/w== @@ -1119,6 +1166,34 @@ rpc-websockets "^7.5.0" superstruct "^0.14.2" +"@solana/web3.js@^1.95.3": + version "1.98.4" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.98.4.tgz#df51d78be9d865181ec5138b4e699d48e6895bbe" + integrity sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw== + dependencies: + "@babel/runtime" "^7.25.0" + "@noble/curves" "^1.4.2" + "@noble/hashes" "^1.4.0" + "@solana/buffer-layout" "^4.0.1" + "@solana/codecs-numbers" "^2.1.0" + agentkeepalive "^4.5.0" + bn.js "^5.2.1" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.3" + fast-stable-stringify "^1.0.0" + jayson "^4.1.1" + node-fetch "^2.7.0" + rpc-websockets "^9.0.2" + superstruct "^2.0.2" + +"@swc/helpers@^0.5.11": + version "0.5.17" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.17.tgz#5a7be95ac0f0bf186e7e6e890e7a6f6cda6ce971" + integrity sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A== + dependencies: + tslib "^2.8.0" + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" @@ -1308,6 +1383,11 @@ resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/uuid@^8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + "@types/ws@^7.4.4": version "7.4.7" resolved "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz" @@ -1315,6 +1395,13 @@ dependencies: "@types/node" "*" +"@types/ws@^8.2.2": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9" + integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" @@ -1450,6 +1537,13 @@ agent-base@6: dependencies: debug "4" +agentkeepalive@^4.5.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a" + integrity sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ== + dependencies: + humanize-ms "^1.2.1" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" @@ -1842,7 +1936,7 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.3.0: +chalk@^5.3.0, chalk@^5.4.1: version "5.6.2" resolved "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz" integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== @@ -1956,6 +2050,11 @@ commander@^12.1.0: resolved "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz" integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== +commander@^14.0.0: + version "14.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-14.0.1.tgz#2f9225c19e6ebd0dc4404dd45821b2caa17ea09b" + integrity sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A== + commander@^2.20.0, commander@^2.20.3: version "2.20.3" resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" @@ -2412,6 +2511,11 @@ eventemitter3@^4.0.7: resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + execa@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" @@ -2793,6 +2897,13 @@ human-signals@^2.1.0: resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + husky@^4.3.0: version "4.3.8" resolved "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz" @@ -3051,6 +3162,24 @@ jayson@^3.4.4: uuid "^8.3.2" ws "^7.4.5" +jayson@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.2.0.tgz#b71762393fa40bc9637eaf734ca6f40d3b8c0c93" + integrity sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg== + dependencies: + "@types/connect" "^3.4.33" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + commander "^2.20.3" + delay "^5.0.0" + es6-promisify "^5.0.0" + eyes "^0.1.8" + isomorphic-ws "^4.0.1" + json-stringify-safe "^5.0.1" + stream-json "^1.9.1" + uuid "^8.3.2" + ws "^7.5.10" + jest-changed-files@^27.5.1: version "27.5.1" resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz" @@ -3853,6 +3982,11 @@ ms@2.1.2: resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" @@ -3865,6 +3999,13 @@ node-fetch@2, node-fetch@2.6.7: dependencies: whatwg-url "^5.0.0" +node-fetch@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + node-gyp-build@^4.3.0: version "4.5.0" resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz" @@ -4346,6 +4487,22 @@ rpc-websockets@^7.5.0: bufferutil "^4.0.1" utf-8-validate "^5.0.2" +rpc-websockets@^9.0.2: + version "9.2.0" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-9.2.0.tgz#c95633929ca92c311ed6e169f4c986623f001505" + integrity sha512-DS/XHdPxplQTtNRKiBCRWGBJfjOk56W7fyFUpiYi9fSTWTzoEMbUkn3J4gB0IMniIEVeAGR1/rzFQogzD5MxvQ== + dependencies: + "@swc/helpers" "^0.5.11" + "@types/uuid" "^8.3.4" + "@types/ws" "^8.2.2" + buffer "^6.0.3" + eventemitter3 "^5.0.1" + uuid "^8.3.2" + ws "^8.5.0" + optionalDependencies: + bufferutil "^4.0.1" + utf-8-validate "^5.0.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" @@ -4543,6 +4700,18 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +stream-chain@^2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/stream-chain/-/stream-chain-2.2.5.tgz#b30967e8f14ee033c5b9a19bbe8a2cba90ba0d09" + integrity sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA== + +stream-json@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/stream-json/-/stream-json-1.9.1.tgz#e3fec03e984a503718946c170db7d74556c2a187" + integrity sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw== + dependencies: + stream-chain "^2.2.5" + string-argv@0.3.1: version "0.3.1" resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz" @@ -4610,7 +4779,7 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -superstruct@2.0.2: +superstruct@2.0.2, superstruct@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-2.0.2.tgz#3f6d32fbdc11c357deff127d591a39b996300c54" integrity sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A== @@ -4850,6 +5019,11 @@ tslib@^2.1.0, tslib@^2.3.1: resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== +tslib@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" @@ -5151,6 +5325,11 @@ ws@^7.4.5, ws@^7.4.6: resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@^7.5.10: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + ws@^8.5.0: version "8.11.0" resolved "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz" From 2df6f3170a48c61d867c6658b774dcd6f6583631 Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Sat, 18 Oct 2025 14:56:10 -0400 Subject: [PATCH 14/20] clean methods.ts --- Cargo.lock | 832 ++---------------- idl/spec/src/lib.rs | 2 + idl/src/convert.rs | 1 + lang/syn/src/codegen/accounts/constraints.rs | 7 +- lang/syn/src/idl/accounts.rs | 22 +- lang/syn/src/lib.rs | 7 + lang/syn/src/parser/accounts/constraints.rs | 17 + .../anchor/src/program/namespace/methods.ts | 557 ++++++------ 8 files changed, 358 insertions(+), 1087 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b9306bb57b..9a9c4cf445 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -87,7 +87,7 @@ dependencies = [ "getrandom 0.2.10", "once_cell", "version_check", - "zerocopy 0.7.32", + "zerocopy", ] [[package]] @@ -99,15 +99,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "aligned-sized" -version = "1.1.0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -123,40 +114,11 @@ dependencies = [ "alloc-no-stdlib", ] -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "anchor-attribute-access-control" -version = "0.31.1" -dependencies = [ - "anchor-syn 0.31.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "anchor-attribute-access-control" version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f70fd141a4d18adf11253026b32504f885447048c7494faf5fa83b01af9c0cf" -dependencies = [ - "anchor-syn 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-account" -version = "0.31.1" dependencies = [ - "anchor-syn 0.31.1", - "bs58", + "anchor-syn", "proc-macro2", "quote", "syn 1.0.109", @@ -165,10 +127,8 @@ dependencies = [ [[package]] name = "anchor-attribute-account" version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "715a261c57c7679581e06f07a74fa2af874ac30f86bd8ea07cca4a7e5388a064" dependencies = [ - "anchor-syn 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-syn", "bs58", "proc-macro2", "quote", @@ -179,27 +139,7 @@ dependencies = [ name = "anchor-attribute-constant" version = "0.31.1" dependencies = [ - "anchor-syn 0.31.1", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-constant" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730d6df8ae120321c5c25e0779e61789e4b70dc8297102248902022f286102e4" -dependencies = [ - "anchor-syn 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-error" -version = "0.31.1" -dependencies = [ - "anchor-syn 0.31.1", + "anchor-syn", "quote", "syn 1.0.109", ] @@ -207,20 +147,8 @@ dependencies = [ [[package]] name = "anchor-attribute-error" version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27e6e449cc3a37b2880b74dcafb8e5a17b954c0e58e376432d7adc646fb333ef" -dependencies = [ - "anchor-syn 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-event" -version = "0.31.1" dependencies = [ - "anchor-syn 0.31.1", - "proc-macro2", + "anchor-syn", "quote", "syn 1.0.109", ] @@ -228,38 +156,19 @@ dependencies = [ [[package]] name = "anchor-attribute-event" version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7710e4c54adf485affcd9be9adec5ef8846d9c71d7f31e16ba86ff9fc1dd49f" -dependencies = [ - "anchor-syn 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-program" -version = "0.31.1" dependencies = [ - "anchor-lang-idl 0.1.2", - "anchor-syn 0.31.1", - "anyhow", - "bs58", - "heck 0.3.3", + "anchor-syn", "proc-macro2", "quote", - "serde_json", "syn 1.0.109", ] [[package]] name = "anchor-attribute-program" version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ecfd49b2aeadeb32f35262230db402abed76ce87e27562b34f61318b2ec83c" dependencies = [ - "anchor-lang-idl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "anchor-syn 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-lang-idl", + "anchor-syn", "anyhow", "bs58", "heck 0.3.3", @@ -274,8 +183,8 @@ name = "anchor-cli" version = "0.31.1" dependencies = [ "anchor-client", - "anchor-lang 0.31.1", - "anchor-lang-idl 0.1.2", + "anchor-lang", + "anchor-lang-idl", "anyhow", "base64 0.21.7", "bincode", @@ -309,7 +218,7 @@ dependencies = [ name = "anchor-client" version = "0.31.1" dependencies = [ - "anchor-lang 0.31.1", + "anchor-lang", "anyhow", "futures", "regex", @@ -326,29 +235,7 @@ dependencies = [ name = "anchor-derive-accounts" version = "0.31.1" dependencies = [ - "anchor-syn 0.31.1", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-derive-accounts" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be89d160793a88495af462a7010b3978e48e30a630c91de47ce2c1d3cb7a6149" -dependencies = [ - "anchor-syn 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-derive-serde" -version = "0.31.1" -dependencies = [ - "anchor-syn 0.31.1", - "borsh-derive-internal", - "proc-macro2", + "anchor-syn", "quote", "syn 1.0.109", ] @@ -356,10 +243,8 @@ dependencies = [ [[package]] name = "anchor-derive-serde" version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abc6ee78acb7bfe0c2dd2abc677aaa4789c0281a0c0ef01dbf6fe85e0fd9e6e4" dependencies = [ - "anchor-syn 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-syn", "borsh-derive-internal", "proc-macro2", "quote", @@ -375,64 +260,20 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "anchor-derive-space" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134a01c0703f6fd355a0e472c033f6f3e41fac1ef6e370b20c50f4c8d022cea7" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "anchor-lang" version = "0.31.1" dependencies = [ - "anchor-attribute-access-control 0.31.1", - "anchor-attribute-account 0.31.1", - "anchor-attribute-constant 0.31.1", - "anchor-attribute-error 0.31.1", - "anchor-attribute-event 0.31.1", - "anchor-attribute-program 0.31.1", - "anchor-derive-accounts 0.31.1", - "anchor-derive-serde 0.31.1", - "anchor-derive-space 0.31.1", - "anchor-lang-idl 0.1.2", - "base64 0.21.7", - "bincode", - "borsh 0.10.3", - "bytemuck", - "light-compressed-account", - "light-compressed-token-sdk", - "light-compressible", - "light-ctoken-types", - "light-hasher", - "light-macros", - "light-sdk", - "light-sdk-macros", - "light-sdk-types", - "solana-program 2.3.0", - "thiserror 1.0.66", -] - -[[package]] -name = "anchor-lang" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6bab117055905e930f762c196e08f861f8dfe7241b92cee46677a3b15561a0a" -dependencies = [ - "anchor-attribute-access-control 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "anchor-attribute-account 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "anchor-attribute-constant 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "anchor-attribute-error 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "anchor-attribute-event 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "anchor-attribute-program 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "anchor-derive-accounts 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "anchor-derive-serde 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "anchor-derive-space 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "anchor-lang-idl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-attribute-access-control", + "anchor-attribute-account", + "anchor-attribute-constant", + "anchor-attribute-error", + "anchor-attribute-event", + "anchor-attribute-program", + "anchor-derive-accounts", + "anchor-derive-serde", + "anchor-derive-space", + "anchor-lang-idl", "base64 0.21.7", "bincode", "borsh 0.10.3", @@ -445,22 +286,7 @@ dependencies = [ name = "anchor-lang-idl" version = "0.1.2" dependencies = [ - "anchor-lang-idl-spec 0.1.0", - "anyhow", - "heck 0.3.3", - "regex", - "serde", - "serde_json", - "sha2 0.10.8", -] - -[[package]] -name = "anchor-lang-idl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e8599d21995f68e296265aa5ab0c3cef582fd58afec014d01bd0bce18a4418" -dependencies = [ - "anchor-lang-idl-spec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-lang-idl-spec", "anyhow", "heck 0.3.3", "regex", @@ -477,21 +303,11 @@ dependencies = [ "serde", ] -[[package]] -name = "anchor-lang-idl-spec" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bdf143115440fe621bdac3a29a1f7472e09f6cd82b2aa569429a0c13f103838" -dependencies = [ - "anyhow", - "serde", -] - [[package]] name = "anchor-spl" version = "0.31.1" dependencies = [ - "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "anchor-lang", "borsh 0.10.3", "mpl-token-metadata", "spl-associated-token-account", @@ -503,44 +319,9 @@ dependencies = [ "spl-token-metadata-interface 0.6.0", ] -[[package]] -name = "anchor-spl" -version = "0.31.1" -source = "git+https://github.com/lightprotocol/anchor?rev=d8a2b3d9#d8a2b3d99d61ef900d1f6cdaabcef14eb9af6279" -dependencies = [ - "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "mpl-token-metadata", - "spl-associated-token-account", - "spl-memo", - "spl-pod", - "spl-token 7.0.0", - "spl-token-2022 6.0.0", - "spl-token-group-interface 0.5.0", - "spl-token-metadata-interface 0.6.0", -] - -[[package]] -name = "anchor-syn" -version = "0.31.1" -dependencies = [ - "anyhow", - "bs58", - "cargo_toml", - "heck 0.3.3", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2 0.10.8", - "syn 1.0.109", - "thiserror 1.0.66", -] - [[package]] name = "anchor-syn" version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dc7a6d90cc643df0ed2744862cdf180587d1e5d28936538c18fc8908489ed67" dependencies = [ "anyhow", "bs58", @@ -551,6 +332,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.8", + "spl-pod", "syn 1.0.109", "thiserror 1.0.66", ] @@ -634,20 +416,9 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" dependencies = [ - "ark-ec 0.4.2", - "ark-ff 0.4.2", - "ark-std 0.4.0", -] - -[[package]] -name = "ark-bn254" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" -dependencies = [ - "ark-ec 0.5.0", - "ark-ff 0.5.0", - "ark-std 0.5.0", + "ark-ec", + "ark-ff", + "ark-std", ] [[package]] @@ -656,10 +427,10 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" dependencies = [ - "ark-ff 0.4.2", - "ark-poly 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", "derivative", "hashbrown 0.13.2", "itertools 0.10.5", @@ -667,37 +438,16 @@ dependencies = [ "zeroize", ] -[[package]] -name = "ark-ec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" -dependencies = [ - "ahash", - "ark-ff 0.5.0", - "ark-poly 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "educe", - "fnv", - "hashbrown 0.15.0", - "itertools 0.13.0", - "num-bigint 0.4.6", - "num-integer", - "num-traits", - "zeroize", -] - [[package]] name = "ark-ff" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" dependencies = [ - "ark-ff-asm 0.4.2", - "ark-ff-macros 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", "derivative", "digest 0.10.7", "itertools 0.10.5", @@ -708,26 +458,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "ark-ff" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" -dependencies = [ - "ark-ff-asm 0.5.0", - "ark-ff-macros 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "arrayvec", - "digest 0.10.7", - "educe", - "itertools 0.13.0", - "num-bigint 0.4.6", - "num-traits", - "paste", - "zeroize", -] - [[package]] name = "ark-ff-asm" version = "0.4.2" @@ -738,16 +468,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ark-ff-asm" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" -dependencies = [ - "quote", - "syn 2.0.106", -] - [[package]] name = "ark-ff-macros" version = "0.4.2" @@ -761,68 +481,27 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ark-ff-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" -dependencies = [ - "num-bigint 0.4.6", - "num-traits", - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "ark-poly" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" dependencies = [ - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "ark-ff", + "ark-serialize", + "ark-std", "derivative", "hashbrown 0.13.2", ] -[[package]] -name = "ark-poly" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" -dependencies = [ - "ahash", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "educe", - "fnv", - "hashbrown 0.15.0", -] - [[package]] name = "ark-serialize" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" dependencies = [ - "ark-serialize-derive 0.4.2", - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint 0.4.6", -] - -[[package]] -name = "ark-serialize" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" -dependencies = [ - "ark-serialize-derive 0.5.0", - "ark-std 0.5.0", - "arrayvec", + "ark-serialize-derive", + "ark-std", "digest 0.10.7", "num-bigint 0.4.6", ] @@ -838,17 +517,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ark-serialize-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "ark-std" version = "0.4.0" @@ -859,16 +527,6 @@ dependencies = [ "rand 0.8.5", ] -[[package]] -name = "ark-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - [[package]] name = "arrayref" version = "0.3.9" @@ -1944,18 +1602,6 @@ dependencies = [ "sha2 0.10.8", ] -[[package]] -name = "educe" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" -dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "either" version = "1.9.0" @@ -1992,37 +1638,17 @@ dependencies = [ [[package]] name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - -[[package]] -name = "encoding_rs" -version = "0.8.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enum-ordinalize" -version = "4.3.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" -dependencies = [ - "enum-ordinalize-derive", -] +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] -name = "enum-ordinalize-derive" -version = "4.3.1" +name = "encoding_rs" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", + "cfg-if", ] [[package]] @@ -2452,9 +2078,6 @@ name = "hashbrown" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" -dependencies = [ - "allocator-api2", -] [[package]] name = "heck" @@ -2970,15 +2593,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.9" @@ -3168,255 +2782,6 @@ dependencies = [ "libsecp256k1-core", ] -[[package]] -name = "light-account-checks" -version = "0.3.0" -dependencies = [ - "solana-account-info 2.3.0", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-sysvar 2.3.0", - "thiserror 2.0.16", -] - -[[package]] -name = "light-compressed-account" -version = "0.3.0" -dependencies = [ - "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "borsh 0.10.3", - "light-hasher", - "light-macros", - "light-profiler", - "light-zero-copy", - "log", - "pinocchio", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "thiserror 2.0.16", - "zerocopy 0.8.27", -] - -[[package]] -name = "light-compressed-token-sdk" -version = "0.1.0" -dependencies = [ - "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "anchor-spl 0.31.1 (git+https://github.com/lightprotocol/anchor?rev=d8a2b3d9)", - "arrayvec", - "borsh 0.10.3", - "light-account-checks", - "light-compressed-account", - "light-compressed-token-types", - "light-ctoken-types", - "light-macros", - "light-profiler", - "light-sdk", - "light-sdk-types", - "light-zero-copy", - "solana-account-info 2.3.0", - "solana-cpi 2.2.1", - "solana-instruction 2.3.0", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "spl-pod", - "spl-token-2022 7.0.0", - "thiserror 2.0.16", -] - -[[package]] -name = "light-compressed-token-types" -version = "0.1.0" -dependencies = [ - "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "borsh 0.10.3", - "light-account-checks", - "light-compressed-account", - "light-macros", - "light-sdk-types", - "solana-msg 2.2.1", - "thiserror 2.0.16", -] - -[[package]] -name = "light-compressible" -version = "0.1.0" -dependencies = [ - "aligned-sized", - "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "borsh 0.10.3", - "bytemuck", - "light-account-checks", - "light-compressed-account", - "light-hasher", - "light-macros", - "light-profiler", - "light-zero-copy", - "pinocchio", - "pinocchio-pubkey", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-sysvar 2.3.0", - "thiserror 2.0.16", - "zerocopy 0.8.27", -] - -[[package]] -name = "light-ctoken-types" -version = "0.1.0" -dependencies = [ - "aligned-sized", - "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "arrayvec", - "borsh 0.10.3", - "bytemuck", - "light-compressed-account", - "light-compressible", - "light-hasher", - "light-macros", - "light-profiler", - "light-zero-copy", - "pinocchio", - "pinocchio-pubkey", - "solana-account-info 2.3.0", - "solana-msg 2.2.1", - "solana-pubkey 2.4.0", - "spl-pod", - "spl-token-2022 7.0.0", - "thiserror 2.0.16", - "zerocopy 0.8.27", -] - -[[package]] -name = "light-hasher" -version = "3.1.0" -dependencies = [ - "ark-bn254 0.5.0", - "ark-ff 0.5.0", - "arrayvec", - "borsh 0.10.3", - "light-poseidon", - "num-bigint 0.4.6", - "sha2 0.10.8", - "sha3", - "solana-nostd-keccak", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "thiserror 2.0.16", -] - -[[package]] -name = "light-macros" -version = "2.1.0" -dependencies = [ - "bs58", - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "light-poseidon" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3d87542063daaccbfecd78b60f988079b6ec4e089249658b9455075c78d42" -dependencies = [ - "ark-bn254 0.5.0", - "ark-ff 0.5.0", - "num-bigint 0.4.6", - "thiserror 1.0.66", -] - -[[package]] -name = "light-profiler" -version = "0.1.0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "light-sdk" -version = "0.13.0" -dependencies = [ - "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "arrayvec", - "bincode", - "borsh 0.10.3", - "light-account-checks", - "light-compressed-account", - "light-hasher", - "light-macros", - "light-sdk-macros", - "light-sdk-types", - "light-zero-copy", - "num-bigint 0.4.6", - "solana-account-info 2.3.0", - "solana-clock 2.2.2", - "solana-cpi 2.2.1", - "solana-instruction 2.3.0", - "solana-msg 2.2.1", - "solana-program 2.3.0", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-system-interface 1.0.0", - "solana-sysvar 2.3.0", - "thiserror 2.0.16", -] - -[[package]] -name = "light-sdk-macros" -version = "0.13.0" -dependencies = [ - "heck 0.4.1", - "light-hasher", - "light-poseidon", - "proc-macro2", - "quote", - "solana-pubkey 2.4.0", - "syn 2.0.106", -] - -[[package]] -name = "light-sdk-types" -version = "0.13.0" -dependencies = [ - "anchor-lang 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "borsh 0.10.3", - "light-account-checks", - "light-compressed-account", - "light-hasher", - "light-macros", - "light-zero-copy", - "solana-msg 2.2.1", - "thiserror 2.0.16", -] - -[[package]] -name = "light-zero-copy" -version = "0.2.0" -dependencies = [ - "arrayvec", - "light-zero-copy-derive", - "zerocopy 0.8.27", -] - -[[package]] -name = "light-zero-copy-derive" -version = "0.1.0" -dependencies = [ - "lazy_static", - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "linux-raw-sys" version = "0.4.8" @@ -3964,23 +3329,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pinocchio" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b971851087bc3699b001954ad02389d50c41405ece3548cbcafc88b3e20017a" - -[[package]] -name = "pinocchio-pubkey" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0225638cadcbebae8932cb7f49cb5da7c15c21beb19f048f05a5ca7d93f065" -dependencies = [ - "five8_const", - "pinocchio", - "sha2-const-stable", -] - [[package]] name = "pkcs8" version = "0.10.2" @@ -4917,12 +4265,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha2-const-stable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" - [[package]] name = "sha3" version = "0.10.8" @@ -5279,10 +4621,10 @@ version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4420f125118732833f36facf96a27e7b78314b2d642ba07fa9ffdacd8d79e243" dependencies = [ - "ark-bn254 0.4.0", - "ark-ec 0.4.2", - "ark-ff 0.4.2", - "ark-serialize 0.4.2", + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", "bytemuck", "solana-define-syscall 2.3.0", "thiserror 2.0.16", @@ -6269,15 +5611,6 @@ dependencies = [ "solana-sdk-ids 2.2.1", ] -[[package]] -name = "solana-nostd-keccak" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8ced70920435b1baa58f76e6f84bbc1110ddd1d6161ec76b6d731ae8431e9c4" -dependencies = [ - "sha3", -] - [[package]] name = "solana-offchain-message" version = "2.2.1" @@ -8181,34 +7514,6 @@ dependencies = [ "thiserror 1.0.66", ] -[[package]] -name = "spl-token-2022" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9048b26b0df0290f929ff91317c83db28b3ef99af2b3493dd35baa146774924c" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive 0.4.0", - "num-traits", - "num_enum", - "solana-program 2.3.0", - "solana-security-txt", - "solana-zk-sdk", - "spl-elgamal-registry 0.1.1", - "spl-memo", - "spl-pod", - "spl-token 7.0.0", - "spl-token-confidential-transfer-ciphertext-arithmetic 0.2.1", - "spl-token-confidential-transfer-proof-extraction 0.2.1", - "spl-token-confidential-transfer-proof-generation 0.3.0", - "spl-token-group-interface 0.5.0", - "spl-token-metadata-interface 0.6.0", - "spl-transfer-hook-interface 0.9.0", - "spl-type-length-value 0.7.0", - "thiserror 2.0.16", -] - [[package]] name = "spl-token-2022" version = "8.0.1" @@ -8322,17 +7627,6 @@ dependencies = [ "thiserror 1.0.66", ] -[[package]] -name = "spl-token-confidential-transfer-proof-generation" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e3597628b0d2fe94e7900fd17cdb4cfbb31ee35c66f82809d27d86e44b2848b" -dependencies = [ - "curve25519-dalek 4.1.3", - "solana-zk-sdk", - "thiserror 2.0.16", -] - [[package]] name = "spl-token-confidential-transfer-proof-generation" version = "0.4.1" @@ -9728,16 +9022,7 @@ version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ - "zerocopy-derive 0.7.32", -] - -[[package]] -name = "zerocopy" -version = "0.8.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" -dependencies = [ - "zerocopy-derive 0.8.27", + "zerocopy-derive", ] [[package]] @@ -9751,17 +9036,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "zerocopy-derive" -version = "0.8.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "zerofrom" version = "0.1.6" diff --git a/idl/spec/src/lib.rs b/idl/spec/src/lib.rs index d1fb0b0e65..d1abd22dd2 100644 --- a/idl/spec/src/lib.rs +++ b/idl/spec/src/lib.rs @@ -86,6 +86,8 @@ pub struct IdlInstructionAccount { pub signer: bool, #[serde(default, skip_serializing_if = "is_default")] pub optional: bool, + #[serde(default, skip_serializing_if = "is_default")] + pub compressible: bool, #[serde(skip_serializing_if = "is_default")] pub address: Option, #[serde(skip_serializing_if = "is_default")] diff --git a/idl/src/convert.rs b/idl/src/convert.rs index 01edc14252..69a7eff44f 100644 --- a/idl/src/convert.rs +++ b/idl/src/convert.rs @@ -510,6 +510,7 @@ mod legacy { writable: acc.is_mut, signer: acc.is_signer, optional: acc.is_optional.unwrap_or_default(), + compressible: false, address: Default::default(), pda: acc .pda diff --git a/lang/syn/src/codegen/accounts/constraints.rs b/lang/syn/src/codegen/accounts/constraints.rs index b1d3a2af39..554769ed5d 100644 --- a/lang/syn/src/codegen/accounts/constraints.rs +++ b/lang/syn/src/codegen/accounts/constraints.rs @@ -89,6 +89,7 @@ pub fn linearize(c_group: &ConstraintGroup) -> Vec { cmint: _, cpda: _, cctoken: _, + compressible: _, } = c_group.clone(); let mut constraints = Vec::new(); @@ -1596,14 +1597,14 @@ fn generate_constraint_mint( { // Check if this is a CToken mint #is_ctoken_check - + #decimal_check #mint_authority_check #freeze_authority_check - + // Check token_program ownership (system_program for CToken, token_program for SPL/T22) #token_program_check - + // Skip extension checks for CToken mints if !__is_ctoken { #group_pointer_authority_check diff --git a/lang/syn/src/idl/accounts.rs b/lang/syn/src/idl/accounts.rs index 67e46212bc..f86b9c14dc 100644 --- a/lang/syn/src/idl/accounts.rs +++ b/lang/syn/src/idl/accounts.rs @@ -33,19 +33,18 @@ pub fn gen_idl_build_impl_accounts_struct(accounts: &AccountsStruct) -> TokenStr _ => quote! { vec![] }, }; - // Append compressibility tags to docs based on parsed constraints - let docs = { - let mut d = docs; + // Detect compressibility from constraints + let compressible = { + // Check explicit compressible marker + let has_compressible_marker = acc.constraints.compressible.is_some(); + // Check initialization constraints (for init instructions) let has_cpda = acc.constraints.cpda.is_some(); let has_cctoken = acc.constraints.cctoken.is_some(); - - if has_cpda { - d = quote! {{ let mut v = #d; v.push("cpda".into()); v }}; - } - if has_cctoken { - d = quote! {{ let mut v = #d; v.push("cctoken".into()); v }}; - } - d + let has_ctoken_in_docs = acc.docs.as_ref().map_or(false, |docs| { + docs.iter().any(|d| d.to_lowercase().contains("ctoken")) + }); + + has_compressible_marker || has_cpda || has_cctoken || has_ctoken_in_docs }; let (address, pda, relations) = if resolution { @@ -88,6 +87,7 @@ pub fn gen_idl_build_impl_accounts_struct(accounts: &AccountsStruct) -> TokenStr writable: #writable, signer: #signer, optional: #optional, + compressible: #compressible, address: #address, pda: #pda, relations: #relations, diff --git a/lang/syn/src/lib.rs b/lang/syn/src/lib.rs index deb69a47cb..493decb8d6 100644 --- a/lang/syn/src/lib.rs +++ b/lang/syn/src/lib.rs @@ -711,6 +711,8 @@ pub struct ConstraintGroup { pub cmint: Option, pub cpda: Option, pub cctoken: Option, + // Simple marker for IDL generation + pub compressible: Option, } impl ConstraintGroup { @@ -831,6 +833,8 @@ pub enum ConstraintToken { CPDACompressOnInit(Context), // CCToken constraint CCToken(Context), + // Simple marker constraint for IDL generation + Compressible(Context), } impl Parse for ConstraintToken { @@ -1259,6 +1263,9 @@ pub struct ConstraintCCToken { pub mint: Option, } +#[derive(Debug, Clone)] +pub struct ConstraintCompressible {} + #[derive(Debug, Clone)] pub struct ConstraintTokenBump { pub bump: Option, diff --git a/lang/syn/src/parser/accounts/constraints.rs b/lang/syn/src/parser/accounts/constraints.rs index 0abdf7e282..f705f9632e 100644 --- a/lang/syn/src/parser/accounts/constraints.rs +++ b/lang/syn/src/parser/accounts/constraints.rs @@ -59,6 +59,9 @@ pub fn parse_token(stream: ParseStream) -> ParseResult { "executable" => { ConstraintToken::Executable(Context::new(ident.span(), ConstraintExecutable {})) } + "compressible" => { + ConstraintToken::Compressible(Context::new(ident.span(), ConstraintCompressible {})) + } "mint" => { stream.parse::()?; stream.parse::()?; @@ -790,6 +793,8 @@ pub struct ConstraintGroupBuilder<'ty> { pub cpda_compress_on_init: Option>, // CCToken constraint pub cctoken: Option>, + // Simple marker constraint for IDL generation + pub compressible: Option>, } impl<'ty> ConstraintGroupBuilder<'ty> { @@ -860,6 +865,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { cpda_output_state_tree_index: None, cpda_compress_on_init: None, cctoken: None, + compressible: None, } } @@ -1308,6 +1314,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { cpda_output_state_tree_index, cpda_compress_on_init, cctoken, + ref compressible, } = self; // Converts Option> -> Option. @@ -1589,6 +1596,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { cctoken: cctoken.map(|c| ConstraintCCTokenGroup { mint: c.into_inner().mint, }), + compressible: compressible.as_ref().map(|c| c.clone().into_inner()), }) } @@ -1604,6 +1612,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { ConstraintToken::RentExempt(c) => self.add_rent_exempt(c), ConstraintToken::Seeds(c) => self.add_seeds(c), ConstraintToken::Executable(c) => self.add_executable(c), + ConstraintToken::Compressible(c) => self.add_compressible(c), ConstraintToken::Payer(c) => self.add_payer(c), ConstraintToken::Space(c) => self.add_space(c), ConstraintToken::Close(c) => self.add_close(c), @@ -2287,6 +2296,14 @@ impl<'ty> ConstraintGroupBuilder<'ty> { Ok(()) } + fn add_compressible(&mut self, c: Context) -> ParseResult<()> { + if self.compressible.is_some() { + return Err(ParseError::new(c.span(), "compressible already provided")); + } + self.compressible.replace(c); + Ok(()) + } + fn add_payer(&mut self, c: Context) -> ParseResult<()> { if self.init.is_none() { return Err(ParseError::new( diff --git a/ts/packages/anchor/src/program/namespace/methods.ts b/ts/packages/anchor/src/program/namespace/methods.ts index 0b23c4c3e1..f99ac3a2dd 100644 --- a/ts/packages/anchor/src/program/namespace/methods.ts +++ b/ts/packages/anchor/src/program/namespace/methods.ts @@ -60,50 +60,6 @@ import { } from "@lightprotocol/compressed-token"; featureFlags.version = VERSION.V2; -/** - * Infer account type and variant from IDL for compression. - * Returns { accountType, tokenVariant? } based STRICTLY on IDL definitions. - * NO FALLBACKS OR HEURISTICS - if not found in IDL, returns null. - */ -function inferAccountTypeFromIDL( - accountName: string, - idl: Idl | undefined, - idlTypes: IdlTypeDef[] -): { accountType: string; tokenVariant?: string } | null { - if (!idl) return null; - - // 1. Check if it's a named program account in idl.accounts - const accountDef = idl.accounts?.find((acc) => acc.name === accountName); - if (accountDef) { - return { accountType: accountName }; - } - - // 2. Check if it matches a compressed token variant enum - // Look for the enum type that defines token variants (e.g., cTokenAccountVariant) - const compressedVariantType = idlTypes.find( - (t) => - t.name.toLowerCase().includes("compressedaccountvariant") || - t.name.toLowerCase().includes("ctokenaccountvariant") || - t.name.toLowerCase().includes("tokenvariant") - ); - - if (compressedVariantType && compressedVariantType.type.kind === "enum") { - const variants = compressedVariantType.type.variants ?? []; - const matchedVariant = variants.find( - (v) => v.name.toLowerCase() === accountName.toLowerCase() - ); - - if (matchedVariant) { - return { - accountType: "cTokenData", - tokenVariant: matchedVariant.name, - }; - } - } - - // NOT FOUND IN IDL - return null (don't guess!) - return null; -} export type MethodsNamespace< IDL extends Idl = Idl, @@ -226,41 +182,6 @@ export function flattenPartialAccounts( return toReturn; } -// Scan the IDL for compressible accounts using explicit tags in account docs. -// - "cpda" tag indicates a compressible program-derived account -// - "cctoken" tag indicates a compressible token account (CompressedTokenProgram) -function scanCompressibleNames(idl: Idl | undefined): { - cpda: Set; - cctoken: Set; -} { - const cpda = new Set(); - const cctoken = new Set(); - if (!idl) return { cpda, cctoken }; - - const visitAccounts = (items: readonly IdlInstructionAccountItem[]) => { - for (const item of items) { - if ("accounts" in item) { - visitAccounts(item.accounts); - continue; - } - const acc = item as IdlInstructionAccount; - const docs = (acc.docs || []).map((d) => d.toLowerCase()); - if (docs.some((d) => d.includes("cctoken"))) { - cctoken.add(acc.name); - } - if (docs.some((d) => d.includes("cpda"))) { - cpda.add(acc.name); - } - } - }; - - for (const ix of idl.instructions) { - visitAccounts(ix.accounts); - } - - return { cpda, cctoken }; -} - // Helper to extract decompress instruction accounts type type DecompressAccounts = Extract< AllInstructions, @@ -294,6 +215,7 @@ export class MethodsBuilder< private _enableAutoDecompress: boolean = false; private _decompressAccounts?: AccountsGeneric; private _idl?: IDL; + private _idlIx: AllInstructions; private _idlTypes: IdlTypeDef[]; private _allInstructionFns?: Record>; private _programId: PublicKey; @@ -317,6 +239,7 @@ export class MethodsBuilder< ) { this._programId = programId; this._idl = idl; + this._idlIx = idlIx; this._idlTypes = idlTypes; this._allInstructionFns = allInstructionFns; this._accountNamespace = accountNamespace; @@ -519,106 +442,97 @@ export class MethodsBuilder< const accountInputs: AccountInput[] = []; - // Determine compressible names by tags once - const tags = scanCompressibleNames(this._idl); + // Check each provided account to see if it's actually compressed for (const { name, address } of accountsToCheck) { - // Only consider accounts explicitly tagged in IDL - const isCpda = tags.cpda.has(name); - const isCCToken = tags.cctoken.has(name); - if (!isCpda && !isCCToken) { - console.log( - `[decompressIfNeeded] Skipping account '${name}' (no 'cpda' or 'cctoken' tag)` + try { + // Try fetching as CPDA first + // @ts-ignore + const cpdaResult = await rpc.getAccountInfoInterface( + address, + programId, + //@ts-ignore + defaultAddressTreeInfo ); - continue; - } - - // Try fetching as CPDA - // @ts-ignore - const cpdaResult = await rpc.getAccountInfoInterface( - address, - programId, - //@ts-ignore - defaultAddressTreeInfo - ); - if (cpdaResult && cpdaResult.merkleContext && cpdaResult.isCompressed) { - // It's a compressed CPDA - if ( - isCCToken || - cpdaResult.accountInfo.owner.equals(CompressedTokenProgram.programId) - ) { - // It's a compressed token account - try { - const parsed = parseTokenData(cpdaResult.accountInfo.data); - if (parsed) { - accountInputs.push({ - address, - info: { - accountInfo: cpdaResult.accountInfo, - parsed, - merkleContext: cpdaResult.merkleContext, - }, - accountType: "cTokenData", - tokenVariant: name, - }); - } - } catch { - // Not a token account, ignore - } - } else { - // It's a compressed program account - let parsed = null; - const accountClient = (this._accountNamespace as any)[name]; - if (accountClient?.coder) { + if (cpdaResult && cpdaResult.merkleContext && cpdaResult.isCompressed) { + // It's a compressed account + if ( + cpdaResult.accountInfo.owner.equals( + CompressedTokenProgram.programId + ) + ) { + // It's a compressed token account try { - parsed = accountClient.coder.accounts.decode( - name, - cpdaResult.accountInfo.data - ); + const parsed = parseTokenData(cpdaResult.accountInfo.data); + if (parsed) { + accountInputs.push({ + address, + info: { + accountInfo: cpdaResult.accountInfo, + parsed, + merkleContext: cpdaResult.merkleContext, + }, + accountType: "cTokenData", + tokenVariant: name, + }); + } } catch { + // Not a token account, ignore + } + } else { + // It's a compressed program account + let parsed = null; + const accountClient = (this._accountNamespace as any)[name]; + if (accountClient?.coder) { try { - parsed = accountClient.coder.accounts.decodeAny( + parsed = accountClient.coder.accounts.decode( + name, cpdaResult.accountInfo.data ); } catch { - // Parsing failed, use null + try { + parsed = accountClient.coder.accounts.decodeAny( + cpdaResult.accountInfo.data + ); + } catch { + // Parsing failed, use null + } } } - } - - accountInputs.push({ - address, - info: { - accountInfo: cpdaResult.accountInfo, - parsed, - merkleContext: cpdaResult.merkleContext, - }, - accountType: name, // cpda accountType equals the IDL account name - }); - } - continue; - } - // Fallback: try as compressed token via getAccountInterface - if (isCCToken) { - try { - const tokenRes = await getAccountInterface( - rpc, - address, - undefined, - CompressedTokenProgram.programId - ); - if (tokenRes && (tokenRes as any).merkleContext) { accountInputs.push({ address, - info: tokenRes as any, - accountType: "cTokenData", - tokenVariant: name, + info: { + accountInfo: cpdaResult.accountInfo, + parsed, + merkleContext: cpdaResult.merkleContext, + }, + accountType: name, // cpda accountType equals the IDL account name }); } - } catch { - // Not a compressed token + } else { + // Try as compressed token via getAccountInterface as fallback + try { + const tokenRes = await getAccountInterface( + rpc, + address, + undefined, + CompressedTokenProgram.programId + ); + if (tokenRes && (tokenRes as any).merkleContext) { + accountInputs.push({ + address, + info: tokenRes as any, + accountType: "cTokenData", + tokenVariant: name, + }); + } + } catch { + // Not a compressed account + } } + } catch { + // Account doesn't exist or can't be fetched, skip } } @@ -658,6 +572,130 @@ export class MethodsBuilder< return null; } + /** + * Extract required seed accounts based on what's actually being decompressed + */ + private _extractRequiredSeeds(accountInputs: AccountInput[]): Set { + const requiredSeeds = new Set(); + + // Helper to extract seed account names from IDL PDA definition + const extractSeedsFromIdl = (accountName: string): string[] => { + if (!this._idl) return []; + + const findAccount = (accounts: readonly any[], name: string): any => { + for (const acc of accounts) { + if ("accounts" in acc) { + const found = findAccount(acc.accounts, name); + if (found) return found; + } else if (acc.name === accountName) { + return acc; + } + } + return null; + }; + + // Search all instructions for PDA definition + for (const ix of this._idl.instructions) { + const accountDef = findAccount(ix.accounts, accountName); + if (accountDef && accountDef.pda && accountDef.pda.seeds) { + const seeds: string[] = []; + for (const seed of accountDef.pda.seeds) { + if (seed.kind === "account" && seed.path) { + const baseName = seed.path.split(".")[0].split("(")[0]; + seeds.push(baseName); + } + } + return seeds; + } + } + return []; + }; + + // Analyze each account being decompressed + for (const input of accountInputs) { + const accountName = input.tokenVariant || (input.accountType as string); + + // Extract seeds from IDL for this account + const seeds = extractSeedsFromIdl(accountName); + for (const seed of seeds) { + requiredSeeds.add(seed); + console.log( + `[decompressIfNeeded] Account '${accountName}' requires seed: '${seed}' (from IDL)` + ); + } + } + + return requiredSeeds; + } + + /** + * Get compressible account names from main instruction's IDL definition + */ + private _getMainInstructionCompressibleAccounts(): Set { + const compressible = new Set(); + if (!this._idl) return compressible; + + // Find the main instruction in IDL + const mainIx = this._idl.instructions.find( + (ix: any) => ix.name === (this._idlIx as any).name + ); + if (!mainIx) return compressible; + + // Recursively scan all accounts + const visitAccounts = (items: readonly any[]) => { + for (const item of items) { + if ("accounts" in item) { + visitAccounts(item.accounts); + continue; + } + // Check the compressible field + if (item.compressible === true) { + compressible.add(item.name); + } + } + }; + + visitAccounts(mainIx.accounts); + return compressible; + } + + /** + * Auto-pull accounts from main instruction for matching names + */ + private _autoPullFromMainInstruction(): void { + if (!this._decompressAccounts) return; + + const programId = this._programId; + + // Helper to check if an account is missing or set to program ID (placeholder) + const isAccountMissing = (name: string): boolean => { + if (!this._decompressAccounts || !(name in this._decompressAccounts)) + return true; + try { + const pubkey = translateAddress( + this._decompressAccounts![name] as Address + ); + return pubkey.equals(programId); + } catch { + return true; + } + }; + + // Try to pull each missing account from main instruction + for (const accountName in this._decompressAccounts) { + if (isAccountMissing(accountName)) { + const fromMain = this._getFromMainInstruction(accountName); + if (fromMain) { + console.log( + `[decompressIfNeeded] Auto-pulling '${accountName}' from main instruction:`, + fromMain.toBase58() + ); + this._decompressAccounts[accountName] = fromMain; + } + } + } + } + /** * Auto-resolve constant and default accounts for decompressAccountsIdempotent. * Priority: 1) User explicit values in decompressIfNeeded, 2) Main instruction accounts, 3) Auto-resolved defaults @@ -814,30 +852,26 @@ export class MethodsBuilder< "ctokenCompressionAuthority", ]); - // Collect potentially compressible accounts in deterministic order - // Order: CPDA accounts first (poolState, observationState), then ctoken accounts (vaults) - // This is CRITICAL: buildDecompressParams is order-sensitive + // Collect potentially compressible accounts + // Only check accounts that were explicitly provided (not set to programId placeholder) const accountsToCheck: Array<{ name: string; address: PublicKey }> = []; - // Determine compressible names by tags - const tags = scanCompressibleNames(this._idl); - - // Separate CPDA and ctoken accounts for proper ordering - const cpdaAccounts: Array<{ name: string; address: PublicKey }> = []; - const ctokenAccounts: Array<{ name: string; address: PublicKey }> = []; - for (const [name, addr] of Object.entries(this._decompressAccounts)) { if (SKIP_ACCOUNTS.has(name)) continue; try { const pubkey = translateAddress(addr as Address); - // Sort by type: CPDAs first, then ctokens - if (tags.cpda.has(name)) { - cpdaAccounts.push({ name, address: pubkey }); - } else if (tags.cctoken.has(name)) { - ctokenAccounts.push({ name, address: pubkey }); + // Skip accounts set to programId - these are explicitly marked as "None/not needed" + if (pubkey.equals(this._programId)) { + console.log( + `[decompressIfNeeded] Skipping account '${name}' (set to programId = None)` + ); + continue; } + + // All provided non-system, non-placeholder accounts should be checked + accountsToCheck.push({ name, address: pubkey }); } catch { console.warn( `[decompressIfNeeded] Invalid address for ${name}, skipping` @@ -845,8 +879,30 @@ export class MethodsBuilder< } } - // Concatenate: CPDAs first, then ctokens (matches SDK/reference ordering) - accountsToCheck.push(...cpdaAccounts, ...ctokenAccounts); + // Validate: All compressible accounts used by main instruction must be provided + const mainIxCompressible = this._getMainInstructionCompressibleAccounts(); + const providedCompressible = new Set(accountsToCheck.map((a) => a.name)); + const missing: string[] = []; + + for (const accountName of Array.from(mainIxCompressible)) { + const inMain = this._getFromMainInstruction(accountName); + if (inMain && !providedCompressible.has(accountName)) { + // Main instruction uses this compressible account, but not checked for decompression + missing.push(accountName); + } + } + + if (missing.length > 0) { + throw new Error( + `[decompressIfNeeded] Missing compressible accounts used by main instruction: ${missing.join( + ", " + )}.\n` + + `These accounts are marked as compressible in the IDL and must be provided to decompressIfNeeded().\n` + + `Add them: .decompressIfNeeded({ ..., ${missing + .map((n) => `${n}:
`) + .join(", ")} })` + ); + } // Fetch compression state for all accounts const accountInputs = await this._fetchCompressibleAccounts( @@ -913,98 +969,21 @@ export class MethodsBuilder< // Auto-resolve constant and default accounts before validation this._autoResolveDecompressAccounts(); - // Determine which seed accounts are required by the compressible accounts being decompressed - // Extract seed dependencies from IDL's pda.seeds field - const requiredSeeds = new Set(); - - // Helper to extract seed account names from IDL account definition - // Searches all instructions to find where the account is defined as a PDA - const extractSeedAccountsFromIdl = (accountName: string): string[] => { - if (!this._idl) return []; - - // Helper to find account in nested structure - const findAccount = (accounts: readonly any[], name: string): any => { - for (const acc of accounts) { - if ("accounts" in acc) { - const found = findAccount(acc.accounts, name); - if (found) return found; - } else if (acc.name === name) { - return acc; - } - } - return null; - }; - - // Search all instructions for this account's PDA definition - // TypeScript IDL is already in camelCase, use account names as-is - for (const ix of this._idl.instructions) { - const accountDef = findAccount(ix.accounts, accountName); - if (accountDef && accountDef.pda && accountDef.pda.seeds) { - // Found PDA definition - extract seed account names - const seedAccounts: string[] = []; - for (const seed of accountDef.pda.seeds) { - if (seed.kind === "account" && seed.path) { - // Path is already in camelCase in TS IDL (e.g., "ammConfig", "token0Mint") - // Just extract the base account name before any dots or parens - const baseName = seed.path.split(".")[0].split("(")[0]; - seedAccounts.push(baseName); - } - } - return seedAccounts; - } - } - - return []; - }; - - for (const input of accountInputs) { - if (input.tokenVariant) { - // For CToken accounts, determine the required mint seed - // token0Vault → token0Mint, token1Vault → token1Mint, lpVault → lpMint - const variant = input.tokenVariant as string; - const mintSeed = variant.replace("Vault", "Mint"); - requiredSeeds.add(mintSeed); - console.log( - `[decompressIfNeeded] Account '${variant}' is being decompressed, requires seed: '${mintSeed}'` - ); - } else { - // For CPDA accounts, extract seed dependencies from IDL - const accountType = input.accountType as string; - const seedAccounts = extractSeedAccountsFromIdl(accountType); - - for (const seed of seedAccounts) { - requiredSeeds.add(seed); - console.log( - `[decompressIfNeeded] Account '${accountType}' is being decompressed, requires seed: '${seed}' (from IDL)` - ); - } - } - } - - // Auto-pull required seeds from main instruction if not explicitly provided - const missingRequiredSeeds: string[] = []; - for (const seedName of requiredSeeds) { - let isMissing = false; - - // Check if seed is in decompressAccounts - if (!(seedName in this._decompressAccounts)) { - isMissing = true; - } else { - try { - const seedPubkey = translateAddress( - this._decompressAccounts[seedName] as Address - ); - if (seedPubkey.equals(programId)) { - // Seed is set to program ID (placeholder, not provided) - isMissing = true; - } - } catch { - isMissing = true; - } - } + // Determine which seed accounts are required based on what's being decompressed + const requiredSeeds = this._extractRequiredSeeds(accountInputs); + console.log( + `[decompressIfNeeded] Required seeds for decompression:`, + Array.from(requiredSeeds) + ); - // If missing, try to get from main instruction - if (isMissing) { + // Auto-pull required seeds from main instruction + for (const seedName of Array.from(requiredSeeds)) { + if ( + !(seedName in this._decompressAccounts) || + translateAddress(this._decompressAccounts[seedName] as Address).equals( + programId + ) + ) { const fromMain = this._getFromMainInstruction(seedName); if (fromMain) { console.log( @@ -1013,30 +992,17 @@ export class MethodsBuilder< ); this._decompressAccounts[seedName] = fromMain; } else { - missingRequiredSeeds.push(seedName); + throw new Error( + `[decompressIfNeeded] Required seed account '${seedName}' is missing. ` + + `It's needed for decompressing but not found in main instruction. ` + + `Please provide it explicitly in decompressIfNeeded() call.` + ); } } } - if (missingRequiredSeeds.length > 0) { - const compressibleNames = accountInputs - .map((ai) => ai.tokenVariant || ai.accountType) - .join(", "); - throw new Error( - `[decompressIfNeeded] Cannot decompress accounts [${compressibleNames}] because required seed accounts are missing: ${missingRequiredSeeds.join( - ", " - )}.\n\n` + - `These seed accounts must be provided when decompressing their associated compressible accounts. ` + - `Please include them in either:\n` + - ` 1. The main instruction's .accounts() or .accountsStrict() call, OR\n` + - ` 2. The .decompressIfNeeded() call\n\n` + - `The framework will automatically pull seeds from the main instruction if available.` - ); - } - // Fill in any missing accounts with program ID (represents "None" for optional accounts) - // This ensures all accounts from the IDL are present, even if not used - // BUT we only auto-fill accounts that are NOT required by compressible accounts being decompressed + // Only fill accounts that are NOT required seeds const completeAccounts = { ...this._decompressAccounts }; const decompressIxAccounts = decompressInstruction.accounts || []; @@ -1044,9 +1010,8 @@ export class MethodsBuilder< const accountName = typeof acc === "string" ? acc : acc.name; if (!(accountName in completeAccounts)) { if (requiredSeeds.has(accountName)) { - // This should have been caught above, but double-check throw new Error( - `[decompressIfNeeded] Required seed account '${accountName}' is missing but needed for decompression.` + `[decompressIfNeeded] Required seed account '${accountName}' is missing.` ); } console.log( @@ -1096,13 +1061,17 @@ export class MethodsBuilder< * @returns the transaction instruction */ public async instruction(): Promise { + if (this._enableAutoDecompress) { + throw new Error( + "decompressIfNeeded() cannot be used with .instruction(). " + + "Use .transaction() or .rpc() instead, which handle multiple instructions." + ); + } + if (this._resolveAccounts) { await this._accountsResolver.resolve(); } - // Inject decompress if configured - await this._injectDecompressIfNeeded(); - // @ts-ignore return this._ixFn(...this._args, { accounts: this._accounts, From 3485280fad8aae4606594515ad859adfdae4f474 Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Sun, 19 Oct 2025 09:55:53 -0400 Subject: [PATCH 15/20] decompressIfNeeeded() --- Cargo.lock | 3637 +++++++---------- .../anchor/src/program/namespace/methods.ts | 1468 +++++-- 2 files changed, 2618 insertions(+), 2487 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9a9c4cf445..a51df410be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,19 +13,10 @@ dependencies = [ ] [[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aead" @@ -65,26 +56,26 @@ dependencies = [ [[package]] name = "agave-feature-set" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98b7122392ed81e9b4569c3c960a557afb9f735719e0bcc9b2c19d0345568f5f" +checksum = "d52a2c365c0245cbb8959de725fc2b44c754b673fdf34c9a7f9d4a25c35a7bf1" dependencies = [ "ahash", - "solana-epoch-schedule 2.2.1", - "solana-hash 2.3.0", - "solana-pubkey 2.4.0", - "solana-sha256-hasher 2.3.0", + "solana-epoch-schedule", + "solana-hash", + "solana-pubkey", + "solana-sha256-hasher", "solana-svm-feature-set", ] [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.2.10", + "getrandom 0.3.4", "once_cell", "version_check", "zerocopy", @@ -92,9 +83,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.1" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -190,7 +181,7 @@ dependencies = [ "bincode", "cargo_toml", "chrono", - "clap 4.5.17", + "clap 4.5.49", "clap_complete", "dirs", "flate2", @@ -226,7 +217,7 @@ dependencies = [ "solana-account-decoder", "solana-client", "solana-sdk", - "thiserror 1.0.66", + "thiserror 1.0.69", "tokio", "url", ] @@ -276,10 +267,10 @@ dependencies = [ "anchor-lang-idl", "base64 0.21.7", "bincode", - "borsh 0.10.3", + "borsh 0.10.4", "bytemuck", - "solana-program 2.3.0", - "thiserror 1.0.66", + "solana-program", + "thiserror 1.0.69", ] [[package]] @@ -292,7 +283,7 @@ dependencies = [ "regex", "serde", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -308,7 +299,7 @@ name = "anchor-spl" version = "0.31.1" dependencies = [ "anchor-lang", - "borsh 0.10.3", + "borsh 0.10.4", "mpl-token-metadata", "spl-associated-token-account", "spl-memo", @@ -331,10 +322,10 @@ dependencies = [ "quote", "serde", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", "spl-pod", "syn 1.0.109", - "thiserror 1.0.66", + "thiserror 1.0.69", ] [[package]] @@ -357,9 +348,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -372,36 +363,37 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" -version = "0.2.2" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.1" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", - "windows-sys 0.48.0", + "once_cell_polyfill", + "windows-sys 0.60.2", ] [[package]] @@ -535,9 +527,9 @@ checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "ascii-canvas" @@ -560,7 +552,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror 1.0.66", + "thiserror 1.0.69", "time", ] @@ -600,25 +592,24 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.3" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb42b2197bf15ccb092b62c74515dbd8b86d0effd934795f6687c93b6e679a2c" +checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" dependencies = [ - "brotli", - "flate2", + "compression-codecs", + "compression-core", "futures-core", - "memchr", "pin-project-lite", "tokio", ] [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ - "event-listener 5.3.1", + "event-listener 5.4.1", "event-listener-strategy", "pin-project-lite", ] @@ -631,7 +622,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -653,9 +644,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "avm" @@ -665,7 +656,7 @@ dependencies = [ "cargo_toml", "cfg-if", "chrono", - "clap 4.5.17", + "clap 4.5.49", "clap_complete", "dirs", "reqwest 0.11.27", @@ -674,27 +665,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "backtrace" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - [[package]] name = "base64" version = "0.12.3" @@ -719,12 +689,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "base64ct" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" - [[package]] name = "bincode" version = "1.3.3" @@ -798,11 +762,11 @@ dependencies = [ [[package]] name = "borsh" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee" dependencies = [ - "borsh-derive 0.10.3", + "borsh-derive 0.10.4", "hashbrown 0.13.2", ] @@ -818,9 +782,9 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" dependencies = [ "borsh-derive-internal", "borsh-schema-derive-internal", @@ -836,17 +800,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" dependencies = [ "once_cell", - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] name = "borsh-derive-internal" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3" dependencies = [ "proc-macro2", "quote", @@ -855,9 +819,9 @@ dependencies = [ [[package]] name = "borsh-schema-derive-internal" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" dependencies = [ "proc-macro2", "quote", @@ -866,9 +830,9 @@ dependencies = [ [[package]] name = "brotli" -version = "3.4.0" +version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -877,9 +841,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.5.0" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da74e2b81409b1b743f8f0c62cc6254afefb8b8e50bbfe3735550f7aeefa3448" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -896,9 +860,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bv" @@ -912,22 +876,22 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.23.2" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.10.1" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -947,12 +911,11 @@ dependencies = [ [[package]] name = "caps" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" +checksum = "fd1ddba47aba30b6a889298ad0109c3b8dcb0e8fc993b459daa7067d46f865e0" dependencies = [ "libc", - "thiserror 1.0.66", ] [[package]] @@ -962,15 +925,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a98356df42a2eb1bd8f1793ae4ee4de48e384dd974ce5eac8eee802edb7492be" dependencies = [ "serde", - "toml 0.8.2", + "toml 0.8.23", ] [[package]] name = "cc" -version = "1.1.31" +version = "1.2.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -984,9 +948,9 @@ checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -1002,7 +966,7 @@ checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -1039,15 +1003,15 @@ dependencies = [ "bitflags 1.3.2", "strsim 0.8.0", "textwrap", - "unicode-width 0.1.11", + "unicode-width 0.1.14", "vec_map", ] [[package]] name = "clap" -version = "4.5.17" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" +checksum = "f4512b90fa68d3a9932cea5184017c5d200f5921df706d45e853537dea51508f" dependencies = [ "clap_builder", "clap_derive", @@ -1055,9 +1019,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.17" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" +checksum = "0025e98baa12e766c67ba13ff4695a887a1eba19569aad00a472546795bd6730" dependencies = [ "anstream", "anstyle", @@ -1067,36 +1031,36 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.26" +version = "4.5.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "205d5ef6d485fa47606b98b0ddc4ead26eb850aaa86abfb562a94fb3280ecba0" +checksum = "2348487adcd4631696ced64ccdb40d38ac4d31cae7f2eec8817fcea1b9d1c43c" dependencies = [ - "clap 4.5.17", + "clap 4.5.49", ] [[package]] name = "clap_derive" -version = "4.5.13" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "combine" @@ -1108,6 +1072,24 @@ dependencies = [ "memchr", ] +[[package]] +name = "compression-codecs" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" +dependencies = [ + "brotli", + "compression-core", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -1126,7 +1108,7 @@ dependencies = [ "encode_unicode", "libc", "once_cell", - "unicode-width 0.2.1", + "unicode-width 0.2.2", "windows-sys 0.59.0", ] @@ -1150,12 +1132,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - [[package]] name = "constant_time_eq" version = "0.3.1" @@ -1164,9 +1140,9 @@ checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -1190,18 +1166,18 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -1217,51 +1193,34 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" @@ -1332,7 +1291,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -1356,7 +1315,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -1367,7 +1326,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -1377,7 +1336,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.1", + "hashbrown 0.14.5", "lock_api", "once_cell", "parking_lot_core", @@ -1385,19 +1344,9 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.4.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "zeroize", -] +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "der-parser" @@ -1415,9 +1364,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", ] @@ -1451,12 +1400,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "diff" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" - [[package]] name = "digest" version = "0.9.0" @@ -1473,7 +1416,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", - "const-oid", "crypto-common", "subtle", ] @@ -1521,13 +1463,13 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -1550,21 +1492,7 @@ checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", -] - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature 2.2.0", - "spki", + "syn 2.0.107", ] [[package]] @@ -1573,7 +1501,7 @@ version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" dependencies = [ - "signature 1.6.4", + "signature", ] [[package]] @@ -1599,39 +1527,20 @@ dependencies = [ "derivation-path", "ed25519-dalek", "hmac 0.12.1", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] name = "either" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "ena" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" dependencies = [ "log", ] @@ -1644,9 +1553,9 @@ checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -1666,29 +1575,18 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add4f07d43996f76ef320709726a556a9d4f965d9410d8d0271132d2f8293480" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ - "cc", "libc", + "windows-sys 0.61.2", ] [[package]] @@ -1699,9 +1597,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "5.3.1" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -1710,11 +1608,11 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 5.3.1", + "event-listener 5.4.1", "pin-project-lite", ] @@ -1724,7 +1622,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18c1ddb9231d8554c2d6bdf4cfaabf0c59251658c68b6c95cd52dd0c513a912a" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "libm", "rand 0.9.2", "siphasher 1.0.1", @@ -1732,9 +1630,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "feature-probe" @@ -1742,16 +1640,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "fiat-crypto" version = "0.2.9" @@ -1760,16 +1648,22 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "filetime" -version = "0.2.22" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", - "windows-sys 0.48.0", + "libredox", + "windows-sys 0.60.2", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + [[package]] name = "five8" version = "0.2.1" @@ -1790,9 +1684,9 @@ dependencies = [ [[package]] name = "five8_core" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94474d15a76982be62ca8a39570dccce148d98c238ebb7408b0a21b2c4bdddc4" +checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" [[package]] name = "fixedbitset" @@ -1802,9 +1696,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.27" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" +checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" dependencies = [ "crc32fast", "miniz_oxide", @@ -1896,7 +1790,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -1937,13 +1831,12 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.7" +version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", - "zeroize", ] [[package]] @@ -1971,37 +1864,31 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasi 0.14.7+wasi-0.2.4", + "wasip2", "wasm-bindgen", ] -[[package]] -name = "gimli" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" - [[package]] name = "governor" version = "0.6.3" @@ -2022,22 +1909,11 @@ dependencies = [ "spinning_top", ] -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "h2" -version = "0.3.21" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", @@ -2045,19 +1921,13 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 1.9.3", + "indexmap", "slab", "tokio", "tokio-util", "tracing", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hashbrown" version = "0.13.2" @@ -2069,15 +1939,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.1" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "heck" @@ -2109,12 +1979,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hermit-abi" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" - [[package]] name = "hermit-abi" version = "0.5.2" @@ -2194,9 +2058,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http 0.2.12", @@ -2240,15 +2104,15 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -2256,12 +2120,12 @@ dependencies = [ "futures-util", "h2", "http 0.2.12", - "http-body 0.4.5", + "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.9", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -2291,13 +2155,13 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.27", + "hyper 0.14.32", "rustls 0.21.12", "tokio", "tokio-rustls 0.24.1", @@ -2312,12 +2176,12 @@ dependencies = [ "http 1.3.1", "hyper 1.7.0", "hyper-util", - "rustls 0.23.32", + "rustls 0.23.33", "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", "tower-service", - "webpki-roots 1.0.2", + "webpki-roots 1.0.3", ] [[package]] @@ -2338,7 +2202,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.0", + "socket2 0.6.1", "tokio", "tower-service", "tracing", @@ -2346,16 +2210,17 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows", + "windows-core", ] [[package]] @@ -2482,22 +2347,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.11.4" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.16.0", ] [[package]] @@ -2509,30 +2364,19 @@ dependencies = [ "console", "number_prefix", "portable-atomic", - "unicode-width 0.2.1", + "unicode-width 0.2.2", "web-time", ] [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "generic-array", ] -[[package]] -name = "io-uring" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" -dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "libc", -] - [[package]] name = "ipnet" version = "2.11.0" @@ -2549,17 +2393,6 @@ dependencies = [ "serde", ] -[[package]] -name = "is-terminal" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi 0.3.3", - "rustix", - "windows-sys 0.48.0", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -2595,9 +2428,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jni" @@ -2610,7 +2443,7 @@ dependencies = [ "combine", "jni-sys", "log", - "thiserror 1.0.66", + "thiserror 1.0.69", "walkdir", "windows-sys 0.45.0", ] @@ -2623,10 +2456,11 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ + "getrandom 0.3.4", "libc", ] @@ -2655,51 +2489,35 @@ dependencies = [ "serde_json", ] -[[package]] -name = "k256" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2 0.10.8", - "signature 2.2.0", -] - [[package]] name = "kaigan" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ba15de5aeb137f0f65aa3bf82187647f1285abfe5b20c80c2c37f7007ad519a" dependencies = [ - "borsh 0.10.3", + "borsh 0.10.4", "serde", ] [[package]] name = "keccak" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ "cpufeatures", ] [[package]] name = "lalrpop" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da4081d44f4611b66c6dd725e6de3169f9f63905421e8626fcb86b6a898998b8" +checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" dependencies = [ "ascii-canvas", "bit-set", - "diff", "ena", - "is-terminal", - "itertools 0.10.5", + "itertools 0.11.0", "lalrpop-util", "petgraph", "regex", @@ -2708,13 +2526,17 @@ dependencies = [ "term", "tiny-keccak", "unicode-xid", + "walkdir", ] [[package]] name = "lalrpop-util" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f35c735096c0293d313e8f2a641627472b83d01b937177fe76e5e2708d31e0d" +checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" +dependencies = [ + "regex-automata", +] [[package]] name = "lazy_static" @@ -2724,9 +2546,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.176" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libm" @@ -2734,6 +2556,17 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags 2.9.4", + "libc", + "redox_syscall", +] + [[package]] name = "libsecp256k1" version = "0.6.0" @@ -2784,9 +2617,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.8" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3852614a3bd9ca9804678ba6be5e3b8ce76dfc902cae004e3e0c44051b6e88db" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" @@ -2796,11 +2629,10 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] @@ -2818,9 +2650,9 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memmap2" @@ -2833,9 +2665,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] @@ -2860,9 +2692,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" -version = "2.0.4" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" dependencies = [ "mime", "unicase", @@ -2876,42 +2708,43 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ - "adler", + "adler2", + "simd-adler32", ] [[package]] name = "mio" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", ] [[package]] name = "mpl-token-metadata" -version = "5.1.0" +version = "5.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6a3000e761d3b2d685662a3a9ee99826f9369fb033bd1bc7011b1cf02ed9" +checksum = "046f0779684ec348e2759661361c8798d79021707b1392cb49f3b5eb911340ff" dependencies = [ - "borsh 0.10.3", + "borsh 0.10.4", "num-derive 0.3.3", "num-traits", - "solana-program 3.0.0", - "thiserror 1.0.66", + "solana-program", + "thiserror 1.0.69", ] [[package]] name = "new_debug_unreachable" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nix" @@ -3012,13 +2845,13 @@ dependencies = [ [[package]] name = "num-derive" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e6a0fd4f737c707bd9086cc16c925f294943eb62eb71499e9fd4cf71f8b9f4e" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -3032,9 +2865,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -3074,23 +2907,24 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" dependencies = [ "num_enum_derive", + "rustversion", ] [[package]] name = "num_enum_derive" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" dependencies = [ - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -3099,15 +2933,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" -[[package]] -name = "object" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" -dependencies = [ - "memchr", -] - [[package]] name = "oid-registry" version = "0.6.1" @@ -3119,21 +2944,27 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" [[package]] name = "opaque-debug" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.73" +version = "0.10.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" dependencies = [ "bitflags 2.9.4", "cfg-if", @@ -3152,20 +2983,20 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.109" +version = "0.9.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" dependencies = [ "cc", "libc", @@ -3181,9 +3012,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -3191,28 +3022,28 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall", "smallvec", - "windows-targets 0.48.5", + "windows-link", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "pbkdf2" @@ -3258,70 +3089,61 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.11.4", + "indexmap", ] [[package]] name = "phf" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ "phf_macros", - "phf_shared 0.11.2", + "phf_shared", ] [[package]] name = "phf_generator" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared 0.11.2", + "phf_shared", "rand 0.8.5", ] [[package]] name = "phf_macros" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ "phf_generator", - "phf_shared 0.11.2", + "phf_shared", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] name = "phf_shared" -version = "0.10.0" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ - "siphasher 0.3.11", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher 0.3.11", + "siphasher 1.0.1", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -3329,21 +3151,11 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "polyval" @@ -3359,9 +3171,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.9.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "portpicker" @@ -3389,9 +3201,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] name = "precomputed-hash" @@ -3410,18 +3225,18 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.1.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.21.0", + "toml_edit 0.23.7", ] [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -3437,15 +3252,15 @@ dependencies = [ [[package]] name = "quanta" -version = "0.12.3" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" +checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7" dependencies = [ "crossbeam-utils", "libc", "once_cell", "raw-cpuid", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "web-sys", "winapi", ] @@ -3461,10 +3276,10 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.0.0", - "rustls 0.23.32", - "socket2 0.6.0", - "thiserror 2.0.16", + "rustc-hash 2.1.1", + "rustls 0.23.33", + "socket2 0.6.1", + "thiserror 2.0.17", "tokio", "tracing", "web-time", @@ -3478,16 +3293,16 @@ checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", "fastbloom", - "getrandom 0.3.3", + "getrandom 0.3.4", "lru-slab", "rand 0.9.2", - "ring 0.17.8", - "rustc-hash 2.0.0", - "rustls 0.23.32", + "ring", + "rustc-hash 2.1.1", + "rustls 0.23.33", "rustls-pki-types", "rustls-platform-verifier", "slab", - "thiserror 2.0.16", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -3495,23 +3310,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.6" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e346e016eacfff12233c243718197ca12f148c84e1e84268a896699b41c71780" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2 0.6.1", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -3601,7 +3416,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.16", ] [[package]] @@ -3610,7 +3425,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", ] [[package]] @@ -3624,18 +3439,18 @@ dependencies = [ [[package]] name = "raw-cpuid" -version = "11.2.0" +version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab240315c661615f2ee9f0f2cd32d5a7343a84d5ebcccb99d46e6637565e7b0" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ "bitflags 2.9.4", ] [[package]] name = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -3643,9 +3458,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -3653,38 +3468,29 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.9.4", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.10", - "redox_syscall 0.2.16", - "thiserror 1.0.66", + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", ] [[package]] name = "regex" -version = "1.9.6" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebee201405406dbf528b8b672104ae6d6d63e6d118cb10e4d51abbc7b58044ff" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -3694,9 +3500,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.9" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -3705,9 +3511,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" @@ -3722,9 +3528,9 @@ dependencies = [ "futures-util", "h2", "http 0.2.12", - "http-body 0.4.5", - "hyper 0.14.27", - "hyper-rustls 0.24.1", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-rustls 0.24.2", "ipnet", "js-sys", "log", @@ -3747,15 +3553,15 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 0.25.2", + "webpki-roots 0.25.4", "winreg", ] [[package]] name = "reqwest" -version = "0.12.23" +version = "0.12.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" dependencies = [ "async-compression", "base64 0.22.1", @@ -3774,7 +3580,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.32", + "rustls 0.23.33", "rustls-pki-types", "serde", "serde_json", @@ -3790,7 +3596,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.2", + "webpki-roots 1.0.3", ] [[package]] @@ -3802,49 +3608,23 @@ dependencies = [ "anyhow", "async-trait", "http 1.3.1", - "reqwest 0.12.23", + "reqwest 0.12.24", "serde", - "thiserror 1.0.66", + "thiserror 1.0.69", "tower-service", ] -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac 0.12.1", - "subtle", -] - [[package]] name = "ring" -version = "0.16.20" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.10", + "getrandom 0.2.16", "libc", - "spin 0.9.8", - "untrusted 0.9.0", + "untrusted", "windows-sys 0.52.0", ] @@ -3861,20 +3641,14 @@ dependencies = [ [[package]] name = "rtoolbox" -version = "0.0.1" +version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034e22c514f5c0cb8a10ff341b9b048b5ceb21591f31c8f44c43b960f9b3524a" +checksum = "a7cc970b249fbe527d6e02e0a227762c9108b2f49d81094fe357ffc6d14d7f6f" dependencies = [ "libc", - "winapi", + "windows-sys 0.52.0", ] -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - [[package]] name = "rustc-hash" version = "1.1.0" @@ -3883,15 +3657,15 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] @@ -3907,15 +3681,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.15" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f9da0cbd88f9f09e7814e388301c8414c51c62aa6ce1e4b5c551d49d96e531" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ "bitflags 2.9.4", "errno", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -3925,30 +3699,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", - "ring 0.17.8", + "ring", "rustls-webpki 0.101.7", "sct", ] [[package]] name = "rustls" -version = "0.23.32" +version = "0.23.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +checksum = "751e04a496ca00bb97a5e043158d23d66b5aabf2e1d5aa2a0aaebb1aafe6f82c" dependencies = [ "once_cell", - "ring 0.17.8", + "ring", "rustls-pki-types", - "rustls-webpki 0.103.6", + "rustls-webpki 0.103.7", "subtle", "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -3958,9 +3732,9 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ "base64 0.21.7", ] @@ -3986,14 +3760,14 @@ dependencies = [ "jni", "log", "once_cell", - "rustls 0.23.32", + "rustls 0.23.33", "rustls-native-certs", "rustls-platform-verifier-android", - "rustls-webpki 0.103.6", + "rustls-webpki 0.103.7", "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4008,32 +3782,32 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.8", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] name = "rustls-webpki" -version = "0.103.6" +version = "0.103.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" dependencies = [ - "ring 0.17.8", + "ring", "rustls-pki-types", - "untrusted 0.9.0", + "untrusted", ] [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -4046,11 +3820,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -4061,33 +3835,19 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - -[[package]] -name = "sec1" -version = "0.7.3" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", + "ring", + "untrusted", ] [[package]] name = "security-framework" -version = "3.5.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc198e42d9b7510827939c9a15f5062a0c913f3371d765977e586d2fe6c16f4a" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ "bitflags 2.9.4", "core-foundation 0.10.1", @@ -4114,9 +3874,9 @@ checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.227" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80ece43fc6fbed4eb5392ab50c07334d3e577cbf40997ee896fe7af40bba4245" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", @@ -4133,31 +3893,32 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.15" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde_core" -version = "1.0.227" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a576275b607a2c86ea29e410193df32bc680303c82f31e275bbfcafe8b33be5" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.227" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e694923b8824cf0e9b382adf0f60d4e05f348f357b38833a3fa5ed7c2ede04" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -4175,9 +3936,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] @@ -4196,25 +3957,24 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.14.1" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c522100790450cf78eeac1507263d0a350d4d5b30df0c8e1fe051a10c22b376e" +checksum = "6093cd8c01b25262b84927e0f7151692158fab02d961e04c979d3903eba7ecc5" dependencies = [ - "serde", - "serde_derive", + "serde_core", "serde_with_macros", ] [[package]] name = "serde_with_macros" -version = "3.14.1" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327ada00f7d64abaac1e55a6911e90cf665aa051b9a561c7006c157f4633135e" +checksum = "a7e6c180db0816026a61afa1cff5344fb7ebded7e4d3062772179f2501481c27" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -4223,7 +3983,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.11.4", + "indexmap", "itoa", "ryu", "serde", @@ -4256,9 +4016,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -4308,9 +4068,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -4322,14 +4082,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" [[package]] -name = "signature" -version = "2.2.0" +name = "simd-adler32" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "siphasher" @@ -4345,12 +4101,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" @@ -4358,16 +4111,6 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "socket2" version = "0.5.10" @@ -4380,12 +4123,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -4398,19 +4141,19 @@ dependencies = [ "serde", "serde_bytes", "serde_derive", - "solana-account-info 2.3.0", - "solana-clock 2.2.2", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", - "solana-sysvar 2.3.0", + "solana-account-info", + "solana-clock", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", + "solana-sysvar", ] [[package]] name = "solana-account-decoder" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "902c42492c67e2cb78e839b1af063ed672b3d1ff22311ce07aa073804ca40e53" +checksum = "ba71c97fa4d85ce4a1e0e79044ad0406c419382be598c800202903a7688ce71a" dependencies = [ "Inflector", "base64 0.22.1", @@ -4422,38 +4165,38 @@ dependencies = [ "serde_json", "solana-account", "solana-account-decoder-client-types", - "solana-address-lookup-table-interface 2.2.2", - "solana-clock 2.2.2", + "solana-address-lookup-table-interface", + "solana-clock", "solana-config-program-client", - "solana-epoch-schedule 2.2.1", - "solana-fee-calculator 2.2.1", - "solana-instruction 2.3.0", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-instruction", "solana-loader-v3-interface", - "solana-nonce 2.2.1", - "solana-program-option 2.2.1", - "solana-program-pack 2.2.1", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-slot-hashes 2.2.1", - "solana-slot-history 2.2.1", + "solana-nonce", + "solana-program-option", + "solana-program-pack", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-slot-hashes", + "solana-slot-history", "solana-stake-interface", - "solana-sysvar 2.3.0", + "solana-sysvar", "solana-vote-interface", "spl-generic-token", "spl-token 8.0.0", "spl-token-2022 8.0.1", "spl-token-group-interface 0.6.0", "spl-token-metadata-interface 0.7.0", - "thiserror 2.0.16", + "thiserror 2.0.17", "zstd", ] [[package]] name = "solana-account-decoder-client-types" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39260da5bed46e52afe17c8dc2fd41b7d23a946c18605154033631a334e882ec" +checksum = "5519e8343325b707f17fbed54fcefb325131b692506d0af9e08a539d15e4f8cf" dependencies = [ "base64 0.22.1", "bs58", @@ -4461,7 +4204,7 @@ dependencies = [ "serde_derive", "serde_json", "solana-account", - "solana-pubkey 2.4.0", + "solana-pubkey", "zstd", ] @@ -4473,43 +4216,9 @@ checksum = "c8f5152a288ef1912300fc6efa6c2d1f9bb55d9398eb6c72326360b8063987da" dependencies = [ "bincode", "serde", - "solana-program-error 2.2.2", - "solana-program-memory 2.3.1", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-account-info" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82f4691b69b172c687d218dd2f1f23fc7ea5e9aa79df9ac26dab3d8dd829ce48" -dependencies = [ - "bincode", - "serde", - "solana-program-error 3.0.0", - "solana-program-memory 3.0.0", - "solana-pubkey 3.0.0", -] - -[[package]] -name = "solana-address" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a7a457086457ea9db9a5199d719dc8734dc2d0342fad0d8f77633c31eb62f19" -dependencies = [ - "borsh 1.5.7", - "bytemuck", - "bytemuck_derive", - "curve25519-dalek 4.1.3", - "five8", - "five8_const", - "serde", - "serde_derive", - "solana-atomic-u64 3.0.0", - "solana-define-syscall 3.0.0", - "solana-program-error 3.0.0", - "solana-sanitize 3.0.1", - "solana-sha256-hasher 3.0.0", + "solana-program-error", + "solana-program-memory", + "solana-pubkey", ] [[package]] @@ -4522,23 +4231,11 @@ dependencies = [ "bytemuck", "serde", "serde_derive", - "solana-clock 2.2.2", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", - "solana-slot-hashes 2.2.1", -] - -[[package]] -name = "solana-address-lookup-table-interface" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2f56cac5e70517a2f27d05e5100b20de7182473ffd0035b23ea273307905987" -dependencies = [ - "solana-clock 3.0.0", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.0.0", - "solana-slot-hashes 3.0.0", + "solana-clock", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", + "solana-slot-hashes", ] [[package]] @@ -4550,15 +4247,6 @@ dependencies = [ "parking_lot", ] -[[package]] -name = "solana-atomic-u64" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a933ff1e50aff72d02173cfcd7511bd8540b027ee720b75f353f594f834216d0" -dependencies = [ - "parking_lot", -] - [[package]] name = "solana-big-mod-exp" version = "2.2.1" @@ -4567,18 +4255,7 @@ checksum = "75db7f2bbac3e62cfd139065d15bcda9e2428883ba61fc8d27ccb251081e7567" dependencies = [ "num-bigint 0.4.6", "num-traits", - "solana-define-syscall 2.3.0", -] - -[[package]] -name = "solana-big-mod-exp" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30c80fb6d791b3925d5ec4bf23a7c169ef5090c013059ec3ed7d0b2c04efa085" -dependencies = [ - "num-bigint 0.4.6", - "num-traits", - "solana-define-syscall 3.0.0", + "solana-define-syscall", ] [[package]] @@ -4589,7 +4266,7 @@ checksum = "19a3787b8cf9c9fe3dd360800e8b70982b9e5a8af9e11c354b6665dd4a003adc" dependencies = [ "bincode", "serde", - "solana-instruction 2.3.0", + "solana-instruction", ] [[package]] @@ -4599,20 +4276,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a0801e25a1b31a14494fc80882a036be0ffd290efc4c2d640bfcca120a4672" dependencies = [ "blake3", - "solana-define-syscall 2.3.0", - "solana-hash 2.3.0", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-blake3-hasher" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffa2e3bdac3339c6d0423275e45dafc5ac25f4d43bf344d026a3cc9a85e244a6" -dependencies = [ - "blake3", - "solana-define-syscall 3.0.0", - "solana-hash 3.0.0", + "solana-define-syscall", + "solana-hash", + "solana-sanitize", ] [[package]] @@ -4626,8 +4292,8 @@ dependencies = [ "ark-ff", "ark-serialize", "bytemuck", - "solana-define-syscall 2.3.0", - "thiserror 2.0.16", + "solana-define-syscall", + "thiserror 2.0.17", ] [[package]] @@ -4636,43 +4302,34 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "718333bcd0a1a7aed6655aa66bef8d7fb047944922b2d3a18f49cbc13e73d004" dependencies = [ - "borsh 0.10.3", - "borsh 1.5.7", -] - -[[package]] -name = "solana-borsh" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc402b16657abbfa9991cd5cbfac5a11d809f7e7d28d3bb291baeb088b39060e" -dependencies = [ + "borsh 0.10.4", "borsh 1.5.7", ] [[package]] name = "solana-clap-utils" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d417e6d62ed172c023e8c91f716d2d4b7be3a452a19e2c534a14bfdb56c4be" +checksum = "82129ae5aaddbc61a36b917d65ffd2c0cac32e0f12bc2ac0ae87634ef5891c05" dependencies = [ "chrono", "clap 2.34.0", "rpassword", - "solana-clock 2.2.2", + "solana-clock", "solana-cluster-type", "solana-commitment-config", "solana-derivation-path", - "solana-hash 2.3.0", + "solana-hash", "solana-keypair", - "solana-message 2.4.0", - "solana-native-token 2.2.2", + "solana-message", + "solana-native-token", "solana-presigner", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-remote-wallet", "solana-seed-phrase", "solana-signature", "solana-signer", - "thiserror 2.0.16", + "thiserror 2.0.17", "tiny-bip39", "uriparse", "url", @@ -4680,9 +4337,9 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c04ed885bc338d800e2ac180d701f72003f0e325d431adafc7cc55601d7cd2" +checksum = "239f68bfb6aff6e8b24dc94e871a3cf41daac4ffd82d296e8ed8fb552b89a30e" dependencies = [ "dirs-next", "serde", @@ -4695,16 +4352,16 @@ dependencies = [ [[package]] name = "solana-client" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a035d424d5a44a3c16506378fd1e6133c73bc5016ffc40f8983d5373e426522" +checksum = "cc55d1f263e0be4127daf33378d313ea0977f9ffd3fba50fa544ca26722fc695" dependencies = [ "async-trait", "bincode", "dashmap", "futures", "futures-util", - "indexmap 2.11.4", + "indexmap", "indicatif", "log", "quinn", @@ -4714,12 +4371,12 @@ dependencies = [ "solana-commitment-config", "solana-connection-cache", "solana-epoch-info", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", + "solana-hash", + "solana-instruction", "solana-keypair", "solana-measure", - "solana-message 2.4.0", - "solana-pubkey 2.4.0", + "solana-message", + "solana-pubkey", "solana-pubsub-client", "solana-quic-client", "solana-quic-definitions", @@ -4733,9 +4390,9 @@ dependencies = [ "solana-time-utils", "solana-tpu-client", "solana-transaction", - "solana-transaction-error 2.2.1", + "solana-transaction-error", "solana-udp-client", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", ] @@ -4748,16 +4405,16 @@ dependencies = [ "solana-account", "solana-commitment-config", "solana-epoch-info", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", + "solana-hash", + "solana-instruction", "solana-keypair", - "solana-message 2.4.0", - "solana-pubkey 2.4.0", + "solana-message", + "solana-pubkey", "solana-signature", "solana-signer", - "solana-system-interface 1.0.0", + "solana-system-interface", "solana-transaction", - "solana-transaction-error 2.2.1", + "solana-transaction-error", ] [[package]] @@ -4768,22 +4425,9 @@ checksum = "1bb482ab70fced82ad3d7d3d87be33d466a3498eb8aa856434ff3c0dfc2e2e31" dependencies = [ "serde", "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-clock" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb62e9381182459a4520b5fe7fb22d423cae736239a6427fc398a88743d0ed59" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 3.0.0", - "solana-sdk-macro 3.0.0", - "solana-sysvar-id 3.0.0", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", ] [[package]] @@ -4794,7 +4438,7 @@ checksum = "7ace9fea2daa28354d107ea879cff107181d85cd4e0f78a2bedb10e1a428c97e" dependencies = [ "serde", "serde_derive", - "solana-hash 2.3.0", + "solana-hash", ] [[package]] @@ -4816,8 +4460,8 @@ dependencies = [ "borsh 1.5.7", "serde", "serde_derive", - "solana-instruction 2.3.0", - "solana-sdk-ids 2.2.1", + "solana-instruction", + "solana-sdk-ids", ] [[package]] @@ -4827,23 +4471,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53aceac36f105fd4922e29b4f0c1f785b69d7b3e7e387e384b8985c8e0c3595e" dependencies = [ "bincode", - "borsh 0.10.3", + "borsh 0.10.4", "kaigan", "serde", - "solana-program 2.3.0", + "solana-program", ] [[package]] name = "solana-connection-cache" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b46de0f0ec7ea94dfbc81268020c7af10999bab279d37b71f94a35f27c1c4af2" +checksum = "45c1cff5ebb26aefff52f1a8e476de70ec1683f8cc6e4a8c86b615842d91f436" dependencies = [ "async-trait", "bincode", "crossbeam-channel", "futures-util", - "indexmap 2.11.4", + "indexmap", "log", "rand 0.8.5", "rayon", @@ -4851,8 +4495,8 @@ dependencies = [ "solana-measure", "solana-metrics", "solana-time-utils", - "solana-transaction-error 2.2.1", - "thiserror 2.0.16", + "solana-transaction-error", + "thiserror 2.0.17", "tokio", ] @@ -4862,40 +4506,26 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8dc71126edddc2ba014622fc32d0f5e2e78ec6c5a1e0eb511b85618c09e9ea11" dependencies = [ - "solana-account-info 2.3.0", - "solana-define-syscall 2.3.0", - "solana-instruction 2.3.0", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-stable-layout 2.2.1", -] - -[[package]] -name = "solana-cpi" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16238feb63d1cbdf915fb287f29ef7a7ebf81469bd6214f8b72a53866b593f8f" -dependencies = [ - "solana-account-info 3.0.0", - "solana-define-syscall 3.0.0", - "solana-instruction 3.0.0", - "solana-program-error 3.0.0", - "solana-pubkey 3.0.0", - "solana-stable-layout 3.0.0", + "solana-account-info", + "solana-define-syscall", + "solana-instruction", + "solana-program-error", + "solana-pubkey", + "solana-stable-layout", ] [[package]] name = "solana-curve25519" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "946ba468216b901ecfc9476497aeaa985745652bf312dbdc7d72dbe702916b9b" +checksum = "eae4261b9a8613d10e77ac831a8fa60b6fa52b9b103df46d641deff9f9812a23" dependencies = [ "bytemuck", "bytemuck_derive", "curve25519-dalek 4.1.3", - "solana-define-syscall 2.3.0", + "solana-define-syscall", "subtle", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -4913,12 +4543,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ae3e2abcf541c8122eafe9a625d4d194b4023c20adde1e251f94e056bb1aee2" -[[package]] -name = "solana-define-syscall" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9697086a4e102d28a156b8d6b521730335d6951bd39a5e766512bbe09007cee" - [[package]] name = "solana-derivation-path" version = "2.2.1" @@ -4940,9 +4564,9 @@ dependencies = [ "bytemuck_derive", "ed25519-dalek", "solana-feature-set", - "solana-instruction 2.3.0", + "solana-instruction", "solana-precompile-error", - "solana-sdk-ids 2.2.1", + "solana-sdk-ids", ] [[package]] @@ -4963,24 +4587,10 @@ checksum = "86b575d3dd323b9ea10bb6fe89bf6bf93e249b215ba8ed7f68f1a3633f384db7" dependencies = [ "serde", "serde_derive", - "solana-hash 2.3.0", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-epoch-rewards" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b319a4ed70390af911090c020571f0ff1f4ec432522d05ab89f5c08080381995" -dependencies = [ - "serde", - "serde_derive", - "solana-hash 3.0.0", - "solana-sdk-ids 3.0.0", - "solana-sdk-macro 3.0.0", - "solana-sysvar-id 3.0.0", + "solana-hash", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", ] [[package]] @@ -4990,8 +4600,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c5fd2662ae7574810904585fd443545ed2b568dbd304b25a31e79ccc76e81b" dependencies = [ "siphasher 0.3.11", - "solana-hash 2.3.0", - "solana-pubkey 2.4.0", + "solana-hash", + "solana-pubkey", ] [[package]] @@ -5002,32 +4612,9 @@ checksum = "3fce071fbddecc55d727b1d7ed16a629afe4f6e4c217bc8d00af3b785f6f67ed" dependencies = [ "serde", "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-epoch-schedule" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5481e72cc4d52c169db73e4c0cd16de8bc943078aac587ec4817a75cc6388f" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 3.0.0", - "solana-sdk-macro 3.0.0", - "solana-sysvar-id 3.0.0", -] - -[[package]] -name = "solana-epoch-stake" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc6693d0ea833b880514b9b88d95afb80b42762dca98b0712465d1fcbbcb89e" -dependencies = [ - "solana-define-syscall 3.0.0", - "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", ] [[package]] @@ -5038,45 +4625,24 @@ checksum = "84461d56cbb8bb8d539347151e0525b53910102e4bced875d49d5139708e39d3" dependencies = [ "serde", "serde_derive", - "solana-address-lookup-table-interface 2.2.2", - "solana-clock 2.2.2", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", - "solana-keccak-hasher 2.2.1", - "solana-message 2.4.0", - "solana-nonce 2.2.1", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", - "solana-system-interface 1.0.0", - "thiserror 2.0.16", -] - -[[package]] -name = "solana-example-mocks" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978855d164845c1b0235d4b4d101cadc55373fffaf0b5b6cfa2194d25b2ed658" -dependencies = [ - "serde", - "serde_derive", - "solana-address-lookup-table-interface 3.0.0", - "solana-clock 3.0.0", - "solana-hash 3.0.0", - "solana-instruction 3.0.0", - "solana-keccak-hasher 3.0.0", - "solana-message 3.0.1", - "solana-nonce 3.0.0", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.0.0", - "solana-system-interface 2.0.0", - "thiserror 2.0.16", + "solana-address-lookup-table-interface", + "solana-clock", + "solana-hash", + "solana-instruction", + "solana-keccak-hasher", + "solana-message", + "solana-nonce", + "solana-pubkey", + "solana-sdk-ids", + "solana-system-interface", + "thiserror 2.0.17", ] [[package]] name = "solana-faucet" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e372728835d6087b1fecba3fc1270bd2e9cdc7c890e92c0daa6775302f9acef" +checksum = "47dc1a523a416877264515915badd47d79fdf245e76e81bcea695f464e77c747" dependencies = [ "bincode", "clap 2.34.0", @@ -5086,22 +4652,22 @@ dependencies = [ "serde_derive", "solana-clap-utils", "solana-cli-config", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", + "solana-hash", + "solana-instruction", "solana-keypair", "solana-logger", - "solana-message 2.4.0", + "solana-message", "solana-metrics", - "solana-native-token 2.2.2", + "solana-native-token", "solana-packet", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-signer", - "solana-system-interface 1.0.0", + "solana-system-interface", "solana-system-transaction", "solana-transaction", "solana-version", "spl-memo", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", ] @@ -5115,13 +4681,13 @@ dependencies = [ "serde", "serde_derive", "solana-account", - "solana-account-info 2.3.0", - "solana-instruction 2.3.0", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-system-interface 1.0.0", + "solana-account-info", + "solana-instruction", + "solana-program-error", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-system-interface", ] [[package]] @@ -5132,10 +4698,10 @@ checksum = "93b93971e289d6425f88e6e3cb6668c4b05df78b3c518c249be55ced8efd6b6d" dependencies = [ "ahash", "lazy_static", - "solana-epoch-schedule 2.2.1", - "solana-hash 2.3.0", - "solana-pubkey 2.4.0", - "solana-sha256-hasher 2.3.0", + "solana-epoch-schedule", + "solana-hash", + "solana-pubkey", + "solana-sha256-hasher", ] [[package]] @@ -5149,17 +4715,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "solana-fee-calculator" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a73cc03ca4bed871ca174558108835f8323e85917bb38b9c81c7af2ab853efe" -dependencies = [ - "log", - "serde", - "serde_derive", -] - [[package]] name = "solana-fee-structure" version = "2.3.0" @@ -5168,8 +4723,8 @@ checksum = "33adf673581c38e810bf618f745bf31b683a0a4a4377682e6aaac5d9a058dd4e" dependencies = [ "serde", "serde_derive", - "solana-message 2.4.0", - "solana-native-token 2.2.2", + "solana-message", + "solana-native-token", ] [[package]] @@ -5184,19 +4739,19 @@ dependencies = [ "serde", "serde_derive", "solana-account", - "solana-clock 2.2.2", + "solana-clock", "solana-cluster-type", - "solana-epoch-schedule 2.2.1", - "solana-fee-calculator 2.2.1", - "solana-hash 2.3.0", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash", "solana-inflation", "solana-keypair", "solana-logger", "solana-poh-config", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-sha256-hasher 2.3.0", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-sha256-hasher", "solana-shred-version", "solana-signer", "solana-time-utils", @@ -5225,27 +4780,11 @@ dependencies = [ "js-sys", "serde", "serde_derive", - "solana-atomic-u64 2.2.1", - "solana-sanitize 2.2.1", + "solana-atomic-u64", + "solana-sanitize", "wasm-bindgen", ] -[[package]] -name = "solana-hash" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a063723b9e84c14d8c0d2cdf0268207dc7adecf546e31251f9e07c7b00b566c" -dependencies = [ - "borsh 1.5.7", - "bytemuck", - "bytemuck_derive", - "five8", - "serde", - "serde_derive", - "solana-atomic-u64 3.0.0", - "solana-sanitize 3.0.1", -] - [[package]] name = "solana-inflation" version = "2.2.1" @@ -5264,41 +4803,16 @@ checksum = "47298e2ce82876b64f71e9d13a46bc4b9056194e7f9937ad3084385befa50885" dependencies = [ "bincode", "borsh 1.5.7", - "getrandom 0.2.10", + "getrandom 0.2.16", "js-sys", "num-traits", "serde", "serde_derive", - "solana-define-syscall 2.3.0", - "solana-pubkey 2.4.0", + "solana-define-syscall", + "solana-pubkey", "wasm-bindgen", ] -[[package]] -name = "solana-instruction" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df4e8fcba01d7efa647ed20a081c234475df5e11a93acb4393cc2c9a7b99bab" -dependencies = [ - "bincode", - "borsh 1.5.7", - "serde", - "serde_derive", - "solana-define-syscall 3.0.0", - "solana-instruction-error", - "solana-pubkey 3.0.0", -] - -[[package]] -name = "solana-instruction-error" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f0d483b8ae387178d9210e0575b666b05cdd4bd0f2f188128249f6e454d39d" -dependencies = [ - "num-traits", - "solana-program-error 3.0.0", -] - [[package]] name = "solana-instructions-sysvar" version = "2.2.2" @@ -5306,32 +4820,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0e85a6fad5c2d0c4f5b91d34b8ca47118fc593af706e523cdbedf846a954f57" dependencies = [ "bitflags 2.9.4", - "solana-account-info 2.3.0", - "solana-instruction 2.3.0", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-serialize-utils 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-instructions-sysvar" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ddf67876c541aa1e21ee1acae35c95c6fbc61119814bfef70579317a5e26955" -dependencies = [ - "bitflags 2.9.4", - "solana-account-info 3.0.0", - "solana-instruction 3.0.0", - "solana-instruction-error", - "solana-program-error 3.0.0", - "solana-pubkey 3.0.0", - "solana-sanitize 3.0.1", - "solana-sdk-ids 3.0.0", - "solana-serialize-utils 3.1.0", - "solana-sysvar-id 3.0.0", + "solana-account-info", + "solana-instruction", + "solana-program-error", + "solana-pubkey", + "solana-sanitize", + "solana-sdk-ids", + "solana-serialize-utils", + "solana-sysvar-id", ] [[package]] @@ -5341,20 +4837,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7aeb957fbd42a451b99235df4942d96db7ef678e8d5061ef34c9b34cae12f79" dependencies = [ "sha3", - "solana-define-syscall 2.3.0", - "solana-hash 2.3.0", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-keccak-hasher" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57eebd3012946913c8c1b8b43cdf8a6249edb09c0b6be3604ae910332a3acd97" -dependencies = [ - "sha3", - "solana-define-syscall 3.0.0", - "solana-hash 3.0.0", + "solana-define-syscall", + "solana-hash", + "solana-sanitize", ] [[package]] @@ -5368,7 +4853,7 @@ dependencies = [ "ed25519-dalek-bip32", "rand 0.7.3", "solana-derivation-path", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-seed-derivable", "solana-seed-phrase", "solana-signature", @@ -5384,22 +4869,9 @@ checksum = "4a6360ac2fdc72e7463565cd256eedcf10d7ef0c28a1249d261ec168c1b55cdd" dependencies = [ "serde", "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-last-restart-slot" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcda154ec827f5fc1e4da0af3417951b7e9b8157540f81f936c4a8b1156134d0" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 3.0.0", - "solana-sdk-macro 3.0.0", - "solana-sysvar-id 3.0.0", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", ] [[package]] @@ -5411,9 +4883,9 @@ dependencies = [ "serde", "serde_bytes", "serde_derive", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", ] [[package]] @@ -5425,10 +4897,10 @@ dependencies = [ "serde", "serde_bytes", "serde_derive", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", - "solana-system-interface 1.0.0", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", + "solana-system-interface", ] [[package]] @@ -5440,10 +4912,10 @@ dependencies = [ "serde", "serde_bytes", "serde_derive", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", - "solana-system-interface 1.0.0", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", + "solana-system-interface", ] [[package]] @@ -5461,9 +4933,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "776bf2178d04969492949d3b1b8d0885160d2436b9e90b55fd22ab816d6b0539" +checksum = "11dcd67cd2ae6065e494b64e861e0498d046d95a61cbbf1ae3d58be1ea0f42ed" [[package]] name = "solana-message" @@ -5477,49 +4949,31 @@ dependencies = [ "serde", "serde_derive", "solana-bincode", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-short-vec 2.2.1", - "solana-system-interface 1.0.0", - "solana-transaction-error 2.2.1", + "solana-hash", + "solana-instruction", + "solana-pubkey", + "solana-sanitize", + "solana-sdk-ids", + "solana-short-vec", + "solana-system-interface", + "solana-transaction-error", "wasm-bindgen", ] -[[package]] -name = "solana-message" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85666605c9fd727f865ed381665db0a8fc29f984a030ecc1e40f43bfb2541623" -dependencies = [ - "lazy_static", - "serde", - "serde_derive", - "solana-address", - "solana-hash 3.0.0", - "solana-instruction 3.0.0", - "solana-sanitize 3.0.1", - "solana-sdk-ids 3.0.0", - "solana-short-vec 3.0.0", - "solana-transaction-error 3.0.0", -] - [[package]] name = "solana-metrics" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e208835e05d7017d78619a441e30399c762fcce499d1d20577c553774680f66f" +checksum = "0375159d8460f423d39e5103dcff6e07796a5ec1850ee1fcfacfd2482a8f34b5" dependencies = [ "crossbeam-channel", "gethostname", "log", - "reqwest 0.12.23", + "reqwest 0.12.24", "solana-cluster-type", - "solana-sha256-hasher 2.3.0", + "solana-sha256-hasher", "solana-time-utils", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -5528,16 +4982,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36a1a14399afaabc2781a1db09cb14ee4cc4ee5c7a5a3cfcc601811379a8092" dependencies = [ - "solana-define-syscall 2.3.0", -] - -[[package]] -name = "solana-msg" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "264275c556ea7e22b9d3f87d56305546a38d4eee8ec884f3b126236cb7dcbbb4" -dependencies = [ - "solana-define-syscall 3.0.0", + "solana-define-syscall", ] [[package]] @@ -5546,17 +4991,11 @@ version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "307fb2f78060995979e9b4f68f833623565ed4e55d3725f100454ce78a99a1a3" -[[package]] -name = "solana-native-token" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8dd4c280dca9d046139eb5b7a5ac9ad10403fbd64964c7d7571214950d758f" - [[package]] name = "solana-net-utils" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4f42a434c8bf97ed2ae5080f66016abf25023a7fd8a26fd8d88e808446c7500" +checksum = "d7a9e831d0f09bd92135d48c5bc79071bb59c0537b9459f1b4dec17ecc0558fa" dependencies = [ "anyhow", "bincode", @@ -5581,22 +5020,10 @@ checksum = "703e22eb185537e06204a5bd9d509b948f0066f2d1d814a6f475dafb3ddf1325" dependencies = [ "serde", "serde_derive", - "solana-fee-calculator 2.2.1", - "solana-hash 2.3.0", - "solana-pubkey 2.4.0", - "solana-sha256-hasher 2.3.0", -] - -[[package]] -name = "solana-nonce" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abbdc6c8caf1c08db9f36a50967539d0f72b9f1d4aea04fec5430f532e5afadc" -dependencies = [ - "solana-fee-calculator 3.0.0", - "solana-hash 3.0.0", - "solana-pubkey 3.0.0", - "solana-sha256-hasher 3.0.0", + "solana-fee-calculator", + "solana-hash", + "solana-pubkey", + "solana-sha256-hasher", ] [[package]] @@ -5606,9 +5033,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cde971a20b8dbf60144d6a84439dda86b5466e00e2843091fe731083cda614da" dependencies = [ "solana-account", - "solana-hash 2.3.0", - "solana-nonce 2.2.1", - "solana-sdk-ids 2.2.1", + "solana-hash", + "solana-nonce", + "solana-sdk-ids", ] [[package]] @@ -5618,11 +5045,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b526398ade5dea37f1f147ce55dae49aa017a5d7326606359b0445ca8d946581" dependencies = [ "num_enum", - "solana-hash 2.3.0", + "solana-hash", "solana-packet", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", - "solana-sha256-hasher 2.3.0", + "solana-pubkey", + "solana-sanitize", + "solana-sha256-hasher", "solana-signature", "solana-signer", ] @@ -5643,9 +5070,9 @@ dependencies = [ [[package]] name = "solana-perf" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aed1dfb7f2c51b6b948531fd0127f8c10c71a9640c9804f106b41e6435adc768" +checksum = "37192c0be5c222ca49dbc5667288c5a8bb14837051dd98e541ee4dad160a5da9" dependencies = [ "ahash", "bincode", @@ -5661,14 +5088,14 @@ dependencies = [ "rand 0.8.5", "rayon", "serde", - "solana-hash 2.3.0", - "solana-message 2.4.0", + "solana-hash", + "solana-message", "solana-metrics", "solana-packet", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rayon-threadlimit", - "solana-sdk-ids 2.2.1", - "solana-short-vec 2.2.1", + "solana-sdk-ids", + "solana-short-vec", "solana-signature", "solana-time-utils", ] @@ -5702,10 +5129,10 @@ dependencies = [ "lazy_static", "solana-ed25519-program", "solana-feature-set", - "solana-message 2.4.0", + "solana-message", "solana-precompile-error", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", + "solana-pubkey", + "solana-sdk-ids", "solana-secp256k1-program", "solana-secp256r1-program", ] @@ -5716,7 +5143,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81a57a24e6a4125fc69510b6774cd93402b943191b6cddad05de7281491c90fe" dependencies = [ - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-signature", "solana-signer", ] @@ -5729,148 +5156,88 @@ checksum = "98eca145bd3545e2fbb07166e895370576e47a00a7d824e325390d33bf467210" dependencies = [ "bincode", "blake3", - "borsh 0.10.3", + "borsh 0.10.4", "borsh 1.5.7", "bs58", "bytemuck", "console_error_panic_hook", "console_log", - "getrandom 0.2.10", + "getrandom 0.2.16", "lazy_static", "log", "memoffset", "num-bigint 0.4.6", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", "rand 0.8.5", "serde", "serde_bytes", "serde_derive", - "solana-account-info 2.3.0", - "solana-address-lookup-table-interface 2.2.2", - "solana-atomic-u64 2.2.1", - "solana-big-mod-exp 2.2.1", + "solana-account-info", + "solana-address-lookup-table-interface", + "solana-atomic-u64", + "solana-big-mod-exp", "solana-bincode", - "solana-blake3-hasher 2.2.1", - "solana-borsh 2.2.1", - "solana-clock 2.2.2", - "solana-cpi 2.2.1", + "solana-blake3-hasher", + "solana-borsh", + "solana-clock", + "solana-cpi", "solana-decode-error", - "solana-define-syscall 2.3.0", - "solana-epoch-rewards 2.2.1", - "solana-epoch-schedule 2.2.1", - "solana-example-mocks 2.2.1", + "solana-define-syscall", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-example-mocks", "solana-feature-gate-interface", - "solana-fee-calculator 2.2.1", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", - "solana-instructions-sysvar 2.2.2", - "solana-keccak-hasher 2.2.1", - "solana-last-restart-slot 2.2.1", + "solana-fee-calculator", + "solana-hash", + "solana-instruction", + "solana-instructions-sysvar", + "solana-keccak-hasher", + "solana-last-restart-slot", "solana-loader-v2-interface", "solana-loader-v3-interface", "solana-loader-v4-interface", - "solana-message 2.4.0", - "solana-msg 2.2.1", - "solana-native-token 2.2.2", - "solana-nonce 2.2.1", - "solana-program-entrypoint 2.3.0", - "solana-program-error 2.2.2", - "solana-program-memory 2.3.1", - "solana-program-option 2.2.1", - "solana-program-pack 2.2.1", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sanitize 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-secp256k1-recover 2.2.1", - "solana-serde-varint 2.2.2", - "solana-serialize-utils 2.2.1", - "solana-sha256-hasher 2.3.0", - "solana-short-vec 2.2.1", - "solana-slot-hashes 2.2.1", - "solana-slot-history 2.2.1", - "solana-stable-layout 2.2.1", + "solana-message", + "solana-msg", + "solana-native-token", + "solana-nonce", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey", + "solana-rent", + "solana-sanitize", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-secp256k1-recover", + "solana-serde-varint", + "solana-serialize-utils", + "solana-sha256-hasher", + "solana-short-vec", + "solana-slot-hashes", + "solana-slot-history", + "solana-stable-layout", "solana-stake-interface", - "solana-system-interface 1.0.0", - "solana-sysvar 2.3.0", - "solana-sysvar-id 2.2.1", + "solana-system-interface", + "solana-sysvar", + "solana-sysvar-id", "solana-vote-interface", - "thiserror 2.0.16", + "thiserror 2.0.17", "wasm-bindgen", ] -[[package]] -name = "solana-program" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91b12305dd81045d705f427acd0435a2e46444b65367d7179d7bdcfc3bc5f5eb" -dependencies = [ - "memoffset", - "solana-account-info 3.0.0", - "solana-big-mod-exp 3.0.0", - "solana-blake3-hasher 3.0.0", - "solana-borsh 3.0.0", - "solana-clock 3.0.0", - "solana-cpi 3.0.0", - "solana-define-syscall 3.0.0", - "solana-epoch-rewards 3.0.0", - "solana-epoch-schedule 3.0.0", - "solana-epoch-stake", - "solana-example-mocks 3.0.0", - "solana-fee-calculator 3.0.0", - "solana-hash 3.0.0", - "solana-instruction 3.0.0", - "solana-instruction-error", - "solana-instructions-sysvar 3.0.0", - "solana-keccak-hasher 3.0.0", - "solana-last-restart-slot 3.0.0", - "solana-msg 3.0.0", - "solana-native-token 3.0.0", - "solana-program-entrypoint 3.1.0", - "solana-program-error 3.0.0", - "solana-program-memory 3.0.0", - "solana-program-option 3.0.0", - "solana-program-pack 3.0.0", - "solana-pubkey 3.0.0", - "solana-rent 3.0.0", - "solana-sdk-ids 3.0.0", - "solana-secp256k1-recover 3.0.0", - "solana-serde-varint 3.0.0", - "solana-serialize-utils 3.1.0", - "solana-sha256-hasher 3.0.0", - "solana-short-vec 3.0.0", - "solana-slot-hashes 3.0.0", - "solana-slot-history 3.0.0", - "solana-stable-layout 3.0.0", - "solana-sysvar 3.0.0", - "solana-sysvar-id 3.0.0", -] - [[package]] name = "solana-program-entrypoint" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32ce041b1a0ed275290a5008ee1a4a6c48f5054c8a3d78d313c08958a06aedbd" dependencies = [ - "solana-account-info 2.3.0", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-program-entrypoint" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6557cf5b5e91745d1667447438a1baa7823c6086e4ece67f8e6ebfa7a8f72660" -dependencies = [ - "solana-account-info 3.0.0", - "solana-define-syscall 3.0.0", - "solana-msg 3.0.0", - "solana-program-error 3.0.0", - "solana-pubkey 3.0.0", + "solana-account-info", + "solana-msg", + "solana-program-error", + "solana-pubkey", ] [[package]] @@ -5884,20 +5251,9 @@ dependencies = [ "serde", "serde_derive", "solana-decode-error", - "solana-instruction 2.3.0", - "solana-msg 2.2.1", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-program-error" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1af32c995a7b692a915bb7414d5f8e838450cf7c70414e763d8abcae7b51f28" -dependencies = [ - "borsh 1.5.7", - "serde", - "serde_derive", + "solana-instruction", + "solana-msg", + "solana-pubkey", ] [[package]] @@ -5906,16 +5262,7 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a5426090c6f3fd6cfdc10685322fede9ca8e5af43cd6a59e98bfe4e91671712" dependencies = [ - "solana-define-syscall 2.3.0", -] - -[[package]] -name = "solana-program-memory" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10e5660c60749c7bfb30b447542529758e4dbcecd31b1e8af1fdc92e2bdde90a" -dependencies = [ - "solana-define-syscall 3.0.0", + "solana-define-syscall", ] [[package]] @@ -5924,28 +5271,13 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc677a2e9bc616eda6dbdab834d463372b92848b2bfe4a1ed4e4b4adba3397d0" -[[package]] -name = "solana-program-option" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e7b4ddb464f274deb4a497712664c3b612e3f5f82471d4e47710fc4ab1c3095" - [[package]] name = "solana-program-pack" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "319f0ef15e6e12dc37c597faccb7d62525a509fec5f6975ecb9419efddeb277b" dependencies = [ - "solana-program-error 2.2.2", -] - -[[package]] -name = "solana-program-pack" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c169359de21f6034a63ebf96d6b380980307df17a8d371344ff04a883ec4e9d0" -dependencies = [ - "solana-program-error 3.0.0", + "solana-program-error", ] [[package]] @@ -5954,41 +5286,32 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b62adb9c3261a052ca1f999398c388f1daf558a1b492f60a6d9e64857db4ff1" dependencies = [ - "borsh 0.10.3", + "borsh 0.10.4", "borsh 1.5.7", "bytemuck", "bytemuck_derive", "curve25519-dalek 4.1.3", "five8", "five8_const", - "getrandom 0.2.10", + "getrandom 0.2.16", "js-sys", "num-traits", "rand 0.8.5", "serde", "serde_derive", - "solana-atomic-u64 2.2.1", + "solana-atomic-u64", "solana-decode-error", - "solana-define-syscall 2.3.0", - "solana-sanitize 2.2.1", - "solana-sha256-hasher 2.3.0", + "solana-define-syscall", + "solana-sanitize", + "solana-sha256-hasher", "wasm-bindgen", ] -[[package]] -name = "solana-pubkey" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8909d399deb0851aa524420beeb5646b115fd253ef446e35fe4504c904da3941" -dependencies = [ - "solana-address", -] - [[package]] name = "solana-pubsub-client" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df314b22923b112c7bd90629b42af3881222b8955e3a1d4cf2b21f5ab794a0bb" +checksum = "d18a7476e1d2e8df5093816afd8fffee94fbb6e442d9be8e6bd3e85f88ce8d5c" dependencies = [ "crossbeam-channel", "futures-util", @@ -5999,11 +5322,11 @@ dependencies = [ "serde_derive", "serde_json", "solana-account-decoder-client-types", - "solana-clock 2.2.2", - "solana-pubkey 2.4.0", + "solana-clock", + "solana-pubkey", "solana-rpc-client-types", "solana-signature", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tokio-stream", "tokio-tungstenite", @@ -6013,9 +5336,9 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022865e50402d978b90cc3090d6d2a098ed9af549ce69a7deed92cf203f3a4a3" +checksum = "44feb5f4a97494459c435aa56de810500cc24e22d0afc632990a8e54a07c05a4" dependencies = [ "async-lock", "async-trait", @@ -6024,20 +5347,20 @@ dependencies = [ "log", "quinn", "quinn-proto", - "rustls 0.23.32", + "rustls 0.23.33", "solana-connection-cache", "solana-keypair", "solana-measure", "solana-metrics", "solana-net-utils", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-quic-definitions", "solana-rpc-client-api", "solana-signer", "solana-streamer", "solana-tls-utils", - "solana-transaction-error 2.2.1", - "thiserror 2.0.16", + "solana-transaction-error", + "thiserror 2.0.17", "tokio", ] @@ -6052,34 +5375,34 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a99a753bb24fd7f697d92343a6f6b50cd1e9e1e5e6267b9224821ab3972939e8" +checksum = "02cc2a4cae3ef7bb6346b35a60756d2622c297d5fa204f96731db9194c0dc75b" dependencies = [ "num_cpus", ] [[package]] name = "solana-remote-wallet" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72aeed3f2ad4ff61adfd97d0dfde9fb73b5bf1ece93384690e2119ed49b6f0f2" +checksum = "f42662ecdff5cc2db0116730c83a6d6218db01f29750467ce2161675415acad6" dependencies = [ "console", "dialoguer", "hidapi", "log", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", "parking_lot", "qstring", "semver", "solana-derivation-path", "solana-offchain-message", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-signature", "solana-signer", - "thiserror 2.0.16", + "thiserror 2.0.17", "uriparse", ] @@ -6091,22 +5414,9 @@ checksum = "d1aea8fdea9de98ca6e8c2da5827707fb3842833521b528a713810ca685d2480" dependencies = [ "serde", "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-rent" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b702d8c43711e3c8a9284a4f1bbc6a3de2553deb25b0c8142f9a44ef0ce5ddc1" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 3.0.0", - "solana-sdk-macro 3.0.0", - "solana-sysvar-id 3.0.0", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", ] [[package]] @@ -6118,12 +5428,12 @@ dependencies = [ "serde", "serde_derive", "solana-account", - "solana-clock 2.2.2", - "solana-epoch-schedule 2.2.1", + "solana-clock", + "solana-epoch-schedule", "solana-genesis-config", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", ] [[package]] @@ -6132,7 +5442,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f6f9113c6003492e74438d1288e30cffa8ccfdc2ef7b49b9e816d8034da18cd" dependencies = [ - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-reward-info", ] @@ -6144,8 +5454,8 @@ checksum = "e4b22ea19ca2a3f28af7cd047c914abf833486bf7a7c4a10fc652fff09b385b1" dependencies = [ "lazy_static", "solana-feature-set", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", + "solana-pubkey", + "solana-sdk-ids", ] [[package]] @@ -6160,9 +5470,9 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9238867c44e246ddd0427b8e8e21de1b98c6e63a243ae36c7d8429d2e0b29390" +checksum = "b8d3161ac0918178e674c1f7f1bfac40de3e7ed0383bd65747d63113c156eaeb" dependencies = [ "async-trait", "base64 0.22.1", @@ -6171,7 +5481,7 @@ dependencies = [ "futures", "indicatif", "log", - "reqwest 0.12.23", + "reqwest 0.12.24", "reqwest-middleware", "semver", "serde", @@ -6179,19 +5489,19 @@ dependencies = [ "serde_json", "solana-account", "solana-account-decoder-client-types", - "solana-clock 2.2.2", + "solana-clock", "solana-commitment-config", "solana-epoch-info", - "solana-epoch-schedule 2.2.1", + "solana-epoch-schedule", "solana-feature-gate-interface", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", - "solana-message 2.4.0", - "solana-pubkey 2.4.0", + "solana-hash", + "solana-instruction", + "solana-message", + "solana-pubkey", "solana-rpc-client-api", "solana-signature", "solana-transaction", - "solana-transaction-error 2.2.1", + "solana-transaction-error", "solana-transaction-status-client-types", "solana-version", "solana-vote-interface", @@ -6200,48 +5510,48 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "735b5dc6f2ec3cfb1a39f1327e5855c741edaa8aa7eb1613e6d918cda4cf3c29" +checksum = "2dbc138685c79d88a766a8fd825057a74ea7a21e1dd7f8de275ada899540fff7" dependencies = [ "anyhow", "jsonrpc-core", - "reqwest 0.12.23", + "reqwest 0.12.24", "reqwest-middleware", "serde", "serde_derive", "serde_json", "solana-account-decoder-client-types", - "solana-clock 2.2.2", + "solana-clock", "solana-rpc-client-types", "solana-signer", - "solana-transaction-error 2.2.1", + "solana-transaction-error", "solana-transaction-status-client-types", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "solana-rpc-client-nonce-utils" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cbcb994c698ffaea792ec0dba3ae84259c53e7dc464cc6b2321a3d593c7f61" +checksum = "87f0ee41b9894ff36adebe546a110b899b0d0294b07845d8acdc73822e6af4b0" dependencies = [ "solana-account", "solana-commitment-config", - "solana-hash 2.3.0", - "solana-message 2.4.0", - "solana-nonce 2.2.1", - "solana-pubkey 2.4.0", + "solana-hash", + "solana-message", + "solana-nonce", + "solana-pubkey", "solana-rpc-client", - "solana-sdk-ids 2.2.1", - "thiserror 2.0.16", + "solana-sdk-ids", + "thiserror 2.0.17", ] [[package]] name = "solana-rpc-client-types" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b96eeec383718c1a4dbbebc4039029ae779d7e6ec5586b6a330803132d04f4f" +checksum = "8ea428a81729255d895ea47fba9b30fd4dacbfe571a080448121bd0592751676" dependencies = [ "base64 0.22.1", "bs58", @@ -6251,16 +5561,16 @@ dependencies = [ "serde_json", "solana-account", "solana-account-decoder-client-types", - "solana-clock 2.2.2", + "solana-clock", "solana-commitment-config", - "solana-fee-calculator 2.2.1", + "solana-fee-calculator", "solana-inflation", - "solana-pubkey 2.4.0", - "solana-transaction-error 2.2.1", + "solana-pubkey", + "solana-transaction-error", "solana-transaction-status-client-types", "solana-version", "spl-generic-token", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -6269,12 +5579,6 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61f1bc1357b8188d9c4a3af3fc55276e56987265eb7ad073ae6f8180ee54cecf" -[[package]] -name = "solana-sanitize" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf09694a0fc14e5ffb18f9b7b7c0f15ecb6eac5b5610bf76a1853459d19daf9" - [[package]] name = "solana-sdk" version = "2.3.1" @@ -6303,10 +5607,10 @@ dependencies = [ "solana-genesis-config", "solana-hard-forks", "solana-inflation", - "solana-instruction 2.3.0", + "solana-instruction", "solana-keypair", - "solana-message 2.4.0", - "solana-native-token 2.2.2", + "solana-message", + "solana-native-token", "solana-nonce-account", "solana-offchain-message", "solana-packet", @@ -6314,25 +5618,25 @@ dependencies = [ "solana-precompile-error", "solana-precompiles", "solana-presigner", - "solana-program 2.3.0", - "solana-program-memory 2.3.1", - "solana-pubkey 2.4.0", + "solana-program", + "solana-program-memory", + "solana-pubkey", "solana-quic-definitions", "solana-rent-collector", "solana-rent-debits", "solana-reserved-account-keys", "solana-reward-info", - "solana-sanitize 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", + "solana-sanitize", + "solana-sdk-ids", + "solana-sdk-macro", "solana-secp256k1-program", - "solana-secp256k1-recover 2.2.1", + "solana-secp256k1-recover", "solana-secp256r1-program", "solana-seed-derivable", "solana-seed-phrase", "solana-serde", - "solana-serde-varint 2.2.2", - "solana-short-vec 2.2.1", + "solana-serde-varint", + "solana-short-vec", "solana-shred-version", "solana-signature", "solana-signer", @@ -6340,9 +5644,9 @@ dependencies = [ "solana-time-utils", "solana-transaction", "solana-transaction-context", - "solana-transaction-error 2.2.1", + "solana-transaction-error", "solana-validator-exit", - "thiserror 2.0.16", + "thiserror 2.0.17", "wasm-bindgen", ] @@ -6352,16 +5656,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c5d8b9cc68d5c88b062a33e23a6466722467dde0035152d8fb1afbcdf350a5f" dependencies = [ - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-sdk-ids" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1b6d6aaf60669c592838d382266b173881c65fb1cdec83b37cb8ce7cb89f9ad" -dependencies = [ - "solana-pubkey 3.0.0", + "solana-pubkey", ] [[package]] @@ -6373,19 +5668,7 @@ dependencies = [ "bs58", "proc-macro2", "quote", - "syn 2.0.106", -] - -[[package]] -name = "solana-sdk-macro" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6430000e97083460b71d9fbadc52a2ab2f88f53b3a4c5e58c5ae3640a0e8c00" -dependencies = [ - "bs58", - "proc-macro2", - "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -6401,9 +5684,9 @@ dependencies = [ "serde_derive", "sha3", "solana-feature-set", - "solana-instruction 2.3.0", + "solana-instruction", "solana-precompile-error", - "solana-sdk-ids 2.2.1", + "solana-sdk-ids", "solana-signature", ] @@ -6415,19 +5698,8 @@ checksum = "baa3120b6cdaa270f39444f5093a90a7b03d296d362878f7a6991d6de3bbe496" dependencies = [ "borsh 1.5.7", "libsecp256k1", - "solana-define-syscall 2.3.0", - "thiserror 2.0.16", -] - -[[package]] -name = "solana-secp256k1-recover" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "394a4470477d66296af5217970a905b1c5569032a7732c367fb69e5666c8607e" -dependencies = [ - "k256", - "solana-define-syscall 3.0.0", - "thiserror 2.0.16", + "solana-define-syscall", + "thiserror 2.0.17", ] [[package]] @@ -6439,9 +5711,9 @@ dependencies = [ "bytemuck", "openssl", "solana-feature-set", - "solana-instruction 2.3.0", + "solana-instruction", "solana-precompile-error", - "solana-sdk-ids 2.2.1", + "solana-sdk-ids", ] [[package]] @@ -6467,7 +5739,7 @@ checksum = "36187af2324f079f65a675ec22b31c24919cb4ac22c79472e85d819db9bbbc15" dependencies = [ "hmac 0.12.1", "pbkdf2 0.11.0", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -6488,73 +5760,33 @@ dependencies = [ "serde", ] -[[package]] -name = "solana-serde-varint" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e5174c57d5ff3c1995f274d17156964664566e2cde18a07bba1586d35a70d3b" -dependencies = [ - "serde", -] - [[package]] name = "solana-serialize-utils" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "817a284b63197d2b27afdba829c5ab34231da4a9b4e763466a003c40ca4f535e" dependencies = [ - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-serialize-utils" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e41dd8feea239516c623a02f0a81c2367f4b604d7965237fed0751aeec33ed" -dependencies = [ - "solana-instruction-error", - "solana-pubkey 3.0.0", - "solana-sanitize 3.0.1", + "solana-instruction", + "solana-pubkey", + "solana-sanitize", ] [[package]] name = "solana-sha256-hasher" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa3feb32c28765f6aa1ce8f3feac30936f16c5c3f7eb73d63a5b8f6f8ecdc44" -dependencies = [ - "sha2 0.10.8", - "solana-define-syscall 2.3.0", - "solana-hash 2.3.0", -] - -[[package]] -name = "solana-sha256-hasher" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b912ba6f71cb202c0c3773ec77bf898fa9fe0c78691a2d6859b3b5b8954719" -dependencies = [ - "sha2 0.10.8", - "solana-define-syscall 3.0.0", - "solana-hash 3.0.0", -] - -[[package]] -name = "solana-short-vec" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c54c66f19b9766a56fa0057d060de8378676cb64987533fa088861858fc5a69" +checksum = "5aa3feb32c28765f6aa1ce8f3feac30936f16c5c3f7eb73d63a5b8f6f8ecdc44" dependencies = [ - "serde", + "sha2 0.10.9", + "solana-define-syscall", + "solana-hash", ] [[package]] name = "solana-short-vec" -version = "3.0.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b69d029da5428fc1c57f7d49101b2077c61f049d4112cd5fb8456567cc7d2638" +checksum = "5c54c66f19b9766a56fa0057d060de8378676cb64987533fa088861858fc5a69" dependencies = [ "serde", ] @@ -6566,8 +5798,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afd3db0461089d1ad1a78d9ba3f15b563899ca2386351d38428faa5350c60a98" dependencies = [ "solana-hard-forks", - "solana-hash 2.3.0", - "solana-sha256-hasher 2.3.0", + "solana-hash", + "solana-sha256-hasher", ] [[package]] @@ -6582,7 +5814,7 @@ dependencies = [ "serde", "serde-big-array", "serde_derive", - "solana-sanitize 2.2.1", + "solana-sanitize", ] [[package]] @@ -6591,9 +5823,9 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c41991508a4b02f021c1342ba00bcfa098630b213726ceadc7cb032e051975b" dependencies = [ - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-signature", - "solana-transaction-error 2.2.1", + "solana-transaction-error", ] [[package]] @@ -6604,22 +5836,9 @@ checksum = "0c8691982114513763e88d04094c9caa0376b867a29577939011331134c301ce" dependencies = [ "serde", "serde_derive", - "solana-hash 2.3.0", - "solana-sdk-ids 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-slot-hashes" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80a293f952293281443c04f4d96afd9d547721923d596e92b4377ed2360f1746" -dependencies = [ - "serde", - "serde_derive", - "solana-hash 3.0.0", - "solana-sdk-ids 3.0.0", - "solana-sysvar-id 3.0.0", + "solana-hash", + "solana-sdk-ids", + "solana-sysvar-id", ] [[package]] @@ -6631,21 +5850,8 @@ dependencies = [ "bv", "serde", "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-slot-history" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f914f6b108f5bba14a280b458d023e3621c9973f27f015a4d755b50e88d89e97" -dependencies = [ - "bv", - "serde", - "serde_derive", - "solana-sdk-ids 3.0.0", - "solana-sysvar-id 3.0.0", + "solana-sdk-ids", + "solana-sysvar-id", ] [[package]] @@ -6654,18 +5860,8 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f14f7d02af8f2bc1b5efeeae71bc1c2b7f0f65cd75bcc7d8180f2c762a57f54" dependencies = [ - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-stable-layout" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1da74507795b6e8fb60b7c7306c0c36e2c315805d16eaaf479452661234685ac" -dependencies = [ - "solana-instruction 3.0.0", - "solana-pubkey 3.0.0", + "solana-instruction", + "solana-pubkey", ] [[package]] @@ -6674,26 +5870,26 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5269e89fde216b4d7e1d1739cf5303f8398a1ff372a81232abbee80e554a838c" dependencies = [ - "borsh 0.10.3", + "borsh 0.10.4", "borsh 1.5.7", "num-traits", "serde", "serde_derive", - "solana-clock 2.2.2", - "solana-cpi 2.2.1", + "solana-clock", + "solana-cpi", "solana-decode-error", - "solana-instruction 2.3.0", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-system-interface 1.0.0", - "solana-sysvar-id 2.2.1", + "solana-instruction", + "solana-program-error", + "solana-pubkey", + "solana-system-interface", + "solana-sysvar-id", ] [[package]] name = "solana-streamer" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1faa9bfb0bc556b77d836cacf347c4e1754a0334e8b9946dbed49ead4e1c0eb2" +checksum = "5643516e5206b89dd4bdf67c39815606d835a51a13260e43349abdb92d241b1d" dependencies = [ "async-channel", "bytes", @@ -6703,7 +5899,7 @@ dependencies = [ "futures-util", "governor", "histogram", - "indexmap 2.11.4", + "indexmap", "itertools 0.12.1", "libc", "log", @@ -6713,7 +5909,7 @@ dependencies = [ "quinn", "quinn-proto", "rand 0.8.5", - "rustls 0.23.32", + "rustls 0.23.33", "smallvec", "socket2 0.5.10", "solana-keypair", @@ -6722,15 +5918,15 @@ dependencies = [ "solana-net-utils", "solana-packet", "solana-perf", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-quic-definitions", "solana-signature", "solana-signer", "solana-time-utils", "solana-tls-utils", - "solana-transaction-error 2.2.1", + "solana-transaction-error", "solana-transaction-metrics-tracker", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tokio-util", "x509-parser", @@ -6738,9 +5934,9 @@ dependencies = [ [[package]] name = "solana-svm-feature-set" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c343731bf4a594a615c2aa32a63a0f42f39581e7975114ed825133e30ab68346" +checksum = "3f24b836eb4d74ec255217bdbe0f24f64a07adeac31aca61f334f91cd4a3b1d5" [[package]] name = "solana-system-interface" @@ -6753,35 +5949,23 @@ dependencies = [ "serde", "serde_derive", "solana-decode-error", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", + "solana-instruction", + "solana-pubkey", "wasm-bindgen", ] -[[package]] -name = "solana-system-interface" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e1790547bfc3061f1ee68ea9d8dc6c973c02a163697b24263a8e9f2e6d4afa2" -dependencies = [ - "num-traits", - "solana-msg 3.0.0", - "solana-program-error 3.0.0", - "solana-pubkey 3.0.0", -] - [[package]] name = "solana-system-transaction" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5bd98a25e5bcba8b6be8bcbb7b84b24c2a6a8178d7fb0e3077a916855ceba91a" dependencies = [ - "solana-hash 2.3.0", + "solana-hash", "solana-keypair", - "solana-message 2.4.0", - "solana-pubkey 2.4.0", + "solana-message", + "solana-pubkey", "solana-signer", - "solana-system-interface 1.0.0", + "solana-system-interface", "solana-transaction", ] @@ -6798,62 +5982,28 @@ dependencies = [ "lazy_static", "serde", "serde_derive", - "solana-account-info 2.3.0", - "solana-clock 2.2.2", - "solana-define-syscall 2.3.0", - "solana-epoch-rewards 2.2.1", - "solana-epoch-schedule 2.2.1", - "solana-fee-calculator 2.2.1", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", - "solana-instructions-sysvar 2.2.2", - "solana-last-restart-slot 2.2.1", - "solana-program-entrypoint 2.3.0", - "solana-program-error 2.2.2", - "solana-program-memory 2.3.1", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sanitize 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-slot-hashes 2.2.1", - "solana-slot-history 2.2.1", + "solana-account-info", + "solana-clock", + "solana-define-syscall", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash", + "solana-instruction", + "solana-instructions-sysvar", + "solana-last-restart-slot", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-pubkey", + "solana-rent", + "solana-sanitize", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-slot-hashes", + "solana-slot-history", "solana-stake-interface", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-sysvar" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63205e68d680bcc315337dec311b616ab32fea0a612db3b883ce4de02e0953f9" -dependencies = [ - "base64 0.22.1", - "bincode", - "bytemuck", - "bytemuck_derive", - "lazy_static", - "serde", - "serde_derive", - "solana-account-info 3.0.0", - "solana-clock 3.0.0", - "solana-define-syscall 3.0.0", - "solana-epoch-rewards 3.0.0", - "solana-epoch-schedule 3.0.0", - "solana-fee-calculator 3.0.0", - "solana-hash 3.0.0", - "solana-instruction 3.0.0", - "solana-last-restart-slot 3.0.0", - "solana-program-entrypoint 3.1.0", - "solana-program-error 3.0.0", - "solana-program-memory 3.0.0", - "solana-pubkey 3.0.0", - "solana-rent 3.0.0", - "solana-sdk-ids 3.0.0", - "solana-sdk-macro 3.0.0", - "solana-slot-hashes 3.0.0", - "solana-slot-history 3.0.0", - "solana-sysvar-id 3.0.0", + "solana-sysvar-id", ] [[package]] @@ -6862,47 +6012,37 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5762b273d3325b047cfda250787f8d796d781746860d5d0a746ee29f3e8812c1" dependencies = [ - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", -] - -[[package]] -name = "solana-sysvar-id" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5051bc1a16d5d96a96bc33b5b2ec707495c48fe978097bdaba68d3c47987eb32" -dependencies = [ - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.0.0", + "solana-pubkey", + "solana-sdk-ids", ] [[package]] name = "solana-thin-client" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc60d1502f5eeb2e5f3286b34f567d3c076e6da5a753a002ef8889fda670ecf" +checksum = "6c1025715a113e0e2e379b30a6bfe4455770dc0759dabf93f7dbd16646d5acbe" dependencies = [ "bincode", "log", "rayon", "solana-account", "solana-client-traits", - "solana-clock 2.2.2", + "solana-clock", "solana-commitment-config", "solana-connection-cache", "solana-epoch-info", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", + "solana-hash", + "solana-instruction", "solana-keypair", - "solana-message 2.4.0", - "solana-pubkey 2.4.0", + "solana-message", + "solana-pubkey", "solana-rpc-client", "solana-rpc-client-api", "solana-signature", "solana-signer", - "solana-system-interface 1.0.0", + "solana-system-interface", "solana-transaction", - "solana-transaction-error 2.2.1", + "solana-transaction-error", ] [[package]] @@ -6913,39 +6053,39 @@ checksum = "6af261afb0e8c39252a04d026e3ea9c405342b08c871a2ad8aa5448e068c784c" [[package]] name = "solana-tls-utils" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5629f315f8e64b7336e5c8e10ff48d350ca1ce321f4132238705f0acbeeaf843" +checksum = "14494aa87a75a883d1abcfee00f1278a28ecc594a2f030084879eb40570728f6" dependencies = [ - "rustls 0.23.32", + "rustls 0.23.33", "solana-keypair", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-signer", "x509-parser", ] [[package]] name = "solana-tpu-client" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "268c9aaf276cc863b1f683ab0e7d97aee2d52502ddf9fd02d8564fc8fb9f2ba8" +checksum = "17895ce70fd1dd93add3fbac87d599954ded93c63fa1c66f702d278d96a6da14" dependencies = [ "async-trait", "bincode", "futures-util", - "indexmap 2.11.4", + "indexmap", "indicatif", "log", "rayon", "solana-client-traits", - "solana-clock 2.2.2", + "solana-clock", "solana-commitment-config", "solana-connection-cache", - "solana-epoch-schedule 2.2.1", + "solana-epoch-schedule", "solana-measure", - "solana-message 2.4.0", + "solana-message", "solana-net-utils", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-pubsub-client", "solana-quic-definitions", "solana-rpc-client", @@ -6953,8 +6093,8 @@ dependencies = [ "solana-signature", "solana-signer", "solana-transaction", - "solana-transaction-error 2.2.1", - "thiserror 2.0.16", + "solana-transaction-error", + "thiserror 2.0.17", "tokio", ] @@ -6969,37 +6109,37 @@ dependencies = [ "serde_derive", "solana-bincode", "solana-feature-set", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", + "solana-hash", + "solana-instruction", "solana-keypair", - "solana-message 2.4.0", + "solana-message", "solana-precompiles", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-short-vec 2.2.1", + "solana-pubkey", + "solana-sanitize", + "solana-sdk-ids", + "solana-short-vec", "solana-signature", "solana-signer", - "solana-system-interface 1.0.0", - "solana-transaction-error 2.2.1", + "solana-system-interface", + "solana-transaction-error", "wasm-bindgen", ] [[package]] name = "solana-transaction-context" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a816015e792c953f755a333c1ae3a1c3b1e5cde52a5f98015ed26d5adea70e63" +checksum = "54a312304361987a85b2ef2293920558e6612876a639dd1309daf6d0d59ef2fe" dependencies = [ "bincode", "serde", "serde_derive", "solana-account", - "solana-instruction 2.3.0", - "solana-instructions-sysvar 2.2.2", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", + "solana-instruction", + "solana-instructions-sysvar", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", ] [[package]] @@ -7010,25 +6150,15 @@ checksum = "222a9dc8fdb61c6088baab34fc3a8b8473a03a7a5fd404ed8dd502fa79b67cb1" dependencies = [ "serde", "serde_derive", - "solana-instruction 2.3.0", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-transaction-error" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4222065402340d7e6aec9dc3e54d22992ddcf923d91edcd815443c2bfca3144a" -dependencies = [ - "solana-instruction-error", - "solana-sanitize 3.0.1", + "solana-instruction", + "solana-sanitize", ] [[package]] name = "solana-transaction-metrics-tracker" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e77b3b3f4790dcf6cb945cfce4210cb8a22ccf74cfdff84b726650b698bf62" +checksum = "03fc4e1b6252dc724f5ee69db6229feb43070b7318651580d2174da8baefb993" dependencies = [ "base64 0.22.1", "bincode", @@ -7036,15 +6166,15 @@ dependencies = [ "rand 0.8.5", "solana-packet", "solana-perf", - "solana-short-vec 2.2.1", + "solana-short-vec", "solana-signature", ] [[package]] name = "solana-transaction-status-client-types" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24dfa59c12442f2283eb07d3c2fefff5862d4200579093b0a990b0c262bc003e" +checksum = "51f1d7c2387c35850848212244d2b225847666cb52d3bd59a5c409d2c300303d" dependencies = [ "base64 0.22.1", "bincode", @@ -7054,28 +6184,28 @@ dependencies = [ "serde_json", "solana-account-decoder-client-types", "solana-commitment-config", - "solana-message 2.4.0", + "solana-message", "solana-reward-info", "solana-signature", "solana-transaction", "solana-transaction-context", - "solana-transaction-error 2.2.1", - "thiserror 2.0.16", + "solana-transaction-error", + "thiserror 2.0.17", ] [[package]] name = "solana-udp-client" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a11eb463af8c3de38b6452a51c885231188462647eb8e95ca8344c18aceaf47" +checksum = "2dd36227dd3035ac09a89d4239551d2e3d7d9b177b61ccc7c6d393c3974d0efa" dependencies = [ "async-trait", "solana-connection-cache", "solana-keypair", "solana-net-utils", "solana-streamer", - "solana-transaction-error 2.2.1", - "thiserror 2.0.16", + "solana-transaction-error", + "thiserror 2.0.17", "tokio", ] @@ -7087,17 +6217,17 @@ checksum = "7bbf6d7a3c0b28dd5335c52c0e9eae49d0ae489a8f324917faf0ded65a812c1d" [[package]] name = "solana-version" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb7e1261069a748647abc07f611a5ced461390447aa1fe083eb733796e038b" +checksum = "3324d46c7f7b7f5d34bf7dc71a2883bdc072c7b28ca81d0b2167ecec4cf8da9f" dependencies = [ "agave-feature-set", "rand 0.8.5", "semver", "serde", "serde_derive", - "solana-sanitize 2.2.1", - "solana-serde-varint 2.2.2", + "solana-sanitize", + "solana-serde-varint", ] [[package]] @@ -7107,28 +6237,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b80d57478d6599d30acc31cc5ae7f93ec2361a06aefe8ea79bc81739a08af4c3" dependencies = [ "bincode", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", "serde", "serde_derive", - "solana-clock 2.2.2", + "solana-clock", "solana-decode-error", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-serde-varint 2.2.2", - "solana-serialize-utils 2.2.1", - "solana-short-vec 2.2.1", - "solana-system-interface 1.0.0", + "solana-hash", + "solana-instruction", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-serde-varint", + "solana-serialize-utils", + "solana-short-vec", + "solana-system-interface", ] [[package]] name = "solana-zk-sdk" -version = "2.3.10" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbc771177d65034eaa27dd66f809ca1c52beebaa92eefd23d560c394dd006f2" +checksum = "97b9fc6ec37d16d0dccff708ed1dd6ea9ba61796700c3bb7c3b401973f10f63b" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -7139,7 +6269,7 @@ dependencies = [ "itertools 0.12.1", "js-sys", "merlin", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", "rand 0.8.5", "serde", @@ -7147,15 +6277,15 @@ dependencies = [ "serde_json", "sha3", "solana-derivation-path", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", "solana-seed-derivable", "solana-seed-phrase", "solana-signature", "solana-signer", "subtle", - "thiserror 2.0.16", + "thiserror 2.0.17", "wasm-bindgen", "zeroize", ] @@ -7170,22 +6300,10 @@ dependencies = [ "lalrpop", "lalrpop-util", "phf", - "thiserror 1.0.66", + "thiserror 1.0.69", "unicode-xid", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - [[package]] name = "spinning_top" version = "0.3.0" @@ -7195,16 +6313,6 @@ dependencies = [ "lock_api", ] -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - [[package]] name = "spl-associated-token-account" version = "6.0.0" @@ -7212,13 +6320,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76fee7d65013667032d499adc3c895e286197a35a0d3a4643c80e7fd3e9969e3" dependencies = [ "borsh 1.5.7", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", - "solana-program 2.3.0", + "solana-program", "spl-associated-token-account-client", "spl-token 7.0.0", "spl-token-2022 6.0.0", - "thiserror 1.0.66", + "thiserror 1.0.69", ] [[package]] @@ -7227,19 +6335,19 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6f8349dbcbe575f354f9a533a21f272f3eb3808a49e2fdc1c34393b88ba76cb" dependencies = [ - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", + "solana-instruction", + "solana-pubkey", ] [[package]] name = "spl-discriminator" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a20542d4c8264856d205c0090512f374dbf7b3124479a3d93ab6184ae3631aa" +checksum = "a7398da23554a31660f17718164e31d31900956054f54f52d5ec1be51cb4f4b3" dependencies = [ "bytemuck", - "solana-program-error 2.2.2", - "solana-sha256-hasher 2.3.0", + "solana-program-error", + "solana-sha256-hasher", "spl-discriminator-derive", ] @@ -7251,20 +6359,20 @@ checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" dependencies = [ "quote", "spl-discriminator-syn", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] name = "spl-discriminator-syn" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" +checksum = "5d1dbc82ab91422345b6df40a79e2b78c7bce1ebb366da323572dd60b7076b67" dependencies = [ "proc-macro2", "quote", - "sha2 0.10.8", - "syn 2.0.106", - "thiserror 1.0.66", + "sha2 0.10.9", + "syn 2.0.107", + "thiserror 1.0.69", ] [[package]] @@ -7274,7 +6382,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce0f668975d2b0536e8a8fd60e56a05c467f06021dae037f1d0cfed0de2e231d" dependencies = [ "bytemuck", - "solana-program 2.3.0", + "solana-program", "solana-zk-sdk", "spl-pod", "spl-token-confidential-transfer-proof-extraction 0.2.1", @@ -7287,17 +6395,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65edfeed09cd4231e595616aa96022214f9c9d2be02dea62c2b30d5695a6833a" dependencies = [ "bytemuck", - "solana-account-info 2.3.0", - "solana-cpi 2.2.1", - "solana-instruction 2.3.0", - "solana-msg 2.2.1", - "solana-program-entrypoint 2.3.0", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-system-interface 1.0.0", - "solana-sysvar 2.3.0", + "solana-account-info", + "solana-cpi", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-system-interface", + "solana-sysvar", "solana-zk-sdk", "spl-pod", "spl-token-confidential-transfer-proof-extraction 0.3.0", @@ -7310,7 +6418,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "741a62a566d97c58d33f9ed32337ceedd4e35109a686e31b1866c5dfa56abddc" dependencies = [ "bytemuck", - "solana-pubkey 2.4.0", + "solana-pubkey", ] [[package]] @@ -7319,12 +6427,12 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f09647c0974e33366efeb83b8e2daebb329f0420149e74d3a4bd2c08cf9f7cb" dependencies = [ - "solana-account-info 2.3.0", - "solana-instruction 2.3.0", - "solana-msg 2.2.1", - "solana-program-entrypoint 2.3.0", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-account-info", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-pubkey", ] [[package]] @@ -7336,15 +6444,15 @@ dependencies = [ "borsh 1.5.7", "bytemuck", "bytemuck_derive", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", "solana-decode-error", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-program-option 2.2.1", - "solana-pubkey 2.4.0", + "solana-msg", + "solana-program-error", + "solana-program-option", + "solana-pubkey", "solana-zk-sdk", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -7353,11 +6461,11 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d39b5186f42b2b50168029d81e58e800b690877ef0b30580d107659250da1d1" dependencies = [ - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", - "solana-program 2.3.0", + "solana-program", "spl-program-error-derive 0.4.1", - "thiserror 1.0.66", + "thiserror 1.0.69", ] [[package]] @@ -7366,13 +6474,13 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cdebc8b42553070b75aa5106f071fef2eb798c64a7ec63375da4b1f058688c6" dependencies = [ - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", "solana-decode-error", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", + "solana-msg", + "solana-program-error", "spl-program-error-derive 0.5.0", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -7383,8 +6491,8 @@ checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" dependencies = [ "proc-macro2", "quote", - "sha2 0.10.8", - "syn 2.0.106", + "sha2 0.10.9", + "syn 2.0.107", ] [[package]] @@ -7395,8 +6503,8 @@ checksum = "2a2539e259c66910d78593475540e8072f0b10f0f61d7607bbf7593899ed52d0" dependencies = [ "proc-macro2", "quote", - "sha2 0.10.8", - "syn 2.0.106", + "sha2 0.10.9", + "syn 2.0.107", ] [[package]] @@ -7406,19 +6514,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd99ff1e9ed2ab86e3fd582850d47a739fec1be9f4661cba1782d3a0f26805f3" dependencies = [ "bytemuck", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", - "solana-account-info 2.3.0", + "solana-account-info", "solana-decode-error", - "solana-instruction 2.3.0", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", "spl-discriminator", "spl-pod", "spl-program-error 0.6.0", "spl-type-length-value 0.7.0", - "thiserror 1.0.66", + "thiserror 1.0.69", ] [[package]] @@ -7428,19 +6536,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1408e961215688715d5a1063cbdcf982de225c45f99c82b4f7d7e1dd22b998d7" dependencies = [ "bytemuck", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", - "solana-account-info 2.3.0", + "solana-account-info", "solana-decode-error", - "solana-instruction 2.3.0", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", "spl-discriminator", "spl-pod", "spl-program-error 0.7.0", "spl-type-length-value 0.8.0", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -7451,11 +6559,11 @@ checksum = "ed320a6c934128d4f7e54fe00e16b8aeaecf215799d060ae14f93378da6dc834" dependencies = [ "arrayref", "bytemuck", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", "num_enum", - "solana-program 2.3.0", - "thiserror 1.0.66", + "solana-program", + "thiserror 1.0.69", ] [[package]] @@ -7466,24 +6574,24 @@ checksum = "053067c6a82c705004f91dae058b11b4780407e9ccd6799dc9e7d0fab5f242da" dependencies = [ "arrayref", "bytemuck", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", "num_enum", - "solana-account-info 2.3.0", - "solana-cpi 2.2.1", + "solana-account-info", + "solana-cpi", "solana-decode-error", - "solana-instruction 2.3.0", - "solana-msg 2.2.1", - "solana-program-entrypoint 2.3.0", - "solana-program-error 2.2.2", - "solana-program-memory 2.3.1", - "solana-program-option 2.2.1", - "solana-program-pack 2.2.1", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-sysvar 2.3.0", - "thiserror 2.0.16", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-sysvar", + "thiserror 2.0.17", ] [[package]] @@ -7494,10 +6602,10 @@ checksum = "5b27f7405010ef816587c944536b0eafbcc35206ab6ba0f2ca79f1d28e488f4f" dependencies = [ "arrayref", "bytemuck", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", "num_enum", - "solana-program 2.3.0", + "solana-program", "solana-security-txt", "solana-zk-sdk", "spl-elgamal-registry 0.1.1", @@ -7511,7 +6619,7 @@ dependencies = [ "spl-token-metadata-interface 0.6.0", "spl-transfer-hook-interface 0.9.0", "spl-type-length-value 0.7.0", - "thiserror 1.0.66", + "thiserror 1.0.69", ] [[package]] @@ -7522,27 +6630,27 @@ checksum = "31f0dfbb079eebaee55e793e92ca5f433744f4b71ee04880bfd6beefba5973e5" dependencies = [ "arrayref", "bytemuck", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", "num_enum", - "solana-account-info 2.3.0", - "solana-clock 2.2.2", - "solana-cpi 2.2.1", + "solana-account-info", + "solana-clock", + "solana-cpi", "solana-decode-error", - "solana-instruction 2.3.0", - "solana-msg 2.2.1", - "solana-native-token 2.2.2", - "solana-program-entrypoint 2.3.0", - "solana-program-error 2.2.2", - "solana-program-memory 2.3.1", - "solana-program-option 2.2.1", - "solana-program-pack 2.2.1", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", + "solana-instruction", + "solana-msg", + "solana-native-token", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", "solana-security-txt", - "solana-system-interface 1.0.0", - "solana-sysvar 2.3.0", + "solana-system-interface", + "solana-sysvar", "solana-zk-sdk", "spl-elgamal-registry 0.2.0", "spl-memo", @@ -7555,7 +6663,7 @@ dependencies = [ "spl-token-metadata-interface 0.7.0", "spl-transfer-hook-interface 0.10.0", "spl-type-length-value 0.8.0", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -7590,10 +6698,10 @@ checksum = "eff2d6a445a147c9d6dd77b8301b1e116c8299601794b558eafa409b342faf96" dependencies = [ "bytemuck", "solana-curve25519", - "solana-program 2.3.0", + "solana-program", "solana-zk-sdk", "spl-pod", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -7603,17 +6711,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe2629860ff04c17bafa9ba4bed8850a404ecac81074113e1f840dbd0ebb7bd6" dependencies = [ "bytemuck", - "solana-account-info 2.3.0", + "solana-account-info", "solana-curve25519", - "solana-instruction 2.3.0", - "solana-instructions-sysvar 2.2.2", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", + "solana-instruction", + "solana-instructions-sysvar", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "solana-sdk-ids", "solana-zk-sdk", "spl-pod", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -7624,7 +6732,7 @@ checksum = "8627184782eec1894de8ea26129c61303f1f0adeed65c20e0b10bc584f09356d" dependencies = [ "curve25519-dalek 4.1.3", "solana-zk-sdk", - "thiserror 1.0.66", + "thiserror 1.0.69", ] [[package]] @@ -7635,7 +6743,7 @@ checksum = "fa27b9174bea869a7ebf31e0be6890bce90b1a4288bc2bbf24bd413f80ae3fde" dependencies = [ "curve25519-dalek 4.1.3", "solana-zk-sdk", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -7645,16 +6753,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d595667ed72dbfed8c251708f406d7c2814a3fa6879893b323d56a10bedfc799" dependencies = [ "bytemuck", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", "solana-decode-error", - "solana-instruction 2.3.0", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", "spl-discriminator", "spl-pod", - "thiserror 1.0.66", + "thiserror 1.0.69", ] [[package]] @@ -7664,16 +6772,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5597b4cd76f85ce7cd206045b7dc22da8c25516573d42d267c8d1fd128db5129" dependencies = [ "bytemuck", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", "solana-decode-error", - "solana-instruction 2.3.0", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", "spl-discriminator", "spl-pod", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -7683,18 +6791,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfb9c89dbc877abd735f05547dcf9e6e12c00c11d6d74d8817506cab4c99fdbb" dependencies = [ "borsh 1.5.7", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", - "solana-borsh 2.2.1", + "solana-borsh", "solana-decode-error", - "solana-instruction 2.3.0", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", "spl-discriminator", "spl-pod", "spl-type-length-value 0.7.0", - "thiserror 1.0.66", + "thiserror 1.0.69", ] [[package]] @@ -7704,18 +6812,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "304d6e06f0de0c13a621464b1fd5d4b1bebf60d15ca71a44d3839958e0da16ee" dependencies = [ "borsh 1.5.7", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", - "solana-borsh 2.2.1", + "solana-borsh", "solana-decode-error", - "solana-instruction 2.3.0", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", "spl-discriminator", "spl-pod", "spl-type-length-value 0.8.0", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -7726,21 +6834,21 @@ checksum = "4aa7503d52107c33c88e845e1351565050362c2314036ddf19a36cd25137c043" dependencies = [ "arrayref", "bytemuck", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", - "solana-account-info 2.3.0", - "solana-cpi 2.2.1", + "solana-account-info", + "solana-cpi", "solana-decode-error", - "solana-instruction 2.3.0", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", "spl-discriminator", "spl-pod", "spl-program-error 0.6.0", "spl-tlv-account-resolution 0.9.0", "spl-type-length-value 0.7.0", - "thiserror 1.0.66", + "thiserror 1.0.69", ] [[package]] @@ -7751,21 +6859,21 @@ checksum = "a7e905b849b6aba63bde8c4badac944ebb6c8e6e14817029cbe1bc16829133bd" dependencies = [ "arrayref", "bytemuck", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", - "solana-account-info 2.3.0", - "solana-cpi 2.2.1", + "solana-account-info", + "solana-cpi", "solana-decode-error", - "solana-instruction 2.3.0", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", "spl-discriminator", "spl-pod", "spl-program-error 0.7.0", "spl-tlv-account-resolution 0.10.0", "spl-type-length-value 0.8.0", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -7775,15 +6883,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba70ef09b13af616a4c987797870122863cba03acc4284f226a4473b043923f9" dependencies = [ "bytemuck", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", - "solana-account-info 2.3.0", + "solana-account-info", "solana-decode-error", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", + "solana-msg", + "solana-program-error", "spl-discriminator", "spl-pod", - "thiserror 1.0.66", + "thiserror 1.0.69", ] [[package]] @@ -7793,33 +6901,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d417eb548214fa822d93f84444024b4e57c13ed6719d4dcc68eec24fb481e9f5" dependencies = [ "bytemuck", - "num-derive 0.4.0", + "num-derive 0.4.2", "num-traits", - "solana-account-info 2.3.0", + "solana-account-info", "solana-decode-error", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", + "solana-msg", + "solana-program-error", "spl-discriminator", "spl-pod", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "string_cache" -version = "0.8.7" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", - "once_cell", "parking_lot", - "phf_shared 0.10.0", + "phf_shared", "precomputed-hash", ] @@ -7854,9 +6961,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.106" +version = "2.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b" dependencies = [ "proc-macro2", "quote", @@ -7898,7 +7005,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -7908,7 +7015,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.3", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -7924,9 +7031,9 @@ dependencies = [ [[package]] name = "tar" -version = "0.4.40" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" dependencies = [ "filetime", "libc", @@ -7935,15 +7042,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.8.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ - "cfg-if", "fastrand", - "redox_syscall 0.3.5", + "getrandom 0.3.4", + "once_cell", "rustix", - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -7959,9 +7066,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] @@ -7972,54 +7079,54 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" dependencies = [ - "unicode-width 0.1.11", + "unicode-width 0.1.14", ] [[package]] name = "thiserror" -version = "1.0.66" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl 1.0.66", + "thiserror-impl 1.0.69", ] [[package]] name = "thiserror" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.16", + "thiserror-impl 2.0.17", ] [[package]] name = "thiserror-impl" -version = "1.0.66" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] name = "thiserror-impl" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] name = "time" -version = "0.3.36" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", @@ -8032,15 +7139,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -8059,7 +7166,7 @@ dependencies = [ "rand 0.7.3", "rustc-hash 1.1.0", "sha2 0.9.9", - "thiserror 1.0.66", + "thiserror 1.0.69", "unicode-normalization", "wasm-bindgen", "zeroize", @@ -8086,9 +7193,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -8101,33 +7208,30 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "slab", - "socket2 0.6.0", + "socket2 0.6.1", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -8146,7 +7250,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.32", + "rustls 0.23.33", "tokio", ] @@ -8173,7 +7277,7 @@ dependencies = [ "tokio", "tokio-rustls 0.24.1", "tungstenite", - "webpki-roots 0.25.2", + "webpki-roots 0.25.4", ] [[package]] @@ -8206,68 +7310,94 @@ checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" dependencies = [ "serde", "serde_spanned", - "toml_datetime", + "toml_datetime 0.6.11", "toml_edit 0.19.15", ] [[package]] name = "toml" -version = "0.8.2" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", - "toml_datetime", - "toml_edit 0.20.2", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_edit" version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.11.4", + "indexmap", "serde", "serde_spanned", - "toml_datetime", - "winnow", + "toml_datetime 0.6.11", + "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.20.2" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.11.4", + "indexmap", "serde", "serde_spanned", - "toml_datetime", - "winnow", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.13", ] [[package]] name = "toml_edit" -version = "0.21.0" +version = "0.23.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +dependencies = [ + "indexmap", + "toml_datetime 0.7.3", + "toml_parser", + "winnow 0.7.13", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ - "indexmap 2.11.4", - "toml_datetime", - "winnow", + "winnow 0.7.13", ] +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + [[package]] name = "tower" version = "0.5.2" @@ -8315,11 +7445,10 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ - "cfg-if", "log", "pin-project-lite", "tracing-core", @@ -8327,18 +7456,18 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", ] [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" @@ -8355,7 +7484,7 @@ dependencies = [ "rand 0.8.5", "rustls 0.21.12", "sha1", - "thiserror 1.0.66", + "thiserror 1.0.69", "url", "utf-8", "webpki-roots 0.24.0", @@ -8363,57 +7492,54 @@ dependencies = [ [[package]] name = "typenum" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-width" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "universal-hash" @@ -8431,12 +7557,6 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - [[package]] name = "untrusted" version = "0.9.0" @@ -8479,9 +7599,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "vcpkg" @@ -8497,15 +7617,15 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -8528,18 +7648,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" @@ -8573,18 +7684,19 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] @@ -8607,7 +7719,7 @@ checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -8623,9 +7735,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -8643,9 +7755,9 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4ffd8df1c57e87c325000a3d6ef93db75279dc3a231125aac571650f22b12a" +checksum = "05d651ec480de84b762e7be71e6efa7461699c19d9e2c272c8d93455f567786e" dependencies = [ "rustls-pki-types", ] @@ -8661,15 +7773,15 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.2" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8" dependencies = [ "rustls-pki-types", ] @@ -8692,11 +7804,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "winapi", + "windows-sys 0.61.2", ] [[package]] @@ -8706,19 +7818,63 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.48.0" +name = "windows-core" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-targets 0.48.5", + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", ] [[package]] name = "windows-link" -version = "0.2.0" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] [[package]] name = "windows-sys" @@ -8756,6 +7912,24 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -8795,13 +7969,30 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -8820,6 +8011,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -8838,6 +8035,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -8856,12 +8059,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -8880,6 +8095,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -8898,6 +8119,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -8916,6 +8143,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -8934,11 +8167,26 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winnow" -version = "0.5.15" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] @@ -8979,17 +8227,18 @@ dependencies = [ "nom", "oid-registry", "rusticata-macros", - "thiserror 1.0.66", + "thiserror 1.0.69", "time", ] [[package]] name = "xattr" -version = "1.0.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", + "rustix", ] [[package]] @@ -9012,28 +8261,28 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", "synstructure 0.13.2", ] [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -9053,15 +8302,15 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", "synstructure 0.13.2", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" dependencies = [ "zeroize_derive", ] @@ -9074,7 +8323,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -9107,7 +8356,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -9121,18 +8370,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.2.1" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", diff --git a/ts/packages/anchor/src/program/namespace/methods.ts b/ts/packages/anchor/src/program/namespace/methods.ts index f99ac3a2dd..0b82544f09 100644 --- a/ts/packages/anchor/src/program/namespace/methods.ts +++ b/ts/packages/anchor/src/program/namespace/methods.ts @@ -66,6 +66,190 @@ export type MethodsNamespace< I extends AllInstructions = AllInstructions > = MakeMethodsNamespace; +/** + * Light Protocol compression metadata extracted from IDL + */ +interface LightCompressibleMetadata { + compressibleAccounts: Map< + string, + { + accountType: "pda" | "token"; + seeds: Array<{ type: "const" | "account"; value: string }>; + } + >; +} + +/** + * Extract Light Protocol compression metadata from IDL enums. + * + * Parses CTokenAccountVariant and CompressedAccountVariant enums to determine: + * - Which accounts are compressible + * - Whether they're PDAs or tokens + * - What their seed dependencies are + */ +function extractLightMetadata(idl: Idl): LightCompressibleMetadata | null { + const compressibleAccounts = new Map< + string, + { + accountType: "pda" | "token"; + seeds: Array<{ type: "const" | "account"; value: string }>; + } + >(); + + if (!idl.types) return null; + + const findAccountDef = (accounts: readonly any[], name: string): any => { + for (const acc of accounts) { + if ("accounts" in acc) { + const found = findAccountDef(acc.accounts, name); + if (found) return found; + } else if (acc.name === name) { + return acc; + } + } + return null; + }; + + const extractPdaSeeds = ( + accountName: string + ): Array<{ type: "const" | "account"; value: string }> => { + for (const ix of idl.instructions) { + const accountDef = findAccountDef(ix.accounts, accountName); + if (accountDef && accountDef.pda && accountDef.pda.seeds) { + const seeds: Array<{ type: "const" | "account"; value: string }> = []; + + // Check for cross-program PDA (unsupported) + if (accountDef.pda.program) { + throw new Error( + `[decompressIfNeeded] Account '${accountName}' uses cross-program PDA derivation (seeds::program), which is not supported for auto-resolution.\n\n` + + `Solution: Provide all accounts explicitly: .decompressIfNeeded({ ${accountName}:
, ... })` + ); + } + + for (const seed of accountDef.pda.seeds) { + if (seed.kind === "const" && seed.value) { + // Convert byte array to UTF-8 string + const constValue = Buffer.from(seed.value).toString("utf8"); + seeds.push({ type: "const", value: constValue }); + } else if (seed.kind === "arg") { + // Instruction arguments are runtime values, not resolvable accounts + throw new Error( + `[decompressIfNeeded] Account '${accountName}' depends on instruction argument '${seed.path}', which cannot be auto-resolved.\n\n` + + `Instruction arguments are runtime values you must provide.\n\n` + + `Solutions:\n` + + ` 1. Provide the resolved account explicitly: .decompressIfNeeded({ ${accountName}: , ... })\n` + + ` 2. If auto-decompression isn't needed for this instruction, remove '${accountName}' from decompressIfNeeded()\n` + + ` 3. Build the transaction manually without decompressIfNeeded()` + ); + } else if (seed.kind === "account") { + // For account seeds, check if it's a field reference (path contains ".") + // e.g., "pool_state.lp_mint" means: read lpMint field from poolState account + if (seed.path && seed.path.includes(".")) { + // Field reference: "account.field" + // The field name (after the dot) is what we need as the seed account + const parts = seed.path.split("."); + if (parts.length >= 2) { + // Convert to camelCase: "lp_mint" -> "lpMint" + const fieldName = parts[parts.length - 1].replace( + /_([a-z0-9])/g, + (_, letter) => letter.toUpperCase() + ); + seeds.push({ type: "account", value: fieldName }); + } + } else { + // Direct account reference (no field) + const accountRef = seed.account || seed.path; + if (accountRef) { + const baseName = accountRef.split(".")[0].split("(")[0]; + seeds.push({ type: "account", value: baseName }); + } + } + } + } + return seeds; + } + } + return []; + }; + + // c-token accounts + const ctokenVariant = idl.types.find( + (t) => t.name === "cTokenAccountVariant" + ); + if (ctokenVariant && "variants" in ctokenVariant.type) { + for (const variant of ctokenVariant.type.variants) { + const variantName = variant.name; // Keep camelCase from IDL + + const seeds = extractPdaSeeds(variantName); + + compressibleAccounts.set(variantName, { + accountType: "token", + seeds, + }); + } + } + + // compressed PDA accounts + // Dedupe "packed*" variants (e.g., packedPoolState is same as poolState) + const compressedVariant = idl.types.find( + (t) => t.name === "compressedAccountVariant" + ); + if (compressedVariant && "variants" in compressedVariant.type) { + const seenBaseNames = new Set(); + + for (const variant of compressedVariant.type.variants) { + const variantName = variant.name; // Keep camelCase from IDL + + // Skip wrapper types that contain token variants + if ( + variantName.toLowerCase().includes("ctokendata") || + variantName.toLowerCase().includes("tokendata") + ) { + continue; + } + + // Dedupe packed variants (e.g., packedPoolState -> poolState) + let baseName = variantName; + const isPacked = variantName.startsWith("packed"); + if (isPacked) { + // Remove 'packed' prefix and lowercase first letter: packedPoolState -> poolState + baseName = variantName.replace(/^packed/, ""); + baseName = baseName.charAt(0).toLowerCase() + baseName.slice(1); + if (seenBaseNames.has(baseName)) { + continue; + } + } + + let seeds = extractPdaSeeds(variantName); + if (seeds.length === 0 && isPacked) { + // Try unpacked version for seeds + const unpackedVariantName = variantName.replace(/^packed/, ""); + seeds = extractPdaSeeds(unpackedVariantName); + } + + seenBaseNames.add(baseName); + compressibleAccounts.set(baseName, { + accountType: "pda", + seeds, + }); + } + } + + if (compressibleAccounts.size === 0) return null; + + console.log( + `[Light] Extracted metadata for ${compressibleAccounts.size} compressible account(s):` + ); + compressibleAccounts.forEach((meta, name) => { + const seedsStr = meta.seeds + .map((s) => (s.type === "const" ? `"${s.value}"` : s.value)) + .join(", "); + console.log(` - ${name}: type=${meta.accountType}, seeds=[${seedsStr}]`); + }); + + return { compressibleAccounts }; +} + export class MethodsBuilderFactory { public static build>( provider: Provider, @@ -220,6 +404,7 @@ export class MethodsBuilder< private _allInstructionFns?: Record>; private _programId: PublicKey; private _accountNamespace: AccountNamespace; + private _lightMetadata?: LightCompressibleMetadata | null; constructor( private _args: Array, @@ -253,6 +438,16 @@ export class MethodsBuilder< idlTypes, customResolver ); + + // Extract Light Protocol compression metadata from IDL if available + if (idl) { + console.log("Extracting Light Protocol compression metadata from IDL"); + this._lightMetadata = extractLightMetadata(idl); + console.log( + "Light Protocol compression metadata extracted..", + this._lightMetadata + ); + } } public args(args: Array): void { @@ -359,48 +554,53 @@ export class MethodsBuilder< } /** - * Enable automatic decompression for compressible accounts. + * Enable automatic decompression for compressible accounts via IDL. * - * System accounts (feePayer, config, etc.) are REQUIRED. - * Seed accounts (lpMint, ammConfig, etc.) are OPTIONAL - only provide them - * if their dependent compressible accounts are being decompressed. + * Resolution priority for each account: + * 1. Explicitly provided in decompressIfNeeded() call + * 2. Auto-pulled from main instruction (same name) + * 3. Auto-resolved constants (ctokenProgram, ctokenCpiAuthority, config, + * etc.) + * 4. Error if required but not found * - * Automatically infers account types and variants from IDL, fetches compression state, - * and injects decompress instruction if needed. - * - * @param accounts - Accounts for decompressAccountsIdempotent instruction. - * System accounts required, seed accounts optional. - * @returns this builder for chaining + * @param accounts Partial accounts for decompressAccountsIdempotent + * @returns MethodsBuilder for chaining * * @example * ```ts + * // Auto-resolve everything (feePayer from provider.wallet) + * await program.methods + * .swap(amount) + * .decompressIfNeeded() + * .accounts({ ... }) + * .rpc(); + * + * // Minimal - provide only what can't be auto-resolved * await program.methods * .swap(amount) * .decompressIfNeeded({ - * // System accounts (required) * feePayer: owner.publicKey, - * config: compressionConfig, * rentPayer: owner.publicKey, - * ctokenRentSponsor: CTOKEN_RENT_SPONSOR, - * ctokenProgram: CompressedTokenProgram.programId, - * ctokenCpiAuthority: CompressedTokenProgram.deriveCpiAuthorityPda, - * ctokenConfig, - * // Seed accounts (optional - only provide what's needed) - * ammConfig, // Only if poolState is compressed - * token0Mint, // Only if token0Vault is compressed - * token1Mint, // Only if token1Vault is compressed - * // lpMint: omitted because lpVault not being decompressed - * // Compressible accounts - * poolState, - * token0Vault, - * token1Vault, + * }) + * .accounts({ ... }) + * .rpc(); + * + * // Explicit - override specific accounts + * await program.methods + * .swap(amount) + * .decompressIfNeeded({ + * feePayer: owner.publicKey, + * rentPayer: owner.publicKey, + * ammConfig: configAddress, + * token0Mint: inputToken, + * token1Mint: outputToken, * }) * .accounts({ ... }) * .rpc(); * ``` */ public decompressIfNeeded( - accounts: Partial> & { [name: string]: Address } + accounts: Partial> & { [name: string]: Address } = {} ) { this._enableAutoDecompress = true; this._decompressAccounts = flattenPartialAccounts(accounts as any, false); @@ -440,10 +640,18 @@ export class MethodsBuilder< const defaultAddressTreeInfo = getDefaultAddressTreeInfo(); - const accountInputs: AccountInput[] = []; + console.log( + `[decompressIfNeeded] Fetching compression state for ${accountsToCheck.length} account(s)...` + ); + + // Prepare an array of concurrent fetch promises + const fetchPromises = accountsToCheck.map(async ({ name, address }) => { + console.log( + `[decompressIfNeeded] → Checking '${name}' (${address.toBase58()})...` + ); + + // name is already camelCase from IDL metadata - // Check each provided account to see if it's actually compressed - for (const { name, address } of accountsToCheck) { try { // Try fetching as CPDA first // @ts-ignore @@ -455,6 +663,9 @@ export class MethodsBuilder< ); if (cpdaResult && cpdaResult.merkleContext && cpdaResult.isCompressed) { + console.log( + `[decompressIfNeeded] ✓ Account '${name}' is COMPRESSED` + ); // It's a compressed account if ( cpdaResult.accountInfo.owner.equals( @@ -465,7 +676,7 @@ export class MethodsBuilder< try { const parsed = parseTokenData(cpdaResult.accountInfo.data); if (parsed) { - accountInputs.push({ + return { address, info: { accountInfo: cpdaResult.accountInfo, @@ -474,7 +685,7 @@ export class MethodsBuilder< }, accountType: "cTokenData", tokenVariant: name, - }); + } as AccountInput; } } catch { // Not a token account, ignore @@ -482,35 +693,59 @@ export class MethodsBuilder< } else { // It's a compressed program account let parsed = null; + + // Use camelCase name for account client lookup const accountClient = (this._accountNamespace as any)[name]; + + console.log( + `[decompressIfNeeded] → Trying to parse '${name}' using account client '${name}'` + ); + if (accountClient?.coder) { try { parsed = accountClient.coder.accounts.decode( name, cpdaResult.accountInfo.data ); + console.log( + `[decompressIfNeeded] ✓ Parsed successfully using decode()` + ); } catch { try { parsed = accountClient.coder.accounts.decodeAny( cpdaResult.accountInfo.data ); - } catch { - // Parsing failed, use null + console.log( + `[decompressIfNeeded] ✓ Parsed successfully using decodeAny()` + ); + } catch (e) { + console.log( + `[decompressIfNeeded] ✗ Parsing failed: ${ + (e as Error).message + }` + ); } } + } else { + console.log( + `[decompressIfNeeded] ✗ No account client found for '${name}'` + ); } - accountInputs.push({ + return { address, info: { accountInfo: cpdaResult.accountInfo, parsed, merkleContext: cpdaResult.merkleContext, }, - accountType: name, // cpda accountType equals the IDL account name - }); + accountType: name, + } as AccountInput; } } else { + console.log( + `[decompressIfNeeded] ✗ Not compressed via getAccountInfoInterface, trying token fallback...` + ); // Try as compressed token via getAccountInterface as fallback try { const tokenRes = await getAccountInterface( @@ -520,21 +755,50 @@ export class MethodsBuilder< CompressedTokenProgram.programId ); if (tokenRes && (tokenRes as any).merkleContext) { - accountInputs.push({ + console.log( + `[decompressIfNeeded] ✓ Found via token fallback - COMPRESSED token` + ); + return { address, info: tokenRes as any, accountType: "cTokenData", tokenVariant: name, - }); + } as AccountInput; + } else { + console.log( + `[decompressIfNeeded] ✗ Account '${name}' is NOT compressed (no merkleContext)` + ); } - } catch { - // Not a compressed account + } catch (err) { + console.log( + `[decompressIfNeeded] ✗ Token fallback failed: ${ + (err as Error).message + }` + ); } } - } catch { - // Account doesn't exist or can't be fetched, skip + } catch (err) { + console.log( + `[decompressIfNeeded] ✗ Error fetching '${name}': ${ + (err as Error).message + }` + ); } - } + // Return undefined if no compressed account found + return undefined; + }); + + // Run all fetchers concurrently + const results = await Promise.allSettled(fetchPromises); + + // Collect all successful AccountInput results (move .value up to array) + const accountInputs: AccountInput[] = []; + results.forEach((result, idx) => { + if (result.status === "fulfilled" && result.value) { + accountInputs.push(result.value as AccountInput); + } + // (rejected results already logged above inside each promise's catch) + }); console.log( `[decompressIfNeeded] Found ${accountInputs.length} compressed account(s):` @@ -559,10 +823,6 @@ export class MethodsBuilder< try { const pubkey = translateAddress(this._accounts[accountName] as Address); if (!pubkey.equals(programId)) { - console.log( - `[decompressIfNeeded] Using '${accountName}' from main instruction:`, - pubkey.toBase58() - ); return pubkey; } } catch { @@ -572,130 +832,6 @@ export class MethodsBuilder< return null; } - /** - * Extract required seed accounts based on what's actually being decompressed - */ - private _extractRequiredSeeds(accountInputs: AccountInput[]): Set { - const requiredSeeds = new Set(); - - // Helper to extract seed account names from IDL PDA definition - const extractSeedsFromIdl = (accountName: string): string[] => { - if (!this._idl) return []; - - const findAccount = (accounts: readonly any[], name: string): any => { - for (const acc of accounts) { - if ("accounts" in acc) { - const found = findAccount(acc.accounts, name); - if (found) return found; - } else if (acc.name === accountName) { - return acc; - } - } - return null; - }; - - // Search all instructions for PDA definition - for (const ix of this._idl.instructions) { - const accountDef = findAccount(ix.accounts, accountName); - if (accountDef && accountDef.pda && accountDef.pda.seeds) { - const seeds: string[] = []; - for (const seed of accountDef.pda.seeds) { - if (seed.kind === "account" && seed.path) { - const baseName = seed.path.split(".")[0].split("(")[0]; - seeds.push(baseName); - } - } - return seeds; - } - } - return []; - }; - - // Analyze each account being decompressed - for (const input of accountInputs) { - const accountName = input.tokenVariant || (input.accountType as string); - - // Extract seeds from IDL for this account - const seeds = extractSeedsFromIdl(accountName); - for (const seed of seeds) { - requiredSeeds.add(seed); - console.log( - `[decompressIfNeeded] Account '${accountName}' requires seed: '${seed}' (from IDL)` - ); - } - } - - return requiredSeeds; - } - - /** - * Get compressible account names from main instruction's IDL definition - */ - private _getMainInstructionCompressibleAccounts(): Set { - const compressible = new Set(); - if (!this._idl) return compressible; - - // Find the main instruction in IDL - const mainIx = this._idl.instructions.find( - (ix: any) => ix.name === (this._idlIx as any).name - ); - if (!mainIx) return compressible; - - // Recursively scan all accounts - const visitAccounts = (items: readonly any[]) => { - for (const item of items) { - if ("accounts" in item) { - visitAccounts(item.accounts); - continue; - } - // Check the compressible field - if (item.compressible === true) { - compressible.add(item.name); - } - } - }; - - visitAccounts(mainIx.accounts); - return compressible; - } - - /** - * Auto-pull accounts from main instruction for matching names - */ - private _autoPullFromMainInstruction(): void { - if (!this._decompressAccounts) return; - - const programId = this._programId; - - // Helper to check if an account is missing or set to program ID (placeholder) - const isAccountMissing = (name: string): boolean => { - if (!this._decompressAccounts || !(name in this._decompressAccounts)) - return true; - try { - const pubkey = translateAddress( - this._decompressAccounts![name] as Address - ); - return pubkey.equals(programId); - } catch { - return true; - } - }; - - // Try to pull each missing account from main instruction - for (const accountName in this._decompressAccounts) { - if (isAccountMissing(accountName)) { - const fromMain = this._getFromMainInstruction(accountName); - if (fromMain) { - console.log( - `[decompressIfNeeded] Auto-pulling '${accountName}' from main instruction:`, - fromMain.toBase58() - ); - this._decompressAccounts[accountName] = fromMain; - } - } - } - } - /** * Auto-resolve constant and default accounts for decompressAccountsIdempotent. * Priority: 1) User explicit values in decompressIfNeeded, 2) Main instruction accounts, 3) Auto-resolved defaults @@ -782,6 +918,84 @@ export class MethodsBuilder< } } + // Auto-resolve feePayer with strict precedence order + if (isAccountMissing("feePayer")) { + let feePayer: PublicKey | null = null; + + // Priority 1: Check main instruction (in case user explicitly passed it there) + const fromMain = this._getFromMainInstruction("feePayer"); + if (fromMain) { + feePayer = fromMain; + console.log( + "[decompressIfNeeded] Using feePayer from main instruction:", + feePayer.toBase58() + ); + } + // Priority 2: Try payer + const fromPayer = this._getFromMainInstruction("payer"); + if (fromPayer) { + feePayer = fromPayer; + console.log( + "[decompressIfNeeded] Using payer as feePayer from main instruction:", + feePayer.toBase58() + ); + } + // Priority 3: Use provider wallet + else { + try { + const provider = (this._accountsResolver as any)["_provider"]; + const walletPubkey = provider?.wallet?.publicKey; + if (walletPubkey) { + feePayer = walletPubkey; + console.log( + "[decompressIfNeeded] Using provider wallet as feePayer (transaction signer):", + walletPubkey.toBase58() + ); + } + } catch { + // Provider not available or doesn't have wallet + } + } + + // Priority 3: Error - cannot proceed without feePayer + // Note: We do NOT fallback to "first instruction signer" because: + // - Transaction feePayer ≠ Instruction signers + // - First signer might be multisig authority, not the actual fee payer + // - This would cause subtle bugs and is not robust + if (!feePayer) { + throw new Error( + `[decompressIfNeeded] Unable to determine feePayer for decompression.\n\n` + + `The feePayer pays transaction fees and must match the transaction signer.\n\n` + + `Solutions:\n` + + ` 1. Provide explicitly: .decompressIfNeeded({ feePayer: , ... })\n` + + ` 2. Ensure your provider has a wallet set (standard Anchor requirement)\n\n` + + `Note: The feePayer must be the transaction signer (provider.wallet), not just any instruction signer.` + ); + } + + this._decompressAccounts.feePayer = feePayer; + } + + // Auto-resolve rentPayer (defaults to feePayer if not provided) + if (isAccountMissing("rentPayer")) { + // First check if feePayer was resolved + const feePayer = this._decompressAccounts.feePayer + ? translateAddress(this._decompressAccounts.feePayer as Address) + : null; + + if (feePayer) { + console.log( + "[decompressIfNeeded] Defaulting rentPayer to feePayer:", + feePayer.toBase58() + ); + this._decompressAccounts.rentPayer = feePayer; + } else { + throw new Error( + `[decompressIfNeeded] Unable to determine rentPayer (feePayer must be resolved first)` + ); + } + } + // Auto-resolve ctokenRentSponsor (check main instruction first, then fallback to feePayer) if (isAccountMissing("ctokenRentSponsor")) { const fromMain = this._getFromMainInstruction("ctokenRentSponsor"); @@ -815,6 +1029,9 @@ export class MethodsBuilder< /** * Internal method to inject decompress instruction if needed. + * + * Uses _lightMetadata (extracted from IDL enums) as canonical reference for all compressible accounts. + * Auto-resolves accounts by matching seed dependencies against main instruction accounts. */ private async _injectDecompressIfNeeded(): Promise { if (!this._enableAutoDecompress || !this._decompressAccounts) return; @@ -826,6 +1043,16 @@ export class MethodsBuilder< return; } + if ( + !this._lightMetadata || + this._lightMetadata.compressibleAccounts.size === 0 + ) { + console.log( + "[decompressIfNeeded] No compressible accounts metadata found in IDL. Skipping decompress." + ); + return; + } + const decompressInstruction = this._idl.instructions.find( (ix: any) => ix.name === "decompressAccountsIdempotent" ); @@ -838,9 +1065,14 @@ export class MethodsBuilder< } console.log("[decompressIfNeeded] Starting auto-decompression..."); + console.log( + `[decompressIfNeeded] Using Light metadata with ${this._lightMetadata.compressibleAccounts.size} compressible account(s) as canonical reference` + ); + + const programId = this._programId; - // Known non-compressible system accounts to skip - const SKIP_ACCOUNTS = new Set([ + // System accounts that are infrastructure (not compressible) + const SYSTEM_ACCOUNTS = new Set([ "feePayer", "config", "rentPayer", @@ -852,61 +1084,619 @@ export class MethodsBuilder< "ctokenCompressionAuthority", ]); - // Collect potentially compressible accounts - // Only check accounts that were explicitly provided (not set to programId placeholder) - const accountsToCheck: Array<{ name: string; address: PublicKey }> = []; + // Step 1: Auto-resolve constants and defaults for system accounts + this._autoResolveDecompressAccounts(); - for (const [name, addr] of Object.entries(this._decompressAccounts)) { - if (SKIP_ACCOUNTS.has(name)) continue; + // Step 2: Use Light metadata to resolve ALL compressible accounts + const completeAccounts: Record = {}; + const compressibleAccountsToCheck: Array<{ + name: string; + address: PublicKey; + }> = []; + const resolvedAddresses = new Set(); // Track which addresses have been claimed - try { - const pubkey = translateAddress(addr as Address); + // First, resolve all compressible accounts from Light metadata + console.log( + `[decompressIfNeeded] Main instruction accounts available: [${ + this._accounts ? Object.keys(this._accounts).join(", ") : "none" + }]` + ); - // Skip accounts set to programId - these are explicitly marked as "None/not needed" - if (pubkey.equals(this._programId)) { + for (const [ + accountName, + metadata, + ] of this._lightMetadata.compressibleAccounts.entries()) { + console.log( + `\n[decompressIfNeeded] ===== Resolving '${accountName}' (${metadata.accountType}) =====` + ); + let resolved: PublicKey | null = null; + + // Priority 1: Check if explicitly provided in decompressIfNeeded() + if (accountName in this._decompressAccounts) { + try { + const provided = translateAddress( + this._decompressAccounts[accountName] as Address + ); + if (!provided.equals(programId)) { + resolved = provided; + console.log( + `[decompressIfNeeded] ✓ P1 Explicit: ${provided.toBase58()}` + ); + } + } catch { + console.log(`[decompressIfNeeded] ✗ P1 Explicit: invalid address`); + } + } else { + console.log(`[decompressIfNeeded] ✗ P1 Explicit: not provided`); + } + + // Priority 2: Try name match from main instruction + if (!resolved) { + const fromMain = this._getFromMainInstruction(accountName); + if (fromMain) { console.log( - `[decompressIfNeeded] Skipping account '${name}' (set to programId = None)` + `[decompressIfNeeded] ✓ P2 Name match: found in main instruction as '${accountName}' → ${fromMain.toBase58()}` + ); + resolved = fromMain; + } else { + console.log( + `[decompressIfNeeded] ✗ P2 Name match: '${accountName}' not in main instruction` ); - continue; } + } - // All provided non-system, non-placeholder accounts should be checked - accountsToCheck.push({ name, address: pubkey }); - } catch { - console.warn( - `[decompressIfNeeded] Invalid address for ${name}, skipping` + // Priority 3: Use seed-based resolution with Light metadata + if (!resolved && metadata.seeds.length > 0) { + const seedsStr = metadata.seeds + .map((s) => (s.type === "const" ? `"${s.value}"` : s.value)) + .join(", "); + console.log( + `[decompressIfNeeded] → P3 Seed-based: trying seeds [${seedsStr}]` + ); + + const resolveResult = this._resolveCompressibleAccountFromMetadata( + accountName, + metadata + ); + + if (resolveResult.found) { + resolved = resolveResult.address!; + console.log( + `[decompressIfNeeded] ✓ P3 Seed-based: resolved → ${resolved.toBase58()}` + ); + + // Store resolved seed accounts in completeAccounts + for (const [seedName, seedValue] of Object.entries( + resolveResult.seeds || {} + )) { + if (!(seedName in completeAccounts)) { + completeAccounts[seedName] = seedValue; + console.log( + `[decompressIfNeeded] └─ seed '${seedName}' → ${seedValue.toBase58()}` + ); + } + } + } else { + console.log( + `[decompressIfNeeded] ✗ P3 Seed-based: failed (seeds not found or derivation failed)` + ); + } + } else if (!resolved && metadata.seeds.length === 0) { + console.log( + `[decompressIfNeeded] ✗ P3 Seed-based: no seeds defined for this account` ); } - } - // Validate: All compressible accounts used by main instruction must be provided - const mainIxCompressible = this._getMainInstructionCompressibleAccounts(); - const providedCompressible = new Set(accountsToCheck.map((a) => a.name)); - const missing: string[] = []; + // Priority 4: Try brute-force matching by trying all combinations of accounts as seeds + if (!resolved && this._accounts) { + const numMainAccounts = Object.keys(this._accounts).length; + console.log( + `[decompressIfNeeded] → P4 Brute-force: trying all combinations with ${numMainAccounts} main account(s)...` + ); + + const mainAccountEntries = Object.entries(this._accounts); + + if (metadata.accountType === "token" && metadata.seeds.length > 0) { + // For token accounts with seeds, try to derive using seed combinations + console.log( + `[decompressIfNeeded] ├─ Token account with ${metadata.seeds.length} seed(s): trying seed combinations...` + ); + + const accountSeeds = metadata.seeds.filter( + (s) => s.type === "account" + ); + const expectedSeedCount = accountSeeds.length; + const seedsStr = metadata.seeds + .map((s) => (s.type === "const" ? `"${s.value}"` : s.value)) + .join(", "); + console.log( + `[decompressIfNeeded] │ Need ${expectedSeedCount} account seed(s): [${seedsStr}]` + ); + + // Try all combinations of accounts as potential seeds + const tryDerivation = ( + seedIndices: number[] + ): { + address: PublicKey; + seedMappings: Record; + } | null => { + // Build seed buffers including const seeds in correct order + const seedBuffers: Buffer[] = []; + const seedMappings: Record = {}; + let accountSeedIdx = 0; + + for (const seed of metadata.seeds) { + if (seed.type === "const") { + seedBuffers.push(Buffer.from(seed.value, "utf8")); + } else { + // Account seed - get from the combination + if (accountSeedIdx >= seedIndices.length) return null; + try { + const pk = translateAddress( + mainAccountEntries[ + seedIndices[accountSeedIdx] + ][1] as Address + ); + if (pk.equals(programId)) return null; + seedBuffers.push(pk.toBuffer()); + // Track which seed name maps to which account + seedMappings[seed.value] = pk; + } catch { + return null; + } + accountSeedIdx++; + } + } + + try { + const [derivedPda] = PublicKey.findProgramAddressSync( + seedBuffers, + programId + ); + + // Check if this derived PDA matches any main instruction account + // Skip if this address has already been claimed by another compressible account + if (resolvedAddresses.has(derivedPda.toBase58())) { + return null; // Already used, skip this combination + } + + for (const [mainAccName, mainAccValue] of mainAccountEntries) { + try { + const mainPubkey = translateAddress(mainAccValue as Address); + if (derivedPda.equals(mainPubkey)) { + const seedNames = seedIndices.map( + (i) => mainAccountEntries[i][0] + ); + console.log( + `[decompressIfNeeded] │ → Derived token with seeds [${seedNames.join( + ", " + )}] → ${derivedPda.toBase58()}` + ); + return { address: derivedPda, seedMappings }; + } + } catch {} + } + } catch {} + return null; + }; + + // Generate combinations + const generateCombinations = ( + arr: number[], + k: number + ): number[][] => { + if (k === 0) return [[]]; + if (arr.length === 0) return []; + const [first, ...rest] = arr; + const withFirst = generateCombinations(rest, k - 1).map((c) => [ + first, + ...c, + ]); + const withoutFirst = generateCombinations(rest, k); + return [...withFirst, ...withoutFirst]; + }; + + const accountIndices = Array.from( + { length: mainAccountEntries.length }, + (_, i) => i + ); + const combinations = generateCombinations( + accountIndices, + expectedSeedCount + ); + + console.log( + `[decompressIfNeeded] │ Trying ${combinations.length} token seed combinations...` + ); + + for (const combo of combinations) { + const result = tryDerivation(combo); + if (result) { + resolved = result.address; + resolvedAddresses.add(result.address.toBase58()); + + // Store the seed mappings in completeAccounts + for (const [seedName, seedValue] of Object.entries( + result.seedMappings + )) { + if (!(seedName in completeAccounts)) { + completeAccounts[seedName] = seedValue; + console.log( + `[decompressIfNeeded] │ → Collected seed: '${seedName}' = ${seedValue.toBase58()}` + ); + } + } + + console.log( + `[decompressIfNeeded] └─ ✓ P4 Brute-force: found match for token '${accountName}'` + ); + break; + } + } + } else if ( + metadata.accountType === "pda" && + metadata.seeds.length > 0 + ) { + // For PDA accounts, try all seed combinations + console.log( + `[decompressIfNeeded] ├─ PDA account: trying seed combinations...` + ); + + const accountSeeds = metadata.seeds.filter( + (s) => s.type === "account" + ); + const expectedSeedCount = accountSeeds.length; + const seedsStr = metadata.seeds + .map((s) => (s.type === "const" ? `"${s.value}"` : s.value)) + .join(", "); + console.log( + `[decompressIfNeeded] │ Need ${expectedSeedCount} account seed(s): [${seedsStr}]` + ); + + // Try all permutations of accounts as potential seeds + const tryDerivation = ( + seedIndices: number[] + ): { + address: PublicKey; + seedMappings: Record; + } | null => { + // Build seed buffers including const seeds in correct order + const seedBuffers: Buffer[] = []; + const seedMappings: Record = {}; + let accountSeedIdx = 0; + + for (const seed of metadata.seeds) { + if (seed.type === "const") { + seedBuffers.push(Buffer.from(seed.value, "utf8")); + } else { + // Account seed - get from the combination + if (accountSeedIdx >= seedIndices.length) return null; + try { + const pk = translateAddress( + mainAccountEntries[ + seedIndices[accountSeedIdx] + ][1] as Address + ); + if (pk.equals(programId)) return null; + seedBuffers.push(pk.toBuffer()); + // Track which seed name maps to which account + seedMappings[seed.value] = pk; + } catch { + return null; + } + accountSeedIdx++; + } + } + + try { + const [derivedPda] = PublicKey.findProgramAddressSync( + seedBuffers, + programId + ); + + // Check if this derived PDA matches any main instruction account + // Skip if this address has already been claimed by another compressible account + if (resolvedAddresses.has(derivedPda.toBase58())) { + return null; // Already used, skip this combination + } + + for (const [mainAccName, mainAccValue] of mainAccountEntries) { + try { + const mainPubkey = translateAddress(mainAccValue as Address); + if (derivedPda.equals(mainPubkey)) { + const seedNames = seedIndices.map( + (i) => mainAccountEntries[i][0] + ); + console.log( + `[decompressIfNeeded] │ → Derived PDA with seeds [${seedNames.join( + ", " + )}] → ${derivedPda.toBase58()}` + ); + return { address: derivedPda, seedMappings }; + } + } catch {} + } + } catch {} + return null; + }; + + // Generate combinations of seed indices + const generateCombinations = ( + arr: number[], + k: number + ): number[][] => { + if (k === 0) return [[]]; + if (arr.length === 0) return []; + const [first, ...rest] = arr; + const withFirst = generateCombinations(rest, k - 1).map((c) => [ + first, + ...c, + ]); + const withoutFirst = generateCombinations(rest, k); + return [...withFirst, ...withoutFirst]; + }; + + const accountIndices = Array.from( + { length: mainAccountEntries.length }, + (_, i) => i + ); + const combinations = generateCombinations( + accountIndices, + expectedSeedCount + ); + + console.log( + `[decompressIfNeeded] │ Trying ${combinations.length} PDA seed combinations...` + ); + + for (const combo of combinations) { + const result = tryDerivation(combo); + if (result) { + resolved = result.address; + resolvedAddresses.add(result.address.toBase58()); + + // Store the seed mappings in completeAccounts + for (const [seedName, seedValue] of Object.entries( + result.seedMappings + )) { + if (!(seedName in completeAccounts)) { + completeAccounts[seedName] = seedValue; + console.log( + `[decompressIfNeeded] │ → Collected seed: '${seedName}' = ${seedValue.toBase58()}` + ); + } + } + + console.log( + `[decompressIfNeeded] └─ ✓ P4 Brute-force: found match for PDA '${accountName}'` + ); + break; + } + } + } else { + // No seeds defined - try generic name-based fuzzy matching + console.log( + `[decompressIfNeeded] ├─ No seeds - trying fuzzy name matching...` + ); - for (const accountName of Array.from(mainIxCompressible)) { - const inMain = this._getFromMainInstruction(accountName); - if (inMain && !providedCompressible.has(accountName)) { - // Main instruction uses this compressible account, but not checked for decompression - missing.push(accountName); + // Extract the core name parts for matching (e.g., "pool" from "pool_state", "observation" from "observation_state") + const accountNameParts = accountName + .split("_") + .filter((p) => p.length > 2); + + for (const [mainAccName, mainAccValue] of mainAccountEntries) { + try { + const mainPubkey = translateAddress(mainAccValue as Address); + if (mainPubkey.equals(programId)) continue; + + const mainSnakeName = mainAccName + .replace(/([A-Z])/g, "_$1") + .toLowerCase() + .replace(/^_/, ""); + + // Check exact match + if (mainSnakeName === accountName) { + resolved = mainPubkey; + console.log( + `[decompressIfNeeded] └─ ✓ P4 Exact name match: '${accountName}' → '${mainAccName}' → ${mainPubkey.toBase58()}` + ); + break; + } + + // Check if main account name contains core parts of the compressible account name + const matchScore = accountNameParts.filter((part) => + mainSnakeName.includes(part) + ).length; + + if ( + matchScore > 0 && + matchScore / accountNameParts.length >= 0.5 + ) { + resolved = mainPubkey; + console.log( + `[decompressIfNeeded] └─ ✓ P4 Fuzzy name match: '${accountName}' → '${mainAccName}' (${matchScore}/${ + accountNameParts.length + } parts) → ${mainPubkey.toBase58()}` + ); + break; + } + } catch {} + } + } + + if (!resolved) { + console.log( + `[decompressIfNeeded] └─ ✗ P4 Brute-force: no match found` + ); + } + } + + if (resolved) { + completeAccounts[accountName] = resolved; + compressibleAccountsToCheck.push({ + name: accountName, + address: resolved, + }); + resolvedAddresses.add(resolved.toBase58()); // Mark this address as claimed + console.log( + `[decompressIfNeeded] ✓✓ RESOLVED '${accountName}' → ${resolved.toBase58()}` + ); + + // IMPORTANT: Now collect the seeds for this account (if any) + // Seeds are required accounts in the decompress instruction + if (metadata.seeds.length > 0) { + console.log( + `[decompressIfNeeded] → Collecting seeds for '${accountName}'...` + ); + for (const seed of metadata.seeds) { + if (seed.type === "account") { + const seedName = seed.value; + + // Skip if we already collected this seed + if (seedName in completeAccounts) { + console.log( + `[decompressIfNeeded] │ ✓ seed '${seedName}': already collected` + ); + continue; + } + + let seedValue: PublicKey | null = null; + + // Try to resolve the seed account + // 1. Check if explicitly provided + if ( + this._decompressAccounts && + seedName in this._decompressAccounts + ) { + try { + const provided = translateAddress( + this._decompressAccounts[seedName] as Address + ); + if (!provided.equals(programId)) { + seedValue = provided; + console.log( + `[decompressIfNeeded] │ ✓ seed '${seedName}': explicit → ${seedValue.toBase58()}` + ); + } + } catch {} + } + + // 2. Check if in main instruction + if (!seedValue) { + seedValue = this._getFromMainInstruction(seedName); + if (seedValue) { + console.log( + `[decompressIfNeeded] │ ✓ seed '${seedName}': from main → ${seedValue.toBase58()}` + ); + } + } + + // 3. REQUIRED: All seeds for resolved compressible accounts MUST be found + if (!seedValue) { + throw new Error( + `[decompressIfNeeded] Compressible account '${accountName}' is being decompressed, ` + + `but its required seed account '${seedName}' could not be resolved.\n\n` + + `This account is required because '${accountName}' is explicitly provided or found in the instruction.\n\n` + + `Solutions:\n` + + ` 1. Provide it explicitly: .decompressIfNeeded({ ${seedName}: , ... })\n` + + ` 2. Include it in the main instruction accounts\n` + + ` 3. If '${accountName}' is not needed for this instruction, don't provide it explicitly\n\n` + + `Note: '${seedName}' may be a field reference - ensure the field's value is passed as a PublicKey.` + ); + } + completeAccounts[seedName] = seedValue; + } + } + } + } else { + // Not resolved - treat as unused (set to program ID / None) + console.log( + `[decompressIfNeeded] ✗✗ FAILED to resolve '${accountName}' - treating as unused (None)` + ); + completeAccounts[accountName] = programId; } } - if (missing.length > 0) { - throw new Error( - `[decompressIfNeeded] Missing compressible accounts used by main instruction: ${missing.join( - ", " - )}.\n` + - `These accounts are marked as compressible in the IDL and must be provided to decompressIfNeeded().\n` + - `Add them: .decompressIfNeeded({ ..., ${missing - .map((n) => `${n}:
`) - .join(", ")} })` - ); + // Step 3: Process remaining non-compressible decompress accounts (system accounts, optional accounts) + for (const acc of decompressInstruction.accounts || []) { + const accountName = typeof acc === "string" ? acc : acc.name; + const isOptional = + typeof acc !== "string" && + !("accounts" in acc) && + (acc as IdlInstructionAccount).optional === true; + const isSystemAccount = SYSTEM_ACCOUNTS.has(accountName); + + // Skip if already resolved (either compressible account or collected seed) + if (accountName in completeAccounts) { + console.log( + `[decompressIfNeeded] ✓ '${accountName}' already resolved (collected from seed resolution):`, + completeAccounts[accountName].toBase58() + ); + continue; + } + + let resolved: PublicKey | null = null; + + // Check explicit value + if (accountName in this._decompressAccounts) { + try { + const provided = translateAddress( + this._decompressAccounts[accountName] as Address + ); + if (!provided.equals(programId)) { + resolved = provided; + console.log( + `[decompressIfNeeded] Using explicit value for '${accountName}':`, + provided.toBase58() + ); + } + } catch {} + } + + // Check main instruction + if (!resolved) { + const fromMain = this._getFromMainInstruction(accountName); + if (fromMain) { + console.log( + `[decompressIfNeeded] Auto-pulling '${accountName}' from main instruction:`, + fromMain.toBase58() + ); + resolved = fromMain; + } + } + + // Set to programId (None) if still not resolved + if (!resolved) { + if (!isOptional && !isSystemAccount) { + throw new Error( + `[decompressIfNeeded] Required account '${accountName}' is missing.\n` + + `Please provide it explicitly: .decompressIfNeeded({ ..., ${accountName}: })` + ); + } + console.log( + `[decompressIfNeeded] Account '${accountName}' not found - treating as unused (None)` + ); + resolved = programId; + } + + completeAccounts[accountName] = resolved; } - // Fetch compression state for all accounts + console.log( + `[decompressIfNeeded] Resolved ${ + Object.keys(completeAccounts).length + } total accounts for decompress instruction` + ); + console.log( + `[decompressIfNeeded] Will check compression state for ${compressibleAccountsToCheck.length} resolved compressible account(s):` + ); + compressibleAccountsToCheck.forEach((acc, idx) => { + console.log(` [${idx + 1}] ${acc.name} → ${acc.address.toBase58()}`); + }); + + // Step 4: Fetch compression state for all potentially compressible accounts const accountInputs = await this._fetchCompressibleAccounts( - accountsToCheck + compressibleAccountsToCheck ); if (accountInputs.length === 0) { @@ -916,28 +1706,24 @@ export class MethodsBuilder< return; } - // Build decompress params - const programId = this._programId; + // Step 5: Build decompress params const rpc = createRpc(); - console.log( `[decompressIfNeeded] Building decompress params for ${accountInputs.length} compressed account(s)` ); + console.log( - `[decompressIfNeeded] Calling buildDecompressParams with inputs:`, - // JSON.stringify( - accountInputs.map((ai: any) => ({ - address: ai.address.toBase58(), - accountType: ai.accountType, - info: ai.info, - tokenVariant: ai.tokenVariant || undefined, - })) - // null, - // 2 - // ) + "accountInputs", + accountInputs.map((acc) => acc) ); const params = await buildDecompressParams(programId, rpc, accountInputs); + console.log("params", params); + console.log( + "params", + params?.compressedAccounts.map((acc) => JSON.stringify(acc)) + ); + if (!params) { console.log("[decompressIfNeeded] buildDecompressParams returned null."); return; @@ -946,15 +1732,8 @@ export class MethodsBuilder< console.log( `[decompressIfNeeded] Built params with ${params.compressedAccounts.length} compressed account(s), ${params.remainingAccounts.length} remaining account(s)` ); - console.log( - `[decompressIfNeeded] compressedAccounts:`, - JSON.stringify(params.compressedAccounts, null, 2) - ); - console.log( - `[decompressIfNeeded] systemAccountsOffset: ${params.systemAccountsOffset}` - ); - // Build the decompress instruction + // Step 6: Build and inject the decompress instruction const decompressIxFn = this._allInstructionFns[ "decompressAccountsIdempotent" ] as InstructionFn>; @@ -966,66 +1745,6 @@ export class MethodsBuilder< return; } - // Auto-resolve constant and default accounts before validation - this._autoResolveDecompressAccounts(); - - // Determine which seed accounts are required based on what's being decompressed - const requiredSeeds = this._extractRequiredSeeds(accountInputs); - console.log( - `[decompressIfNeeded] Required seeds for decompression:`, - Array.from(requiredSeeds) - ); - - // Auto-pull required seeds from main instruction - for (const seedName of Array.from(requiredSeeds)) { - if ( - !(seedName in this._decompressAccounts) || - translateAddress(this._decompressAccounts[seedName] as Address).equals( - programId - ) - ) { - const fromMain = this._getFromMainInstruction(seedName); - if (fromMain) { - console.log( - `[decompressIfNeeded] Auto-pulling required seed '${seedName}' from main instruction:`, - fromMain.toBase58() - ); - this._decompressAccounts[seedName] = fromMain; - } else { - throw new Error( - `[decompressIfNeeded] Required seed account '${seedName}' is missing. ` + - `It's needed for decompressing but not found in main instruction. ` + - `Please provide it explicitly in decompressIfNeeded() call.` - ); - } - } - } - - // Fill in any missing accounts with program ID (represents "None" for optional accounts) - // Only fill accounts that are NOT required seeds - const completeAccounts = { ...this._decompressAccounts }; - const decompressIxAccounts = decompressInstruction.accounts || []; - - for (const acc of decompressIxAccounts) { - const accountName = typeof acc === "string" ? acc : acc.name; - if (!(accountName in completeAccounts)) { - if (requiredSeeds.has(accountName)) { - throw new Error( - `[decompressIfNeeded] Required seed account '${accountName}' is missing.` - ); - } - console.log( - `[decompressIfNeeded] Auto-filling optional account '${accountName}' with program ID (not needed for current decompression)` - ); - completeAccounts[accountName] = programId; - } - } - - console.log( - `[decompressIfNeeded] Building instruction with accounts:`, - Object.keys(completeAccounts) - ); - let decompressIx; try { decompressIx = decompressIxFn( @@ -1053,6 +1772,169 @@ export class MethodsBuilder< this.preInstructions([decompressIx], true); } + /** + * Resolve a compressible account using Light metadata seed dependencies. + * Tries to find seed accounts in main instruction and derive the target account. + */ + private _resolveCompressibleAccountFromMetadata( + accountName: string, + metadata: { + accountType: "pda" | "token"; + seeds: Array<{ type: "const" | "account"; value: string }>; + } + ): { + found: boolean; + address?: PublicKey; + seeds?: Record; + } { + const programId = this._programId; + const seedsResolved: Record = {}; + const seedBuffers: Buffer[] = []; + + // Try to resolve all seeds (both const and account) + const accountSeeds = metadata.seeds.filter((s) => s.type === "account"); + console.log( + `[decompressIfNeeded] ├─ Resolving ${accountSeeds.length} account seed(s) for '${accountName}'...` + ); + + // Process each seed in order (preserving const and account seeds) + for (const seed of metadata.seeds) { + if (seed.type === "const") { + // Const seed - add directly to seed buffers + seedBuffers.push(Buffer.from(seed.value, "utf8")); + console.log(`[decompressIfNeeded] │ ✓ const seed: "${seed.value}"`); + } else { + // Account seed - need to resolve it + const seedName = seed.value; + let seedValue: PublicKey | null = null; + + // Check if seed is explicitly provided + if (this._decompressAccounts && seedName in this._decompressAccounts) { + try { + const provided = translateAddress( + this._decompressAccounts[seedName] as Address + ); + if (!provided.equals(programId)) { + seedValue = provided; + console.log( + `[decompressIfNeeded] │ ✓ account seed '${seedName}': explicit → ${seedValue.toBase58()}` + ); + } + } catch {} + } + + // Check if seed is in main instruction + if (!seedValue) { + seedValue = this._getFromMainInstruction(seedName); + if (seedValue) { + console.log( + `[decompressIfNeeded] │ ✓ account seed '${seedName}': from main → ${seedValue.toBase58()}` + ); + } + } + + if (!seedValue) { + console.log( + `[decompressIfNeeded] │ ✗ account seed '${seedName}': NOT FOUND` + ); + return { found: false }; + } + + seedsResolved[seedName] = seedValue; + seedBuffers.push(seedValue.toBuffer()); + } + } + + // All seeds found - now derive the account + console.log( + `[decompressIfNeeded] ├─ All seeds resolved. Deriving ${metadata.accountType}...` + ); + + try { + if (metadata.accountType === "pda") { + // Derive PDA using all seed buffers (const + account) + const [derivedPda] = PublicKey.findProgramAddressSync( + seedBuffers, + programId + ); + console.log( + `[decompressIfNeeded] │ → Derived PDA: ${derivedPda.toBase58()}` + ); + + // Check if this matches any account in main instruction + if (this._accounts) { + for (const [mainAccName, mainAccValue] of Object.entries( + this._accounts + )) { + try { + const mainPubkey = translateAddress(mainAccValue as Address); + if (mainPubkey.equals(derivedPda)) { + console.log( + `[decompressIfNeeded] └─ ✓ Match found: derived PDA equals main account '${mainAccName}'` + ); + return { + found: true, + address: derivedPda, + seeds: seedsResolved, + }; + } + } catch {} + } + } + + // Even if not in main instruction, we successfully derived it + console.log( + `[decompressIfNeeded] └─ ✓ PDA derived (not found in main instruction, but usable)` + ); + return { found: true, address: derivedPda, seeds: seedsResolved }; + } else if (metadata.accountType === "token") { + // For token accounts (compressed token vaults), derive the actual PDA + // Token vaults are PDAs: PDA[const_seed, ...account_seeds] + const [derivedTokenVault] = PublicKey.findProgramAddressSync( + seedBuffers, + programId + ); + console.log( + `[decompressIfNeeded] │ → Derived token vault PDA: ${derivedTokenVault.toBase58()}` + ); + + // Check if this derived address matches any account in main instruction + if (this._accounts) { + for (const [mainAccName, mainAccValue] of Object.entries( + this._accounts + )) { + try { + const mainPubkey = translateAddress(mainAccValue as Address); + if (mainPubkey.equals(derivedTokenVault)) { + console.log( + `[decompressIfNeeded] └─ ✓ Match found: derived token vault equals main account '${mainAccName}'` + ); + return { + found: true, + address: derivedTokenVault, + seeds: seedsResolved, + }; + } + } catch {} + } + } + + // Token vault not found in main instruction - this is expected if it's not used + console.log( + `[decompressIfNeeded] └─ ✗ Derived token vault not found in main instruction` + ); + } + } catch (error) { + console.log( + `[decompressIfNeeded] └─ ✗ Derivation failed: ${ + (error as Error).message + }` + ); + } + + return { found: false }; + } + /** * Create an instruction based on the current configuration. * From f756915c5459c5fd9ed6ddb577700afb21be57dd Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Sun, 19 Oct 2025 17:24:22 -0400 Subject: [PATCH 16/20] rm heuristics --- .../anchor/src/program/namespace/methods.ts | 49 +++++++++---------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/ts/packages/anchor/src/program/namespace/methods.ts b/ts/packages/anchor/src/program/namespace/methods.ts index 0b82544f09..97e36ca268 100644 --- a/ts/packages/anchor/src/program/namespace/methods.ts +++ b/ts/packages/anchor/src/program/namespace/methods.ts @@ -1474,16 +1474,11 @@ export class MethodsBuilder< } } } else { - // No seeds defined - try generic name-based fuzzy matching + // No seeds defined - try exact name matching only (no fuzzy matching to avoid false positives) console.log( - `[decompressIfNeeded] ├─ No seeds - trying fuzzy name matching...` + `[decompressIfNeeded] ├─ No seeds - trying exact name matching only...` ); - // Extract the core name parts for matching (e.g., "pool" from "pool_state", "observation" from "observation_state") - const accountNameParts = accountName - .split("_") - .filter((p) => p.length > 2); - for (const [mainAccName, mainAccValue] of mainAccountEntries) { try { const mainPubkey = translateAddress(mainAccValue as Address); @@ -1494,7 +1489,7 @@ export class MethodsBuilder< .toLowerCase() .replace(/^_/, ""); - // Check exact match + // Check exact match only (no fuzzy matching to prevent false positives) if (mainSnakeName === accountName) { resolved = mainPubkey; console.log( @@ -1502,26 +1497,28 @@ export class MethodsBuilder< ); break; } - - // Check if main account name contains core parts of the compressible account name - const matchScore = accountNameParts.filter((part) => - mainSnakeName.includes(part) - ).length; - - if ( - matchScore > 0 && - matchScore / accountNameParts.length >= 0.5 - ) { - resolved = mainPubkey; - console.log( - `[decompressIfNeeded] └─ ✓ P4 Fuzzy name match: '${accountName}' → '${mainAccName}' (${matchScore}/${ - accountNameParts.length - } parts) → ${mainPubkey.toBase58()}` - ); - break; - } } catch {} } + + // // If still not resolved after exact match, throw error + // if (!resolved) { + // console.log( + // `[decompressIfNeeded] ✗ Account '${accountName}' has no seeds and no exact name match found` + // ); + // throw new Error( + // `[decompressIfNeeded] Account '${accountName}' is marked as compressible but has no seeds defined in the IDL.\n\n` + + // `All compressible accounts must have PDA seed definitions (enforced by the Light Protocol macro).\n\n` + + // `This error indicates:\n` + + // ` - The IDL may be malformed or corrupted\n` + + // ` - The program was not properly compiled with the Light Protocol macros\n` + + // ` - The IDL was manually edited incorrectly\n\n` + + // `Solutions:\n` + + // ` 1. Rebuild the program and regenerate the IDL\n` + + // ` 2. Provide the account explicitly: .decompressIfNeeded({ ${accountName}:
, ... })\n` + + // ` 3. If this account isn't needed for this instruction, don't provide it explicitly\n\n` + + // `For support, visit: https://docs.lightprotocol.com` + // ); + // } } if (!resolved) { From 8ff28e7de5f52e689aec2e38d9d9534363f2d281 Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Sun, 19 Oct 2025 20:56:16 -0400 Subject: [PATCH 17/20] resolve seed accounts if no exact match --- .../anchor/src/program/namespace/methods.ts | 231 +++++++++++++++++- 1 file changed, 230 insertions(+), 1 deletion(-) diff --git a/ts/packages/anchor/src/program/namespace/methods.ts b/ts/packages/anchor/src/program/namespace/methods.ts index 97e36ca268..9084596d66 100644 --- a/ts/packages/anchor/src/program/namespace/methods.ts +++ b/ts/packages/anchor/src/program/namespace/methods.ts @@ -1588,8 +1588,110 @@ export class MethodsBuilder< } } - // 3. REQUIRED: All seeds for resolved compressible accounts MUST be found + if (!seedValue && this._accounts) { + const seedNameLower = seedName.toLowerCase(); + const seedNameSnake = seedName + .replace(/([A-Z])/g, "_$1") + .toLowerCase() + .replace(/^_/, ""); + + for (const [mainAccName, mainAccValue] of Object.entries( + this._accounts + )) { + try { + const mainPubkey = translateAddress( + mainAccValue as Address + ); + if (mainPubkey.equals(programId)) continue; + + const mainNameLower = mainAccName.toLowerCase(); + const mainNameSnake = mainAccName + .replace(/([A-Z])/g, "_$1") + .toLowerCase() + .replace(/^_/, ""); + + // Strategy 1: Exact match (case-insensitive) + if (seedNameLower === mainNameLower) { + seedValue = mainPubkey; + console.log( + `[decompressIfNeeded] │ ✓ seed '${seedName}': case-insensitive match '${mainAccName}' → ${seedValue.toBase58()}` + ); + break; + } + + // Strategy 2: Snake case equivalents match + if (seedNameSnake === mainNameSnake) { + seedValue = mainPubkey; + console.log( + `[decompressIfNeeded] │ ✓ seed '${seedName}': snake_case match '${mainAccName}' → ${seedValue.toBase58()}` + ); + break; + } + } catch {} + } + } + + // 4. Check if already collected in completeAccounts + if (!seedValue && seedName in completeAccounts) { + seedValue = completeAccounts[seedName]; + console.log( + `[decompressIfNeeded] │ ✓ seed '${seedName}': found in completeAccounts → ${seedValue.toBase58()}` + ); + } + + // 5. Try brute-force mapping of unresolved seeds by deriving the target account + if (!seedValue && resolved) { + // Build knownSeedValues for this account only + const knownSeedValues: Record = {}; + for (const s of metadata.seeds) { + if (s.type === "account") { + const nm = s.value; + if (nm in completeAccounts) { + try { + knownSeedValues[nm] = translateAddress( + completeAccounts[nm] as Address + ); + } catch { + // already PublicKey + knownSeedValues[nm] = completeAccounts[nm]; + } + } + } + } + + const mapping = this._bruteForceResolveSeedAccounts( + accountName, + metadata, + resolved, + knownSeedValues + ); + + if (mapping) { + for (const [nm, pk] of Object.entries(mapping)) { + if (!(nm in completeAccounts)) { + completeAccounts[nm] = pk; + console.log( + `[decompressIfNeeded] │ ✓ seed '${nm}': brute-force → ${pk.toBase58()}` + ); + } + } + if (seedName in mapping) { + seedValue = mapping[seedName]; + } + } + } + + // 6. REQUIRED: All seeds for resolved compressible accounts MUST be found if (!seedValue) { + // Log what we have to help debugging + console.log( + `[decompressIfNeeded] │ ✗ seed '${seedName}': NOT FOUND` + ); + console.log( + `[decompressIfNeeded] │ Available main instruction accounts: ${ + Object.keys(this._accounts || {}).join(", ") || "none" + }` + ); throw new Error( `[decompressIfNeeded] Compressible account '${accountName}' is being decompressed, ` + `but its required seed account '${seedName}' could not be resolved.\n\n` + @@ -1932,6 +2034,133 @@ export class MethodsBuilder< return { found: false }; } + /** + * Brute-force resolution for missing seed accounts by deriving the target account + * using candidate assignments for unresolved seeds and matching against the + * already-resolved target address. + */ + private _bruteForceResolveSeedAccounts( + accountName: string, + metadata: { + accountType: "pda" | "token"; + seeds: Array<{ type: "const" | "account"; value: string }>; + }, + targetAddress: PublicKey, + knownSeedValues: Record + ): Record | null { + const programId = this._programId; + + // Collect unresolved seed names (in order of appearance) + const unresolvedSeeds: string[] = []; + for (const seed of metadata.seeds) { + if (seed.type === "account") { + const name = seed.value; + if (!knownSeedValues[name]) { + unresolvedSeeds.push(name); + } + } + } + + if (unresolvedSeeds.length === 0) { + return {}; + } + + const mainAccountEntries = Object.entries(this._accounts || {}); + + // Build candidate indices from main accounts + const candidateIndices: number[] = []; + for (let i = 0; i < mainAccountEntries.length; i++) { + try { + const pk = translateAddress(mainAccountEntries[i][1] as Address); + // Exclude placeholders (program id) + if (!pk.equals(programId)) { + candidateIndices.push(i); + } + } catch {} + } + + // Helper: generate permutations (ordered selections without repetition) + const generatePermutations = (arr: number[], k: number): number[][] => { + if (k === 0) return [[]]; + const results: number[][] = []; + const backtrack = (path: number[], used: boolean[]) => { + if (path.length === k) { + results.push(path.slice()); + return; + } + for (let idx = 0; idx < arr.length; idx++) { + if (used[idx]) continue; + used[idx] = true; + path.push(arr[idx]); + backtrack(path, used); + path.pop(); + used[idx] = false; + } + }; + backtrack([], new Array(arr.length).fill(false)); + return results; + }; + + const permutations = generatePermutations( + candidateIndices, + unresolvedSeeds.length + ); + + // For each permutation, assign candidates to unresolved seeds (in order), + // build the seed buffers and derive. If it matches the target address, we + // found the mapping. + let foundMapping: Record | null = null; + for (const perm of permutations) { + const assignment: Record = {}; + let unresolvedIdx = 0; + const seedBuffers: Buffer[] = []; + + let valid = true; + for (const seed of metadata.seeds) { + if (seed.type === "const") { + seedBuffers.push(Buffer.from(seed.value, "utf8")); + } else { + const name = seed.value; + let valuePk: PublicKey | null = null; + if (knownSeedValues[name]) { + valuePk = knownSeedValues[name]; + } else { + // Assign from permutation + const candIndex = perm[unresolvedIdx++]; + try { + valuePk = translateAddress( + mainAccountEntries[candIndex][1] as Address + ); + } catch { + valid = false; + } + if (!valuePk) valid = false; + if (!valid) break; + assignment[name] = valuePk!; + } + seedBuffers.push(valuePk!.toBuffer()); + } + } + if (!valid) continue; + + try { + const [derived] = PublicKey.findProgramAddressSync( + seedBuffers, + programId + ); + if (derived.equals(targetAddress)) { + if (foundMapping) { + // Ambiguous mapping - multiple solutions. Bail to avoid false positives. + return null; + } + foundMapping = assignment; + } + } catch {} + } + + return foundMapping; + } + /** * Create an instruction based on the current configuration. * From 29c0a4163e9e6e3c86d4b47f5515a845ebbf45bb Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Tue, 21 Oct 2025 09:14:50 -0400 Subject: [PATCH 18/20] wip --- .../anchor/src/program/namespace/methods.ts | 460 +++++++++++++----- 1 file changed, 345 insertions(+), 115 deletions(-) diff --git a/ts/packages/anchor/src/program/namespace/methods.ts b/ts/packages/anchor/src/program/namespace/methods.ts index 9084596d66..57a1cdaa82 100644 --- a/ts/packages/anchor/src/program/namespace/methods.ts +++ b/ts/packages/anchor/src/program/namespace/methods.ts @@ -56,7 +56,9 @@ import { buildDecompressParams, CompressedTokenProgram, getAccountInterface, + getAtaInterface, CTOKEN_RENT_SPONSOR, + getAssociatedCTokenAddressAndBump, } from "@lightprotocol/compressed-token"; featureFlags.version = VERSION.V2; @@ -74,6 +76,7 @@ interface LightCompressibleMetadata { string, { accountType: "pda" | "token"; + isATA?: boolean; seeds: Array<{ type: "const" | "account"; value: string }>; } >; @@ -92,6 +95,7 @@ function extractLightMetadata(idl: Idl): LightCompressibleMetadata | null { string, { accountType: "pda" | "token"; + isATA?: boolean; seeds: Array<{ type: "const" | "account"; value: string }>; } >(); @@ -181,9 +185,11 @@ function extractLightMetadata(idl: Idl): LightCompressibleMetadata | null { const variantName = variant.name; // Keep camelCase from IDL const seeds = extractPdaSeeds(variantName); + const isATA = seeds.length === 0; // ATAs have no PDA seeds compressibleAccounts.set(variantName, { accountType: "token", + isATA, seeds, }); } @@ -230,6 +236,7 @@ function extractLightMetadata(idl: Idl): LightCompressibleMetadata | null { seenBaseNames.add(baseName); compressibleAccounts.set(baseName, { accountType: "pda", + isATA: false, seeds, }); } @@ -405,6 +412,10 @@ export class MethodsBuilder< private _programId: PublicKey; private _accountNamespace: AccountNamespace; private _lightMetadata?: LightCompressibleMetadata | null; + private _ataDerivations: Record< + string, + { owner: PublicKey; mint: PublicKey } + > = {}; constructor( private _args: Array, @@ -629,9 +640,16 @@ export class MethodsBuilder< /** * Fetch and check compression state for provided accounts. * Returns AccountInput[] for buildDecompressParams. + * + * For ATA variants (seedless tokens), derives owner+mint from main instruction + * and queries by owner+mint instead of address. */ private async _fetchCompressibleAccounts( - accountsToCheck: Array<{ name: string; address: PublicKey }> + accountsToCheck: Array<{ + name: string; + address: PublicKey; + ataDerivation?: { owner: PublicKey; mint: PublicKey }; + }> ): Promise { if (accountsToCheck.length === 0) return []; @@ -645,148 +663,206 @@ export class MethodsBuilder< ); // Prepare an array of concurrent fetch promises - const fetchPromises = accountsToCheck.map(async ({ name, address }) => { - console.log( - `[decompressIfNeeded] → Checking '${name}' (${address.toBase58()})...` - ); - - // name is already camelCase from IDL metadata - - try { - // Try fetching as CPDA first - // @ts-ignore - const cpdaResult = await rpc.getAccountInfoInterface( - address, - programId, - //@ts-ignore - defaultAddressTreeInfo + const fetchPromises = accountsToCheck.map( + async ({ name, address, ataDerivation }) => { + console.log( + `[decompressIfNeeded] → Checking '${name}' (${address.toBase58()})...` ); - if (cpdaResult && cpdaResult.merkleContext && cpdaResult.isCompressed) { + // Check if this is an ATA variant (seedless token) + const metadata = this._lightMetadata?.compressibleAccounts.get(name); + if (metadata?.isATA) { console.log( - `[decompressIfNeeded] ✓ Account '${name}' is COMPRESSED` + `[decompressIfNeeded] → ATA variant detected, querying by owner+mint` ); - // It's a compressed account - if ( - cpdaResult.accountInfo.owner.equals( - CompressedTokenProgram.programId - ) - ) { - // It's a compressed token account - try { - const parsed = parseTokenData(cpdaResult.accountInfo.data); - if (parsed) { - return { - address, - info: { - accountInfo: cpdaResult.accountInfo, - parsed, - merkleContext: cpdaResult.merkleContext, - }, - accountType: "cTokenData", - tokenVariant: name, - } as AccountInput; - } - } catch { - // Not a token account, ignore - } - } else { - // It's a compressed program account - let parsed = null; - // Use camelCase name for account client lookup - const accountClient = (this._accountNamespace as any)[name]; + // Prefer derived owner+mint passed from resolution stage + const owner = ataDerivation?.owner || null; + const mint = ataDerivation?.mint || null; + if (!owner || !mint) { console.log( - `[decompressIfNeeded] → Trying to parse '${name}' using account client '${name}'` + `[decompressIfNeeded] ✗ ATA requires derived owner+mint (ambiguous or not resolved)` ); + return undefined; + } + + try { + const ataResult = await getAtaInterface( + rpc, + owner, + mint, + undefined + ); + + if (ataResult.isCompressed && ataResult.merkleContext) { + console.log(`[decompressIfNeeded] ✓ ATA is COMPRESSED`); + return { + address: ataResult.parsed.address, + info: { + accountInfo: ataResult.accountInfo, + parsed: ataResult.parsed, + merkleContext: ataResult.merkleContext, + }, + accountType: "cTokenData", + tokenVariant: name, + } as AccountInput; + } else { + console.log(`[decompressIfNeeded] ✗ ATA is NOT compressed`); + } + } catch (err) { + console.log( + `[decompressIfNeeded] ✗ ATA fetch failed: ${ + (err as Error).message + }` + ); + } + + return undefined; + } + + // name is already camelCase from IDL metadata + + try { + // Try fetching as CPDA first + // @ts-ignore + const cpdaResult = await rpc.getAccountInfoInterface( + address, + programId, + //@ts-ignore + defaultAddressTreeInfo + ); - if (accountClient?.coder) { + if ( + cpdaResult && + cpdaResult.merkleContext && + cpdaResult.isCompressed + ) { + console.log( + `[decompressIfNeeded] ✓ Account '${name}' is COMPRESSED` + ); + // It's a compressed account + if ( + cpdaResult.accountInfo.owner.equals( + CompressedTokenProgram.programId + ) + ) { + // It's a compressed token account try { - parsed = accountClient.coder.accounts.decode( - name, - cpdaResult.accountInfo.data - ); - console.log( - `[decompressIfNeeded] ✓ Parsed successfully using decode()` - ); + const parsed = parseTokenData(cpdaResult.accountInfo.data); + if (parsed) { + return { + address, + info: { + accountInfo: cpdaResult.accountInfo, + parsed, + merkleContext: cpdaResult.merkleContext, + }, + accountType: "cTokenData", + tokenVariant: name, + } as AccountInput; + } } catch { + // Not a token account, ignore + } + } else { + // It's a compressed program account + let parsed = null; + + // Use camelCase name for account client lookup + const accountClient = (this._accountNamespace as any)[name]; + + console.log( + `[decompressIfNeeded] → Trying to parse '${name}' using account client '${name}'` + ); + + if (accountClient?.coder) { try { - parsed = accountClient.coder.accounts.decodeAny( + parsed = accountClient.coder.accounts.decode( + name, cpdaResult.accountInfo.data ); console.log( - `[decompressIfNeeded] ✓ Parsed successfully using decodeAny()` - ); - } catch (e) { - console.log( - `[decompressIfNeeded] ✗ Parsing failed: ${ - (e as Error).message - }` + `[decompressIfNeeded] ✓ Parsed successfully using decode()` ); + } catch { + try { + parsed = accountClient.coder.accounts.decodeAny( + cpdaResult.accountInfo.data + ); + console.log( + `[decompressIfNeeded] ✓ Parsed successfully using decodeAny()` + ); + } catch (e) { + console.log( + `[decompressIfNeeded] ✗ Parsing failed: ${ + (e as Error).message + }` + ); + } } + } else { + console.log( + `[decompressIfNeeded] ✗ No account client found for '${name}'` + ); } - } else { - console.log( - `[decompressIfNeeded] ✗ No account client found for '${name}'` - ); - } - return { - address, - info: { - accountInfo: cpdaResult.accountInfo, - parsed, - merkleContext: cpdaResult.merkleContext, - }, - accountType: name, - } as AccountInput; - } - } else { - console.log( - `[decompressIfNeeded] ✗ Not compressed via getAccountInfoInterface, trying token fallback...` - ); - // Try as compressed token via getAccountInterface as fallback - try { - const tokenRes = await getAccountInterface( - rpc, - address, - undefined, - CompressedTokenProgram.programId - ); - if (tokenRes && (tokenRes as any).merkleContext) { - console.log( - `[decompressIfNeeded] ✓ Found via token fallback - COMPRESSED token` - ); return { address, - info: tokenRes as any, - accountType: "cTokenData", - tokenVariant: name, + info: { + accountInfo: cpdaResult.accountInfo, + parsed, + merkleContext: cpdaResult.merkleContext, + }, + accountType: name, } as AccountInput; - } else { - console.log( - `[decompressIfNeeded] ✗ Account '${name}' is NOT compressed (no merkleContext)` - ); } - } catch (err) { + } else { console.log( - `[decompressIfNeeded] ✗ Token fallback failed: ${ - (err as Error).message - }` + `[decompressIfNeeded] ✗ Not compressed via getAccountInfoInterface, trying token fallback...` ); + // Try as compressed token via getAccountInterface as fallback + try { + const tokenRes = await getAccountInterface( + rpc, + address, + undefined, + CompressedTokenProgram.programId + ); + if (tokenRes && (tokenRes as any).merkleContext) { + console.log( + `[decompressIfNeeded] ✓ Found via token fallback - COMPRESSED token` + ); + return { + address, + info: tokenRes as any, + accountType: "cTokenData", + tokenVariant: name, + } as AccountInput; + } else { + console.log( + `[decompressIfNeeded] ✗ Account '${name}' is NOT compressed (no merkleContext)` + ); + } + } catch (err) { + console.log( + `[decompressIfNeeded] ✗ Token fallback failed: ${ + (err as Error).message + }` + ); + } } + } catch (err) { + console.log( + `[decompressIfNeeded] ✗ Error fetching '${name}': ${ + (err as Error).message + }` + ); } - } catch (err) { - console.log( - `[decompressIfNeeded] ✗ Error fetching '${name}': ${ - (err as Error).message - }` - ); + // Return undefined if no compressed account found + return undefined; } - // Return undefined if no compressed account found - return undefined; - }); + ); // Run all fetchers concurrently const results = await Promise.allSettled(fetchPromises); @@ -1027,6 +1103,140 @@ export class MethodsBuilder< } } + /** + * Flatten IDL account metadata for the current instruction, preserving signer flags. + */ + private _collectIdlAccountMetas(): Array<{ name: string; signer: boolean }> { + const metas: Array<{ name: string; signer: boolean }> = []; + const ix: any = this._idlIx as any; + const walk = (items: any[]) => { + for (const item of items || []) { + if (typeof item === "string") continue; + if ("accounts" in item && Array.isArray(item.accounts)) { + walk(item.accounts); + } else if (item && typeof item === "object" && item.name) { + metas.push({ name: item.name, signer: !!item.signer }); + } + } + }; + if (ix && Array.isArray(ix.accounts)) { + walk(ix.accounts); + } + return metas; + } + + /** + * Brute-force resolve an ATA by trying all owner/mint permutations from main accounts. + * Returns the first unambiguous match whose derived cATA exists in the main accounts. + */ + private _resolveAtaByBruteForce(accountName: string): { + found: boolean; + address?: PublicKey; + owner?: PublicKey; + mint?: PublicKey; + } { + const programId = this._programId; + const idlMetas = this._collectIdlAccountMetas(); + + // Collect candidate owners: signer accounts + heuristic names + const ownerNameHints = new Set([ + "owner", + "payer", + "user", + "authority", + "admin", + ]); + + const ownerCandidates: PublicKey[] = []; + const seenOwners = new Set(); + for (const meta of idlMetas) { + const nameLower = String(meta.name || "").toLowerCase(); + const hinted = [...ownerNameHints].some((h) => nameLower.includes(h)); + if (!meta.signer && !hinted) continue; + if (!this._accounts || !(meta.name in this._accounts)) continue; + try { + const pk = translateAddress(this._accounts[meta.name] as Address); + if (!pk.equals(programId)) { + const s = pk.toBase58(); + if (!seenOwners.has(s)) { + ownerCandidates.push(pk); + seenOwners.add(s); + } + } + } catch {} + } + + // Collect candidate mints: account names containing "mint" + const mintCandidates: PublicKey[] = []; + const seenMints = new Set(); + if (this._accounts) { + for (const [name, value] of Object.entries(this._accounts)) { + const nameLower = name.toLowerCase(); + if (!nameLower.includes("mint")) continue; + try { + const pk = translateAddress(value as Address); + if (!pk.equals(programId)) { + const s = pk.toBase58(); + if (!seenMints.has(s)) { + mintCandidates.push(pk); + seenMints.add(s); + } + } + } catch {} + } + } + + if (ownerCandidates.length === 0 || mintCandidates.length === 0) { + return { found: false }; + } + + // Build a set of all main accounts for matching + const mainAddresses = new Set(); + if (this._accounts) { + for (const value of Object.values(this._accounts)) { + try { + const pk = translateAddress(value as Address); + if (!pk.equals(programId)) mainAddresses.add(pk.toBase58()); + } catch {} + } + } + + let match: { + address: PublicKey; + owner: PublicKey; + mint: PublicKey; + } | null = null; + + for (const owner of ownerCandidates) { + for (const mint of mintCandidates) { + try { + const [derivedAta] = getAssociatedCTokenAddressAndBump(owner, mint); + const derivedStr = derivedAta.toBase58(); + if (mainAddresses.has(derivedStr)) { + // If we've already found a different match, it's ambiguous → bail + if (match && !match.address.equals(derivedAta)) { + return { found: false }; + } + match = { address: derivedAta, owner, mint }; + } + } catch {} + } + } + + if (!match) return { found: false }; + // Store for fetch stage + this._ataDerivations[accountName] = { + owner: match.owner, + mint: match.mint, + }; + return { + found: true, + address: match.address, + owner: match.owner, + mint: match.mint, + }; + } + /** * Internal method to inject decompress instruction if needed. * @@ -1092,6 +1302,7 @@ export class MethodsBuilder< const compressibleAccountsToCheck: Array<{ name: string; address: PublicKey; + ataDerivation?: { owner: PublicKey; mint: PublicKey }; }> = []; const resolvedAddresses = new Set(); // Track which addresses have been claimed @@ -1185,6 +1396,23 @@ export class MethodsBuilder< console.log( `[decompressIfNeeded] ✗ P3 Seed-based: no seeds defined for this account` ); + // If this is a seedless token, attempt ATA brute-force resolution by owner/mint + if (metadata.accountType === "token") { + console.log( + `[decompressIfNeeded] → Attempting ATA brute-force resolution for '${accountName}'` + ); + const ata = this._resolveAtaByBruteForce(accountName); + if (ata.found && ata.address) { + resolved = ata.address; + console.log( + `[decompressIfNeeded] ✓ ATA brute-force: derived ${resolved.toBase58()} (owner=${ata.owner?.toBase58()}, mint=${ata.mint?.toBase58()})` + ); + } else { + console.log( + `[decompressIfNeeded] ✗ ATA brute-force: no unambiguous match` + ); + } + } } // Priority 4: Try brute-force matching by trying all combinations of accounts as seeds @@ -1530,9 +1758,11 @@ export class MethodsBuilder< if (resolved) { completeAccounts[accountName] = resolved; + const ataDer = this._ataDerivations[accountName]; compressibleAccountsToCheck.push({ name: accountName, address: resolved, + ataDerivation: ataDer, }); resolvedAddresses.add(resolved.toBase58()); // Mark this address as claimed console.log( From d08f02d7c75712d53ce9f60218c4f6174f503447 Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Tue, 9 Dec 2025 01:38:27 +0400 Subject: [PATCH 19/20] wip --- lang/syn/src/parser/accounts/constraints.rs | 28 ++++++++++++++++----- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/lang/syn/src/parser/accounts/constraints.rs b/lang/syn/src/parser/accounts/constraints.rs index f705f9632e..9af0fe2ece 100644 --- a/lang/syn/src/parser/accounts/constraints.rs +++ b/lang/syn/src/parser/accounts/constraints.rs @@ -1152,7 +1152,7 @@ impl<'ty> ConstraintGroupBuilder<'ty> { // Mint. if let Some(mint_decimals) = &self.mint_decimals { - if self.mint_authority.is_none() { + if self.mint_authority.is_none() && self.ctoken_mint_authority.is_none() { return Err(ParseError::new( mint_decimals.span(), "when initializing, mint authority must be provided if mint decimals is", @@ -1160,13 +1160,21 @@ impl<'ty> ConstraintGroupBuilder<'ty> { } } if let Some(mint_authority) = &self.mint_authority { - if self.mint_decimals.is_none() { + if self.mint_decimals.is_none() && self.ctoken_mint_decimals.is_none() { return Err(ParseError::new( mint_authority.span(), "when initializing, mint decimals must be provided if mint authority is", )); } } + if let Some(ctoken_mint_authority) = &self.ctoken_mint_authority { + if self.mint_decimals.is_none() && self.ctoken_mint_decimals.is_none() { + return Err(ParseError::new( + ctoken_mint_authority.span(), + "when initializing, mint decimals must be provided if mint authority is", + )); + } + } } // Realloc. @@ -1505,12 +1513,20 @@ impl<'ty> ConstraintGroupBuilder<'ty> { } else if let Some(d) = &mint_decimals { InitKind::Mint { decimals: d.clone().into_inner().decimals, + // For SPL/Token-2022 mints, accept `mint::authority = ...` even if the + // parser initially stored it in the CToken bucket. Prefer the SPL value + // when present and fall back to the CToken value otherwise. owner: match &mint_authority { Some(a) => a.clone().into_inner().mint_auth, - None => return Err(ParseError::new( - d.span(), - "authority must be provided to initialize a mint program derived address" - )) + None => match &ctoken_mint_authority { + Some(ct) => ct.clone().into_inner().authority, + None => { + return Err(ParseError::new( + d.span(), + "authority must be provided to initialize a mint program derived address", + )) + } + } }, freeze_authority: mint_freeze_authority.map(|fa| fa.into_inner().mint_freeze_auth), token_program: mint_token_program.map(|tp| tp.into_inner().token_program), From 4e8ff59a7de5b2a8ba37f88cf7b0431999f1b1f3 Mon Sep 17 00:00:00 2001 From: ananas Date: Sat, 17 Jan 2026 21:24:32 +0000 Subject: [PATCH 20/20] Simplify Mint deserialization and add account type validation - Remove StateWithExtensions overhead, just unpack base 82-byte mint - Validate byte 165 == 1 for mints with extensions (rejects token accounts) --- spl/Cargo.toml | 2 +- spl/src/token_interface.rs | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/spl/Cargo.toml b/spl/Cargo.toml index beafc4f1d8..766ad13a5f 100644 --- a/spl/Cargo.toml +++ b/spl/Cargo.toml @@ -26,7 +26,7 @@ token_2022 = ["spl-token-2022"] token_2022_extensions = ["spl-token-2022", "spl-token-group-interface", "spl-token-metadata-interface", "spl-pod"] [dependencies] -anchor-lang = { path = "../lang", features = ["derive"] } +anchor-lang = { version = "0.31.1", features = ["derive"] } borsh = { version = "0.10.3", optional = true } mpl-token-metadata = { version = "5", optional = true } spl-associated-token-account = { version = "6", features = ["no-entrypoint"], optional = true } diff --git a/spl/src/token_interface.rs b/spl/src/token_interface.rs index ab9767c1da..33a29743c8 100644 --- a/spl/src/token_interface.rs +++ b/spl/src/token_interface.rs @@ -50,7 +50,14 @@ pub struct Mint(spl_token_2022::state::Mint); impl anchor_lang::AccountDeserialize for Mint { fn try_deserialize_unchecked(buf: &mut &[u8]) -> anchor_lang::Result { - spl_token_2022::extension::StateWithExtensions::::unpack(buf) + // If >= 166 bytes, validate account type byte is Mint (1) + if buf.len() >= 166 && buf[165] != 1 { + return Err(anchor_lang::error::ErrorCode::AccountDidNotDeserialize.into()); + } + + // Deserialize base mint only (82 bytes) + let base_slice = &buf[..spl_token_2022::state::Mint::LEN]; + spl_token_2022::extension::StateWithExtensions::::unpack(base_slice) .map(|t| Mint(t.base)) .map_err(Into::into) }