From 683ee73789d68d77e9496980d4f60e871a21ae3f Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 15:14:11 +0200 Subject: [PATCH 01/42] feat: pinocchio ephemeral permission --- .../.env.example | 2 + .../.gitignore | 13 + .../.yarnrc.yml | 1 + .../Cargo.toml | 18 + .../LICENSE | 21 + .../README.md | 59 + .../package.json | 35 + .../src/entrypoint.rs | 174 + .../src/lib.rs | 12 + .../src/processor.rs | 327 ++ .../src/state.rs | 47 + .../tests/pinocchio-secret-counter.test.ts | 544 ++++ .../tsconfig.json | 15 + .../yarn.lock | 2894 +++++++++++++++++ private-payments | 1 - yarn.lock | 4 - 16 files changed, 4162 insertions(+), 5 deletions(-) create mode 100644 pinocchio-ephemeral-permission-counter/.env.example create mode 100644 pinocchio-ephemeral-permission-counter/.gitignore create mode 100644 pinocchio-ephemeral-permission-counter/.yarnrc.yml create mode 100644 pinocchio-ephemeral-permission-counter/Cargo.toml create mode 100644 pinocchio-ephemeral-permission-counter/LICENSE create mode 100644 pinocchio-ephemeral-permission-counter/README.md create mode 100644 pinocchio-ephemeral-permission-counter/package.json create mode 100644 pinocchio-ephemeral-permission-counter/src/entrypoint.rs create mode 100644 pinocchio-ephemeral-permission-counter/src/lib.rs create mode 100644 pinocchio-ephemeral-permission-counter/src/processor.rs create mode 100644 pinocchio-ephemeral-permission-counter/src/state.rs create mode 100644 pinocchio-ephemeral-permission-counter/tests/pinocchio-secret-counter.test.ts create mode 100644 pinocchio-ephemeral-permission-counter/tsconfig.json create mode 100644 pinocchio-ephemeral-permission-counter/yarn.lock delete mode 160000 private-payments delete mode 100644 yarn.lock diff --git a/pinocchio-ephemeral-permission-counter/.env.example b/pinocchio-ephemeral-permission-counter/.env.example new file mode 100644 index 00000000..71ade902 --- /dev/null +++ b/pinocchio-ephemeral-permission-counter/.env.example @@ -0,0 +1,2 @@ +# Private Key (optional - will be generated if not provided) +# PRIVATE_KEY=[...] diff --git a/pinocchio-ephemeral-permission-counter/.gitignore b/pinocchio-ephemeral-permission-counter/.gitignore new file mode 100644 index 00000000..c97775d2 --- /dev/null +++ b/pinocchio-ephemeral-permission-counter/.gitignore @@ -0,0 +1,13 @@ +/target +**/*.rs.bk +.DS_Store +Cargo.lock +.env +node_modules/ +dist/ +build/ +*.log +.vscode +.idea +.pnp.cjs +.pnp.loader.mjs \ No newline at end of file diff --git a/pinocchio-ephemeral-permission-counter/.yarnrc.yml b/pinocchio-ephemeral-permission-counter/.yarnrc.yml new file mode 100644 index 00000000..3186f3f0 --- /dev/null +++ b/pinocchio-ephemeral-permission-counter/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/pinocchio-ephemeral-permission-counter/Cargo.toml b/pinocchio-ephemeral-permission-counter/Cargo.toml new file mode 100644 index 00000000..510aea78 --- /dev/null +++ b/pinocchio-ephemeral-permission-counter/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "pinocchio-ephemeral-permission-counter" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[features] +logging = [] + +[dependencies] +pinocchio = { version = "0.10.1", features = ["cpi", "copy"] } +pinocchio-log = { version = "0.5.1" } +pinocchio-system = { version = "0.5" } +solana-address = { version = "2.6", features = ["syscalls"] } +# ephemeral-rollups-pinocchio = { git = "https://github.com/magicblock-labs/ephemeral-rollups-sdk.git", rev = "a8ecea450d3bbe5bac119a3f4c55cd9f96b4837b" } +ephemeral-rollups-pinocchio = { path = "../../ephemeral-rollups-sdk/rust/pinocchio" } diff --git a/pinocchio-ephemeral-permission-counter/LICENSE b/pinocchio-ephemeral-permission-counter/LICENSE new file mode 100644 index 00000000..34e1951c --- /dev/null +++ b/pinocchio-ephemeral-permission-counter/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 MagicBlock Labs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/pinocchio-ephemeral-permission-counter/README.md b/pinocchio-ephemeral-permission-counter/README.md new file mode 100644 index 00000000..90f864f4 --- /dev/null +++ b/pinocchio-ephemeral-permission-counter/README.md @@ -0,0 +1,59 @@ +# ➕ Pinocchio Counter + +Simple counter program using Pinocchio and Ephemeral Rollups. + +This is a port of the Rust Counter program to use Pinocchio instead of Borsh for serialization, eliminating the need for Vec types. + +## Software Packages + +| Software | Version | Installation Guide | +| -------- | ------- | ------------------- | +| **Solana** | 2.3.13 | [Install Solana](https://docs.anza.xyz/cli/install) | +| **Rust** | 1.85.0 | [Install Rust](https://www.rust-lang.org/tools/install) | +| **Node** | 24.10.0 | [Install Node](https://nodejs.org/en/download/current) | + +## Build + +```bash +cargo build-sbf +``` + +## Test + +```bash +cargo test-sbf --features logging +``` + +## Key Differences from Rust Counter + +- **No Borsh**: Uses manual serialization with `to_le_bytes()` and `from_le_bytes()` for simplicity +- **No Vec**: All types use fixed-size arrays or primitives +- **Pinocchio Framework**: Leverages Pinocchio's lightweight instruction handling +- **Direct State Management**: Simple `Counter` struct with manual serialization + +## Instructions + +### 0: InitializeCounter +Initialize a counter PDA to 0. Payload: `bump` (u8). + +### 1: IncreaseCounter +Increase the counter by a specified amount. Payload: `bump` (u8) + `increase_by` (u64). + +### 2: Delegate +Delegate the counter account to the Ephemeral Rollups delegation program. Payload: `bump` (u8). + +### 3: CommitAndUndelegate +Commit changes and undelegate the counter account. + +### 4: Commit +Commit changes to the base layer. + +### 5: IncrementAndCommit +Increment counter and commit in one instruction. Payload: `bump` (u8) + `increase_by` (u64). + +### 6: IncrementAndUndelegate +Increment counter and undelegate in one instruction. Payload: `bump` (u8) + `increase_by` (u64). + +## Account Structure + +- **Counter**: 8 bytes (u64 count value) diff --git a/pinocchio-ephemeral-permission-counter/package.json b/pinocchio-ephemeral-permission-counter/package.json new file mode 100644 index 00000000..85cd429f --- /dev/null +++ b/pinocchio-ephemeral-permission-counter/package.json @@ -0,0 +1,35 @@ +{ + "name": "pinocchio-ephemeral-permission-counter", + "version": "0.1.0", + "description": "Tests for pinocchio-ephemeral-permission-counter program", + "main": "index.js", + "scripts": { + "test": "vitest run tests/", + "test:watch": "vitest watch tests/", + "build": "cargo build-sbf", + "check": "cargo check" + }, + "keywords": [ + "solana", + "pinocchio", + "ephemeral", + "permission", + "counter", + "program" + ], + "author": "", + "license": "Apache-2.0", + "devDependencies": { + "@magicblock-labs/ephemeral-rollups-sdk": "^0.11.1", + "@solana-program/system": "^0.10.0", + "@solana/kit": "^5.4.0", + "@solana/web3.js": "^1.93.0", + "@types/node": "^20.0.0", + "borsh": "^0.7.0", + "dotenv": "^16.0.0", + "ts-node": "^10.9.0", + "tweetnacl": "^1.0.3", + "typescript": "^5.0.0", + "vitest": "^0.34.0" + } +} \ No newline at end of file diff --git a/pinocchio-ephemeral-permission-counter/src/entrypoint.rs b/pinocchio-ephemeral-permission-counter/src/entrypoint.rs new file mode 100644 index 00000000..2a7bc809 --- /dev/null +++ b/pinocchio-ephemeral-permission-counter/src/entrypoint.rs @@ -0,0 +1,174 @@ +use crate::processor::{ + process_close_permission, process_commit_and_undelegate, process_create_permission, + process_delegate, process_increase_counter, process_initialize_counter, + process_undelegation_callback, process_update_permission, +}; +use core::{mem::MaybeUninit, slice::from_raw_parts}; +use pinocchio::{ + entrypoint::deserialize, error::ProgramError, no_allocator, nostd_panic_handler, AccountView, + Address, ProgramResult, MAX_TX_ACCOUNTS, SUCCESS, +}; + +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +enum InstructionDiscriminator { + InitializeCounter, + IncreaseCounter, + Delegate, + CommitAndUndelegate, + CreatePermission, + UpdatePermission, + ClosePermission, + UndelegationCallback, +} + +impl InstructionDiscriminator { + const INITIALIZE_COUNTER: [u8; 8] = [0, 0, 0, 0, 0, 0, 0, 0]; + const INCREASE_COUNTER: [u8; 8] = [1, 0, 0, 0, 0, 0, 0, 0]; + const DELEGATE: [u8; 8] = [2, 0, 0, 0, 0, 0, 0, 0]; + const COMMIT_AND_UNDELEGATE: [u8; 8] = [3, 0, 0, 0, 0, 0, 0, 0]; + const CREATE_PERMISSION: [u8; 8] = [4, 0, 0, 0, 0, 0, 0, 0]; + const UPDATE_PERMISSION: [u8; 8] = [5, 0, 0, 0, 0, 0, 0, 0]; + const CLOSE_PERMISSION: [u8; 8] = [6, 0, 0, 0, 0, 0, 0, 0]; + // Undelegation callback called by the delegation program + const UNDELEGATION_CALLBACK: [u8; 8] = [196, 28, 41, 206, 48, 37, 51, 167]; + + fn from_bytes(bytes: [u8; 8]) -> Result { + match bytes { + Self::INITIALIZE_COUNTER => Ok(Self::InitializeCounter), + Self::INCREASE_COUNTER => Ok(Self::IncreaseCounter), + Self::DELEGATE => Ok(Self::Delegate), + Self::COMMIT_AND_UNDELEGATE => Ok(Self::CommitAndUndelegate), + Self::CREATE_PERMISSION => Ok(Self::CreatePermission), + Self::UPDATE_PERMISSION => Ok(Self::UpdatePermission), + Self::CLOSE_PERMISSION => Ok(Self::ClosePermission), + Self::UNDELEGATION_CALLBACK => Ok(Self::UndelegationCallback), + _ => Err(ProgramError::InvalidInstructionData), + } + } +} + +// Do not allocate memory. +no_allocator!(); +// Use the no_std panic handler. +nostd_panic_handler!(); + +#[no_mangle] +#[allow(clippy::arithmetic_side_effects)] +pub unsafe extern "C" fn entrypoint(input: *mut u8) -> u64 { + const UNINIT: MaybeUninit = MaybeUninit::::uninit(); + let mut accounts = [UNINIT; { MAX_TX_ACCOUNTS }]; + + let (program_id, count, instruction_data) = + deserialize::(input, &mut accounts); + + match process_instruction( + program_id, + from_raw_parts(accounts.as_ptr() as _, count), + instruction_data, + ) { + Ok(()) => SUCCESS, + Err(error) => error.into(), + } +} + +/// Log an error. +#[cold] +fn log_error(_error: &ProgramError) { + #[cfg(feature = "logging")] + pinocchio_log::log!("Program error"); +} + +/// Process an instruction. +#[inline(always)] +pub fn process_instruction( + program_id: &Address, + accounts: &[AccountView], + instruction_data: &[u8], +) -> ProgramResult { + let result = inner_process_instruction(program_id, accounts, instruction_data); + result.inspect_err(log_error) +} + +/// Process an instruction. +#[inline(always)] +pub(crate) fn inner_process_instruction( + _program_id: &Address, + accounts: &[AccountView], + instruction_data: &[u8], +) -> ProgramResult { + if instruction_data.len() < 8 { + return Err(ProgramError::InvalidInstructionData); + } + + let discriminator: [u8; 8] = instruction_data[..8] + .try_into() + .map_err(|_| ProgramError::InvalidInstructionData)?; + let discriminator = InstructionDiscriminator::from_bytes(discriminator)?; + let payload = &instruction_data[8..]; + + #[cfg(feature = "logging")] + log_instruction(discriminator); + + match discriminator { + InstructionDiscriminator::InitializeCounter => { + let id = Address::new_from_array( + payload[..32] + .try_into() + .map_err(|_| ProgramError::InvalidInstructionData)?, + ); + process_initialize_counter(accounts, &id) + } + InstructionDiscriminator::IncreaseCounter => { + let increase_by = read_u64(payload)?; + process_increase_counter(accounts, increase_by) + } + InstructionDiscriminator::Delegate => process_delegate(accounts), + InstructionDiscriminator::CommitAndUndelegate => process_commit_and_undelegate(accounts), + InstructionDiscriminator::CreatePermission => process_create_permission(accounts), + InstructionDiscriminator::UpdatePermission => process_update_permission(accounts), + InstructionDiscriminator::ClosePermission => process_close_permission(accounts), + InstructionDiscriminator::UndelegationCallback => { + process_undelegation_callback(accounts, payload) + } + } +} + +fn read_u64(input: &[u8]) -> Result { + if input.len() < 8 { + return Err(ProgramError::InvalidInstructionData); + } + let mut bytes = [0u8; 8]; + bytes.copy_from_slice(&input[..8]); + Ok(u64::from_le_bytes(bytes)) +} + +#[allow(unused_variables)] +#[cfg(feature = "logging")] +fn log_instruction(discriminator: InstructionDiscriminator) { + match discriminator { + InstructionDiscriminator::InitializeCounter => { + pinocchio_log::log!("InitializeCounter"); + } + InstructionDiscriminator::IncreaseCounter => { + pinocchio_log::log!("IncreaseCounter"); + } + InstructionDiscriminator::Delegate => { + pinocchio_log::log!("Delegate"); + } + InstructionDiscriminator::CommitAndUndelegate => { + pinocchio_log::log!("CommitAndUndelegate"); + } + InstructionDiscriminator::CreatePermission => { + pinocchio_log::log!("CreatePermission"); + } + InstructionDiscriminator::UpdatePermission => { + pinocchio_log::log!("UpdatePermission"); + } + InstructionDiscriminator::ClosePermission => { + pinocchio_log::log!("ClosePermission"); + } + InstructionDiscriminator::UndelegationCallback => { + pinocchio_log::log!("UndelegationCallback"); + } + } +} diff --git a/pinocchio-ephemeral-permission-counter/src/lib.rs b/pinocchio-ephemeral-permission-counter/src/lib.rs new file mode 100644 index 00000000..efc85027 --- /dev/null +++ b/pinocchio-ephemeral-permission-counter/src/lib.rs @@ -0,0 +1,12 @@ +#![no_std] +#![allow(unexpected_cfgs)] + +mod entrypoint; +mod processor; +mod state; + +use solana_address::declare_id; + +pub use crate::entrypoint::process_instruction; + +declare_id!("AAWCg4eJHpdmUtM8Wz6Thm8FDi6C3vnMksf1pt2vfxhf"); diff --git a/pinocchio-ephemeral-permission-counter/src/processor.rs b/pinocchio-ephemeral-permission-counter/src/processor.rs new file mode 100644 index 00000000..91be32ec --- /dev/null +++ b/pinocchio-ephemeral-permission-counter/src/processor.rs @@ -0,0 +1,327 @@ +use crate::state::Counter; +use ephemeral_rollups_pinocchio::acl::{ + data_buffer_size, CloseEphemeralPermission, CreateEphemeralPermission, EphemeralMembersArgs, + Member, MemberFlags, UpdateEphemeralPermission, MAX_MEMBER_SIZE, +}; +use ephemeral_rollups_pinocchio::instruction::delegate_account; +use ephemeral_rollups_pinocchio::instruction::{commit_and_undelegate_accounts, undelegate}; +use ephemeral_rollups_pinocchio::types::DelegateConfig; +use pinocchio::sysvars::rent::Rent; +use pinocchio::sysvars::Sysvar; +use pinocchio::{ + account::AccountView, + cpi::{Seed, Signer}, + error::ProgramError, + Address, ProgramResult, +}; +use pinocchio_log::log; +use pinocchio_system::instructions::CreateAccount; + +/// Create and initialize the counter PDA for the initializer. +pub fn process_initialize_counter(accounts: &[AccountView], id: &Address) -> ProgramResult { + let [payer_info, counter_info, _system_program] = accounts else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + let (counter_pda, bump) = Counter::find_pda(id); + if &counter_pda != counter_info.address() { + return Err(ProgramError::InvalidSeeds); + } + + if counter_info.lamports() != 0 && counter_info.owned_by(&crate::ID) { + // Idempotent + return Ok(()); + } + + // Counter signer seeds + let bump_seed = [bump]; + let seeds_array: [Seed; 3] = [ + Seed::from(b"counter"), + Seed::from(id.as_ref()), + Seed::from(&bump_seed), + ]; + + // Signer with bump + let signer = Signer::from(&seeds_array); + + // Create counter account if it doesn't exist. + log!("Creating counter ..."); + let rent_exempt_lamports = Rent::get()?.try_minimum_balance(Counter::SIZE)?; + // TODO: Use method from SDK + let ephemeral_rent = (35 + 2 * MAX_MEMBER_SIZE as u64 + 60) * 32; + log!("Rent exempt lamports: {}", rent_exempt_lamports); + CreateAccount { + from: payer_info, + to: counter_info, + lamports: rent_exempt_lamports + ephemeral_rent, + space: Counter::SIZE as u64, + owner: &crate::ID, + } + .invoke_signed(&[signer.clone()])?; + log!("Counter created successfully"); + + // Initialize counter to 0. + let mut data = counter_info.try_borrow_mut()?; + let counter_data = Counter::load_mut(&mut data)?; + counter_data.bump = bump; + counter_data.count = 0; + counter_data.id = *id; + + Ok(()) +} + +/// Increase the counter PDA by the requested amount. +pub fn process_increase_counter(accounts: &[AccountView], increase_by: u64) -> ProgramResult { + let [counter_info] = accounts else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + let mut data = counter_info.try_borrow_mut()?; + let counter_data = Counter::load_mut(&mut data)?; + let counter_pda = Counter::derive_pda(&counter_data.id, &[counter_data.bump])?; + + if &counter_pda != counter_info.address() { + return Err(ProgramError::InvalidSeeds); + } + + log!( + "Increasing counter by {} from {} to {}", + increase_by, + counter_data.count, + counter_data.count + increase_by + ); + counter_data.count = counter_data + .count + .checked_add(increase_by) + .ok_or(ProgramError::ArithmeticOverflow)?; + + Ok(()) +} + +/// Delegate the counter PDA to the delegation program. +pub fn process_delegate(accounts: &[AccountView]) -> ProgramResult { + let [payer_info, counter_info, owner_program, delegation_buffer, delegation_record, delegation_metadata, _delegation_program, system_program, rest @ ..] = + accounts + else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + let validator = rest.first().map(|account| *account.address()); + + let (bump, id, counter_pda) = { + let data = counter_info.try_borrow()?; + let counter_data = Counter::load(&data)?; + let counter_pda = Counter::derive_pda(&counter_data.id, &[counter_data.bump])?; + (counter_data.bump, counter_data.id, counter_pda) + }; + + let seed_1 = b"counter"; + let seed_2 = id.as_ref(); + let seeds: &[&[u8]] = &[seed_1, seed_2]; + + let delegate_config = DelegateConfig { + validator, + ..Default::default() + }; + + if &counter_pda != counter_info.address() { + return Err(ProgramError::InvalidSeeds); + } + + delegate_account( + &[ + payer_info, + counter_info, + owner_program, + delegation_buffer, + delegation_record, + delegation_metadata, + system_program, + ], + seeds, + bump, + delegate_config, + )?; + + Ok(()) +} + +/// Commit the counter PDA state and undelegate it. +pub fn process_commit_and_undelegate(accounts: &[AccountView]) -> ProgramResult { + let [payer_info, counter_info, magic_program, magic_context] = accounts else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + if !payer_info.is_signer() { + return Err(ProgramError::MissingRequiredSignature); + } + + { + let data = counter_info.try_borrow()?; + let counter_data = Counter::load(&data)?; + let counter_pda = Counter::derive_pda(&counter_data.id, &[counter_data.bump])?; + + if &counter_pda != counter_info.address() { + return Err(ProgramError::InvalidSeeds); + } + } + + commit_and_undelegate_accounts( + payer_info, + &[counter_info.clone()], + magic_context, + magic_program, + None, + None, + )?; + + Ok(()) +} + +/// Create a new permission for the counter PDA. +pub fn process_create_permission(accounts: &[AccountView]) -> ProgramResult { + let [authority_info, counter_info, permission_program, permission_info, magic_program, vault_info] = + accounts + else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + let (bump, id, counter_pda) = { + let data = counter_info.try_borrow()?; + let counter_data = Counter::load(&data)?; + let counter_pda = Counter::derive_pda(&counter_data.id, &[counter_data.bump])?; + (counter_data.bump, counter_data.id, counter_pda) + }; + + if &counter_pda != counter_info.address() { + return Err(ProgramError::InvalidSeeds); + } + + let bump_seed = [bump]; + let seeds = [ + Seed::from(b"counter"), + Seed::from(id.as_ref()), + Seed::from(&bump_seed), + ]; + let signer = Signer::from(&seeds); + + CreateEphemeralPermission { + payer: counter_info, + permissioned_account: counter_info, + permission: permission_info, + permission_program: permission_program, + magic_program: magic_program, + vault: vault_info, + args: EphemeralMembersArgs { + members: &[Member { + flags: MemberFlags::from_acl_flag_byte( + MemberFlags::AUTHORITY | MemberFlags::TX_LOGS, + ), + pubkey: *authority_info.address(), + }], + is_private: true, + }, + } + .invoke_signed::<{ data_buffer_size(1) }>(&[signer])?; + + Ok(()) +} + +/// Update the permission for the counter PDA. +pub fn process_update_permission(accounts: &[AccountView]) -> ProgramResult { + let [payer_info, counter_info, permission_program, permission, magic_program, vault_info] = + accounts + else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + let (bump, id, counter_pda) = { + let data = counter_info.try_borrow()?; + let counter_data = Counter::load(&data)?; + let counter_pda = Counter::derive_pda(&counter_data.id, &[counter_data.bump])?; + (counter_data.bump, counter_data.id, counter_pda) + }; + + if &counter_pda != counter_info.address() { + return Err(ProgramError::InvalidSeeds); + } + + let bump_seed = [bump]; + let seeds = [ + Seed::from(b"counter"), + Seed::from(id.as_ref()), + Seed::from(&bump_seed), + ]; + let signer = Signer::from(&seeds); + + UpdateEphemeralPermission { + authority: payer_info, + authority_is_signer: true, + payer: counter_info, + permissioned_account: counter_info, + permission: permission, + permission_program: permission_program, + magic_program: magic_program, + vault: vault_info, + args: EphemeralMembersArgs { + members: &[Member { + flags: MemberFlags::default(), + pubkey: *payer_info.address(), + }], + is_private: true, + }, + } + .invoke_signed::<{ data_buffer_size(1) }>(&[signer])?; + + Ok(()) +} + +/// Close the permission for the counter PDA. +pub fn process_close_permission(accounts: &[AccountView]) -> ProgramResult { + let [payer_info, counter_info, permission_program, permission, magic_program, vault_info] = + accounts + else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + let (bump, id, counter_pda) = { + let data = counter_info.try_borrow()?; + let counter_data = Counter::load(&data)?; + let counter_pda = Counter::derive_pda(&counter_data.id, &[counter_data.bump])?; + (counter_data.bump, counter_data.id, counter_pda) + }; + + if &counter_pda != counter_info.address() { + return Err(ProgramError::InvalidSeeds); + } + + let bump_seed = [bump]; + let seeds = [ + Seed::from(b"counter"), + Seed::from(id.as_ref()), + Seed::from(&bump_seed), + ]; + let signer = Signer::from(&seeds); + + CloseEphemeralPermission { + authority: payer_info, + authority_is_signer: true, + payer: counter_info, + permissioned_account: counter_info, + permission: permission, + permission_program: permission_program, + magic_program: magic_program, + vault: vault_info, + } + .invoke_signed(&[signer])?; + + Ok(()) +} + +/// Handle the callback emitted by the delegation program on undelegation. +pub fn process_undelegation_callback(accounts: &[AccountView], ix_data: &[u8]) -> ProgramResult { + let [counter_info, buffer_acc, payer_info, _system_program, ..] = accounts else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + undelegate(counter_info, &crate::ID, buffer_acc, payer_info, ix_data)?; + Ok(()) +} diff --git a/pinocchio-ephemeral-permission-counter/src/state.rs b/pinocchio-ephemeral-permission-counter/src/state.rs new file mode 100644 index 00000000..83b2f0a4 --- /dev/null +++ b/pinocchio-ephemeral-permission-counter/src/state.rs @@ -0,0 +1,47 @@ +use pinocchio::{error::ProgramError, Address}; + +// State structure for the counter +#[repr(C)] +pub struct Counter { + pub id: Address, + pub count: u64, + pub bump: u8, + pub _pad: [u8; 7], +} + +impl Counter { + pub const SIZE: usize = 32 + 8 + 8; + + pub fn load(data: &[u8]) -> Result<&Self, ProgramError> { + if data.len() < Self::SIZE { + return Err(ProgramError::InvalidAccountData); + } + let ptr = data.as_ptr() as *const Self; + if !(ptr as usize).is_multiple_of(core::mem::align_of::()) { + return Err(ProgramError::InvalidAccountData); + } + // Safety: caller ensures the account data is valid for Counter. + Ok(unsafe { &*ptr }) + } + + pub fn load_mut(data: &mut [u8]) -> Result<&mut Self, ProgramError> { + if data.len() < Self::SIZE { + return Err(ProgramError::InvalidAccountData); + } + let ptr = data.as_mut_ptr() as *mut Self; + if !(ptr as usize).is_multiple_of(core::mem::align_of::()) { + return Err(ProgramError::InvalidAccountData); + } + // Safety: caller ensures the account data is valid for Counter. + Ok(unsafe { &mut *ptr }) + } + + pub fn find_pda(id: &Address) -> (Address, u8) { + Address::find_program_address(&[b"counter", id.as_ref()], &crate::ID) + } + + pub fn derive_pda(id: &Address, bump: &[u8]) -> Result { + Address::create_program_address(&[b"counter", id.as_ref(), bump], &crate::ID) + .map_err(|_| ProgramError::InvalidSeeds) + } +} diff --git a/pinocchio-ephemeral-permission-counter/tests/pinocchio-secret-counter.test.ts b/pinocchio-ephemeral-permission-counter/tests/pinocchio-secret-counter.test.ts new file mode 100644 index 00000000..c31ef89a --- /dev/null +++ b/pinocchio-ephemeral-permission-counter/tests/pinocchio-secret-counter.test.ts @@ -0,0 +1,544 @@ +import { + Keypair, + PublicKey, + SystemProgram, + Transaction, + TransactionInstruction, + Connection, + sendAndConfirmTransaction, +} from "@solana/web3.js"; +import * as fs from "fs"; +import { + DELEGATION_PROGRAM_ID, + delegationRecordPdaFromDelegatedAccount, + delegationMetadataPdaFromDelegatedAccount, + delegateBufferPdaFromDelegatedAccountAndOwnerProgram, + MAGIC_CONTEXT_ID, + MAGIC_PROGRAM_ID, + PERMISSION_PROGRAM_ID, + getAuthToken, + GetCommitmentSignature, +} from "@magicblock-labs/ephemeral-rollups-sdk"; +import * as nacl from "tweetnacl"; +import path from "path"; + +import { describe, it, expect, beforeAll } from "vitest"; + +import dotenv from "dotenv"; +import { homedir } from "os"; +dotenv.config(); + +const VAULT = new PublicKey("MagicVau1t999999999999999999999999999999999"); +const PROGRAM_ID = new PublicKey( + "AAWCg4eJHpdmUtM8Wz6Thm8FDi6C3vnMksf1pt2vfxhf", +); + +describe("pinocchio-ephemeral-secret-counter", async () => { + // Open user keypair from private key or default location + const KEYPAIR = + process.env.PRIVATE_KEY || + fs.readFileSync(path.join(homedir(), "/.config/solana/id.json"), "utf8"); + const userKeypair = Keypair.fromSecretKey( + Uint8Array.from(JSON.parse(KEYPAIR)), + ); + + // Set up PER connection + const teeUrl = + process.env.EPHEMERAL_PROVIDER_ENDPOINT || + "https://devnet-tee.magicblock.app"; + const teeWsUrl = + process.env.EPHEMERAL_WS_ENDPOINT || "wss://devnet-tee.magicblock.app"; + const authToken = teeUrl.includes("tee") + ? ( + await getAuthToken( + teeUrl, + userKeypair.publicKey, + (message: Uint8Array) => + Promise.resolve(nacl.sign.detached(message, userKeypair.secretKey)), + ) + ).token + : ""; + const teeUserUrl = authToken ? `${teeUrl}?token=${authToken}` : teeUrl; + const teeUserWsUrl = authToken ? `${teeWsUrl}?token=${authToken}` : teeWsUrl; + console.log( + "User Explorer URL:", + `https://explore.solana.com/?cluster=custom&customUrl=${teeUserUrl}`, + ); + + // Set up a connection to blockchain cluster + const connectionBaseLayer = new Connection( + process.env.PROVIDER_ENDPOINT || "https://api.devnet.solana.com", + { wsEndpoint: process.env.WS_ENDPOINT || "wss://api.devnet.solana.com" }, + ); + const connectionEphemeralRollup = new Connection( + process.env.EPHEMERAL_PROVIDER_ENDPOINT || teeUserUrl, + { wsEndpoint: process.env.EPHEMERAL_WS_ENDPOINT || teeUserWsUrl }, + ); + console.log("Base Layer Connection: ", connectionBaseLayer.rpcEndpoint); + console.log( + "Ephemeral Rollup Connection: ", + connectionEphemeralRollup.rpcEndpoint, + ); + + const id = Keypair.generate().publicKey; + let validator: PublicKey = new PublicKey( + "MTEWGuqxUpYZGFJQcp8tLN7x5v9BSeoFHYWQQ3n3xzo", + ); + const unauthorizedKeypair = Keypair.generate(); + const unauthorizedAuthToken = teeUrl.includes("tee") + ? await getAuthToken( + teeUrl, + unauthorizedKeypair.publicKey, + (message: Uint8Array) => + Promise.resolve( + nacl.sign.detached(message, unauthorizedKeypair.secretKey), + ), + ) + : ""; + const unauthorizedConnection = teeUrl.includes("tee") + ? new Connection( + `${process.env.EPHEMERAL_PROVIDER_ENDPOINT || teeUrl}?token=${unauthorizedAuthToken.token}`, + { + wsEndpoint: `${process.env.EPHEMERAL_WS_ENDPOINT || teeWsUrl}?token=${unauthorizedAuthToken.token}`, + }, + ) + : new Connection(process.env.EPHEMERAL_PROVIDER_ENDPOINT || teeUrl, { + wsEndpoint: process.env.EPHEMERAL_WS_ENDPOINT || teeWsUrl, + }); + console.log("Unauthorized Connection: ", unauthorizedConnection.rpcEndpoint); + + // Get pda of counter_account + const [counterPda, bump] = PublicKey.findProgramAddressSync( + [Buffer.from("counter"), id.toBuffer()], + PROGRAM_ID, + ); + console.log("Program ID: ", PROGRAM_ID.toString()); + console.log("Counter PDA: ", counterPda.toString()); + console.log("Bump: ", bump); + + // Get permission PDA + const [permissionPda] = PublicKey.findProgramAddressSync( + [Buffer.from("permission:"), counterPda.toBuffer()], + PERMISSION_PROGRAM_ID, + ); + console.log("Permission PDA: ", permissionPda.toString()); + + beforeAll(async () => { + const response = await fetch(teeUrl, { + method: "POST", + body: JSON.stringify({ + method: "getIdentity", + jsonrpc: "2.0", + id: "123456789", + }), + }); + const data: any = await response.json(); + console.log("Validator: ", data.result.identity); + validator = new PublicKey(data.result.identity); + }); + + it("Initialize counter on Solana", async () => { + const ixData = Buffer.concat([ + Buffer.from([0, 0, 0, 0, 0, 0, 0, 0]), + id.toBuffer(), + ]); + const tx = new Transaction().add( + new TransactionInstruction({ + programId: PROGRAM_ID, + data: ixData, + keys: [ + { + pubkey: userKeypair.publicKey, + isSigner: true, + isWritable: true, + }, + { + pubkey: counterPda, + isSigner: false, + isWritable: true, + }, + { + pubkey: SystemProgram.programId, + isSigner: false, + isWritable: false, + }, + ], + }), + ); + + const txHash = await sendAndConfirmTransaction( + connectionBaseLayer, + tx, + [userKeypair], + { + commitment: "confirmed", + }, + ); + console.log(`(Base Layer) Initialize txHash: ${txHash}`); + expect(txHash).toBeDefined(); + + let counter = await connectionBaseLayer.getAccountInfo(counterPda, { + commitment: "confirmed", + }); + expect(counter).toBeDefined(); + expect(counter?.data.subarray(32, 40)).toEqual( + Buffer.from([0, 0, 0, 0, 0, 0, 0, 0]), + ); + }); + + it("Increase counter on Solana", async () => { + const ixData = Buffer.concat([ + Buffer.from([1, 0, 0, 0, 0, 0, 0, 0]), + Buffer.from([1, 0, 0, 0, 0, 0, 0, 0]), + ]); + const tx = new Transaction().add( + new TransactionInstruction({ + programId: PROGRAM_ID, + data: ixData, + keys: [ + { + pubkey: counterPda, + isSigner: false, + isWritable: true, + }, + ], + }), + ); + + const txHash = await sendAndConfirmTransaction( + connectionBaseLayer, + tx, + [userKeypair], + { + commitment: "confirmed", + }, + ); + console.log(`(Base Layer) Increment txHash: ${txHash}`); + expect(txHash).toBeDefined(); + + let counter = await connectionBaseLayer.getAccountInfo(counterPda, { + commitment: "confirmed", + }); + expect(counter).toBeDefined(); + expect(counter?.data.subarray(32, 40)).toEqual( + Buffer.from([1, 0, 0, 0, 0, 0, 0, 0]), + ); + }); + + it("Delegate counter to ER", async function () { + const ixData = Buffer.from([2, 0, 0, 0, 0, 0, 0, 0]); + const tx = new Transaction().add( + new TransactionInstruction({ + programId: PROGRAM_ID, + data: ixData, + keys: [ + // Initializer + { + pubkey: userKeypair.publicKey, + isSigner: true, + isWritable: true, + }, + // Counter Account + { + pubkey: counterPda, + isSigner: false, + isWritable: true, + }, + // Owner Program + { + pubkey: PROGRAM_ID, + isSigner: false, + isWritable: false, + }, + // Delegation Buffer + { + pubkey: delegateBufferPdaFromDelegatedAccountAndOwnerProgram( + counterPda, + PROGRAM_ID, + ), + isSigner: false, + isWritable: true, + }, + // Delegation Record + { + pubkey: delegationRecordPdaFromDelegatedAccount(counterPda), + isSigner: false, + isWritable: true, + }, + // Delegation Metadata + { + pubkey: delegationMetadataPdaFromDelegatedAccount(counterPda), + isSigner: false, + isWritable: true, + }, + // Delegation Program + { + pubkey: DELEGATION_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, + // System Program + { + pubkey: SystemProgram.programId, + isSigner: false, + isWritable: false, + }, + // PER Validator + { + pubkey: validator, + isSigner: false, + isWritable: false, + }, + ], + }), + ); + + const txHash = await sendAndConfirmTransaction( + connectionBaseLayer, + tx, + [userKeypair], + { + commitment: "confirmed", + }, + ); + console.log(`(Base Layer) Delegate txHash: ${txHash}`); + expect(txHash).toBeDefined(); + }); + + it("Increase counter on ER", async () => { + const ixData = Buffer.concat([ + Buffer.from([1, 0, 0, 0, 0, 0, 0, 0]), + Buffer.from([1, 0, 0, 0, 0, 0, 0, 0]), + ]); + const tx = new Transaction().add( + new TransactionInstruction({ + programId: PROGRAM_ID, + data: ixData, + keys: [ + { + pubkey: counterPda, + isSigner: false, + isWritable: true, + }, + ], + }), + ); + + const txHash = await sendAndConfirmTransaction( + connectionEphemeralRollup, + tx, + [userKeypair], + { + commitment: "confirmed", + }, + ); + console.log(`(ER) Increment txHash: ${txHash}`); + expect(txHash).toBeDefined(); + + // Check readability + let counter = await connectionEphemeralRollup.getAccountInfo(counterPda); + expect(counter).toBeDefined(); + expect(counter?.data.subarray(32, 40)).toEqual( + Buffer.from([2, 0, 0, 0, 0, 0, 0, 0]), + ); + + counter = await unauthorizedConnection.getAccountInfo(counterPda); + expect(counter).toBeDefined(); + expect(counter?.data.subarray(32, 40)).toEqual( + Buffer.from([2, 0, 0, 0, 0, 0, 0, 0]), + ); + }); + + it("Create permission on ER", async () => { + const ixData = Buffer.from([4, 0, 0, 0, 0, 0, 0, 0]); + const tx = new Transaction().add( + new TransactionInstruction({ + programId: PROGRAM_ID, + data: ixData, + keys: [ + { + pubkey: userKeypair.publicKey, + isSigner: true, + isWritable: true, + }, + { + pubkey: counterPda, + isSigner: false, + isWritable: true, + }, + { + pubkey: PERMISSION_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, + { + pubkey: permissionPda, + isSigner: false, + isWritable: true, + }, + { + pubkey: MAGIC_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, + { + pubkey: VAULT, + isSigner: false, + isWritable: true, + }, + ], + }), + ); + + const txHash = await sendAndConfirmTransaction( + connectionEphemeralRollup, + tx, + [userKeypair], + { + commitment: "confirmed", + skipPreflight: true, + }, + ); + console.log(`(ER) Create permission txHash: ${txHash}`); + expect(txHash).toBeDefined(); + + // Check readability + let counter = await connectionEphemeralRollup.getAccountInfo(counterPda); + expect(counter).toBeDefined(); + expect(counter?.data.subarray(32, 40)).toEqual( + Buffer.from([2, 0, 0, 0, 0, 0, 0, 0]), + ); + + counter = await unauthorizedConnection.getAccountInfo(counterPda); + if (teeUrl.includes("tee")) { + expect(counter).toBeNull(); + } else { + expect(counter).toBeDefined(); + expect(counter?.data.subarray(32, 40)).toEqual( + Buffer.from([2, 0, 0, 0, 0, 0, 0, 0]), + ); + } + + // Check permission + let permission = + await connectionEphemeralRollup.getAccountInfo(permissionPda); + expect(permission).toBeDefined(); + expect(permission?.data.subarray(36, 68)).toEqual(PROGRAM_ID.toBuffer()); + expect(permission?.data.subarray(69, 101)).toEqual( + userKeypair.publicKey.toBuffer(), + ); + }); + + it("Close permission on ER", async () => { + const ixData = Buffer.from([6, 0, 0, 0, 0, 0, 0, 0]); + const tx = new Transaction().add( + new TransactionInstruction({ + programId: PROGRAM_ID, + data: ixData, + keys: [ + { + pubkey: userKeypair.publicKey, + isSigner: true, + isWritable: true, + }, + { + pubkey: counterPda, + isSigner: false, + isWritable: true, + }, + { + pubkey: PERMISSION_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, + { + pubkey: permissionPda, + isSigner: false, + isWritable: true, + }, + { + pubkey: MAGIC_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, + { + pubkey: VAULT, + isSigner: false, + isWritable: true, + }, + ], + }), + ); + + const txHash = await connectionEphemeralRollup.sendTransaction( + tx, + [userKeypair], + { skipPreflight: true }, + ); + console.log(`(ER) Close permission txHash: ${txHash}`); + const result = await connectionEphemeralRollup.confirmTransaction(txHash); + expect(result.value?.err).toBeNull(); + expect(txHash).toBeDefined(); + + // Check readability + let counter = await connectionEphemeralRollup.getAccountInfo(counterPda); + expect(counter).toBeDefined(); + expect(counter?.data.subarray(32, 40)).toEqual( + Buffer.from([2, 0, 0, 0, 0, 0, 0, 0]), + ); + + counter = await unauthorizedConnection.getAccountInfo(counterPda); + expect(counter).toBeDefined(); + expect(counter?.data.subarray(32, 40)).toEqual( + Buffer.from([2, 0, 0, 0, 0, 0, 0, 0]), + ); + }); + + it.skip("Commit and undelegate counter on ER to Solana", async function () { + const ixData = Buffer.from([3, 0, 0, 0, 0, 0, 0, 0]); + const tx = new Transaction().add( + new TransactionInstruction({ + programId: PROGRAM_ID, + data: ixData, + keys: [ + { + pubkey: userKeypair.publicKey, + isSigner: true, + isWritable: true, + }, + { + pubkey: counterPda, + isSigner: false, + isWritable: true, + }, + { + pubkey: MAGIC_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, + { + pubkey: MAGIC_CONTEXT_ID, + isSigner: false, + isWritable: true, + }, + ], + }), + ); + const txHash = await sendAndConfirmTransaction( + connectionEphemeralRollup, + tx, + [userKeypair], + { + commitment: "confirmed", + }, + ); + console.log(`(ER) Undelegate txHash: ${txHash}`); + expect(txHash).toBeDefined(); + + await GetCommitmentSignature(txHash, connectionEphemeralRollup); + + // Check readability + let counter = await connectionBaseLayer.getAccountInfo(counterPda); + expect(counter?.owner.equals(PROGRAM_ID)).toBe(true); + }); +}); diff --git a/pinocchio-ephemeral-permission-counter/tsconfig.json b/pinocchio-ephemeral-permission-counter/tsconfig.json new file mode 100644 index 00000000..42717109 --- /dev/null +++ b/pinocchio-ephemeral-permission-counter/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ES2020"], + "types": ["node", "vitest"], + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true + }, + "include": ["tests/**/*.ts"] +} diff --git a/pinocchio-ephemeral-permission-counter/yarn.lock b/pinocchio-ephemeral-permission-counter/yarn.lock new file mode 100644 index 00000000..c2b25232 --- /dev/null +++ b/pinocchio-ephemeral-permission-counter/yarn.lock @@ -0,0 +1,2894 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@babel/runtime@npm:^7.25.0": + version: 7.29.2 + resolution: "@babel/runtime@npm:7.29.2" + checksum: 10c0/30b80a0140d16467792e1bbeb06f655b0dab70407da38dfac7fedae9c859f9ae9d846ef14ad77bd3814c064295fe9b1bc551f1541ea14646ae9f22b71a8bc17a + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": "npm:0.3.9" + checksum: 10c0/05c5368c13b662ee4c122c7bfbe5dc0b613416672a829f3e78bc49a357a197e0218d6e74e7c66cfcd04e15a179acab080bd3c69658c9fbefd0e1ccd950a07fc6 + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" + dependencies: + "@sinclair/typebox": "npm:^0.27.8" + checksum: 10c0/b329e89cd5f20b9278ae1233df74016ebf7b385e0d14b9f4c1ad18d096c4c19d1e687aa113a9c976b16ec07f021ae53dea811fb8c1248a50ac34fbe009fdf6be + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.5.5": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.0.3" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + checksum: 10c0/fa425b606d7c7ee5bfa6a31a7b050dd5814b4082f318e0e4190f991902181b4330f43f4805db1dd4f2433fd0ed9cc7a7b9c2683f1deeab1df1b0a98b1e24055b + languageName: node + linkType: hard + +"@magicblock-labs/ephemeral-rollups-sdk@npm:^0.11.1": + version: 0.11.2 + resolution: "@magicblock-labs/ephemeral-rollups-sdk@npm:0.11.2" + dependencies: + "@noble/curves": "npm:^1.4.2" + "@noble/hashes": "npm:^1.4.0" + "@phala/dcap-qvl": "npm:^0.3.9" + "@solana/web3.js": "npm:^1.98.0" + bs58: "npm:^6.0.0" + rpc-websockets: "npm:^9.0.4" + tweetnacl: "npm:^1.0.3" + typescript: "npm:^5.3.0" + checksum: 10c0/8ac06dd13c94e0208899b2e7bcc600874c85bbdb666fc946fcdee84d0010a7f88145f72300a29d4d710d208da9395e964ae718587851dd504efc573f45a1dcf4 + languageName: node + linkType: hard + +"@noble/curves@npm:^1.4.2": + version: 1.9.7 + resolution: "@noble/curves@npm:1.9.7" + dependencies: + "@noble/hashes": "npm:1.8.0" + checksum: 10c0/150014751ebe8ca06a8654ca2525108452ea9ee0be23430332769f06808cddabfe84f248b6dbf836916bc869c27c2092957eec62c7506d68a1ed0a624017c2a3 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.8.0, @noble/hashes@npm:^1.4.0": + version: 1.8.0 + resolution: "@noble/hashes@npm:1.8.0" + checksum: 10c0/06a0b52c81a6fa7f04d67762e08b2c476a00285858150caeaaff4037356dd5e119f45b2a530f638b77a5eeca013168ec1b655db41bae3236cb2e9d511484fc77 + languageName: node + linkType: hard + +"@peculiar/asn1-schema@npm:^2.3.13, @peculiar/asn1-schema@npm:^2.7.0": + version: 2.7.0 + resolution: "@peculiar/asn1-schema@npm:2.7.0" + dependencies: + "@peculiar/utils": "npm:^2.0.2" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10c0/6d799b62e8e9d7eed63a3044201ced4efef923011216c17da017a568bdb3c0f56abcea24d41df24916d1731e4a6920f8d84176f3e044f44f6541c83ae31fe670 + languageName: node + linkType: hard + +"@peculiar/asn1-x509@npm:^2.3.13": + version: 2.7.0 + resolution: "@peculiar/asn1-x509@npm:2.7.0" + dependencies: + "@peculiar/asn1-schema": "npm:^2.7.0" + "@peculiar/utils": "npm:^2.0.2" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10c0/095d1b5fd0dfb9ba9cffe5ce9fad31173f5184896d7d51270bc174745c5c6720f37ec83c8ac7b1b6db7100a94c550045d9ad37ce8f162d19cc93ebce6620f625 + languageName: node + linkType: hard + +"@peculiar/utils@npm:^2.0.2": + version: 2.0.3 + resolution: "@peculiar/utils@npm:2.0.3" + dependencies: + tslib: "npm:^2.8.1" + checksum: 10c0/e111a51c83334d6ff3c96b993ed0d718210620f3ad176853a4bf229f1cf4cd14e9388075318351b188862d34d2192d80f206f6bea53aa1459df3ec638cbcdbd5 + languageName: node + linkType: hard + +"@phala/dcap-qvl@npm:^0.3.9": + version: 0.3.9 + resolution: "@phala/dcap-qvl@npm:0.3.9" + dependencies: + "@peculiar/asn1-schema": "npm:^2.3.13" + "@peculiar/asn1-x509": "npm:^2.3.13" + asn1.js: "npm:^5.4.1" + bn.js: "npm:^5.2.2" + buffer: "npm:^6.0.3" + elliptic: "npm:^6.6.1" + hash.js: "npm:^1.1.7" + node-fetch: "npm:^2.7.0" + bin: + test_case: test_case.js + checksum: 10c0/149609ae68876c2253730aa93cc721160086594eda5c7963cc729b97952203f8a87fa080b31db8e50fdea0a3ec9f3a1f658159de6bc3ebfb46757e7e2252f0ac + languageName: node + linkType: hard + +"@rollup/rollup-android-arm-eabi@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.60.3" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-android-arm64@npm:4.60.3" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-darwin-arm64@npm:4.60.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-darwin-x64@npm:4.60.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.60.3" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-freebsd-x64@npm:4.60.3" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.60.3" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.60.3" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.60.3" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.60.3" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-loong64-gnu@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.60.3" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-loong64-musl@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-linux-loong64-musl@npm:4.60.3" + conditions: os=linux & cpu=loong64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-ppc64-gnu@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.60.3" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-ppc64-musl@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-linux-ppc64-musl@npm:4.60.3" + conditions: os=linux & cpu=ppc64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.60.3" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-musl@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.60.3" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.60.3" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.60.3" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.60.3" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-openbsd-x64@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-openbsd-x64@npm:4.60.3" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-openharmony-arm64@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.60.3" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.60.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.60.3" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-gnu@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-win32-x64-gnu@npm:4.60.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.60.3": + version: 4.60.3 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.60.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.10 + resolution: "@sinclair/typebox@npm:0.27.10" + checksum: 10c0/ca42a02817656dbdae464ed4bb8aca6ad4718d7618e270760fea84a834ad0ecc1a22eba51421f09e5047174571131356ff3b5d80d609ced775d631df7b404b0d + languageName: node + linkType: hard + +"@solana-program/system@npm:^0.10.0": + version: 0.10.0 + resolution: "@solana-program/system@npm:0.10.0" + peerDependencies: + "@solana/kit": ^5.0 + checksum: 10c0/4cc3164d49fe7b10e9c0c89493f738e2d4294e2eae40fafee56b01dfb50b939c88f82eb06d5393333743b0edee961b03e947afcc20e6965252576900266ec52e + languageName: node + linkType: hard + +"@solana/accounts@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/accounts@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/rpc-spec": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/9851005767107f198a7d4dbd5498b271236d83527b25fc05d7beb5b347ac072fb51119b9863d2033e89bb9ee06e78289a1a71b0147d19a444c28ba36f19f970b + languageName: node + linkType: hard + +"@solana/addresses@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/addresses@npm:5.5.1" + dependencies: + "@solana/assertions": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/nominal-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/4908e3019c930c2c4a13528eae7a5bfac25400b4173144180a68bcbac43d1b90b0771bf952711503814440547ed45d32c3b450bac0aff19974035111e0f79865 + languageName: node + linkType: hard + +"@solana/assertions@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/assertions@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/d1a8fbfdd8e551d84b7624d645fcae66a26d9022828795f10b252f45fb84299088cec75e8f156895bb930c977db1bcbdda8ceb011f373fb288f0adb5ea4ecd31 + languageName: node + linkType: hard + +"@solana/buffer-layout@npm:^4.0.1": + version: 4.0.1 + resolution: "@solana/buffer-layout@npm:4.0.1" + dependencies: + buffer: "npm:~6.0.3" + checksum: 10c0/6535f3908cf6dfc405b665795f0c2eaa0482a8c6b1811403945cf7b450e7eb7b40acce3e8af046f2fcc3eea1a15e61d48c418315d813bee4b720d56b00053305 + languageName: node + linkType: hard + +"@solana/codecs-core@npm:2.3.0": + version: 2.3.0 + resolution: "@solana/codecs-core@npm:2.3.0" + dependencies: + "@solana/errors": "npm:2.3.0" + peerDependencies: + typescript: ">=5.3.3" + checksum: 10c0/efef080b94fe572bcfeac9f1c0b222700203bd2b45c9590e77445b35335d0ed2582d1cc4e533003d2090c385c06eb93dfa05388f9766182aa60ce85eacfd8042 + languageName: node + linkType: hard + +"@solana/codecs-core@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/codecs-core@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/a66cd3e3c9a0fcf369be5c3369463db03f4b1e1aa0d322d6cb8440613dcc83608dd52501ff2ee3c56daed2b1f2b07751cfa1fe1aeb584a306a9e14175b0ca994 + languageName: node + linkType: hard + +"@solana/codecs-data-structures@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/codecs-data-structures@npm:5.5.1" + dependencies: + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-numbers": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/db88246a2fc3d4c3c7d69d5e9ce7fab815be4e10e0b1519ed00454c7ac2189fc3dd2d2ae0cb05a77d560ccdc615652122cfada59e34285ce08545474542e4874 + languageName: node + linkType: hard + +"@solana/codecs-numbers@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/codecs-numbers@npm:5.5.1" + dependencies: + "@solana/codecs-core": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/1802ec289a912b086c031c8da7f856ffb2c5a581b2fef9de5bd0ea23e192ca472cc01f1a46747e0f9c1505c826f404bf2862d7403175688136b87056d22fc441 + languageName: node + linkType: hard + +"@solana/codecs-numbers@npm:^2.1.0": + version: 2.3.0 + resolution: "@solana/codecs-numbers@npm:2.3.0" + dependencies: + "@solana/codecs-core": "npm:2.3.0" + "@solana/errors": "npm:2.3.0" + peerDependencies: + typescript: ">=5.3.3" + checksum: 10c0/0780d60771e451cfe22ea614315fed2f37507aa62f83cddb900186f88d4d4532eea298d74796d1dbc8c34321a570b5d9ada25e8f4a5aeadd57aa4e688b4465f5 + languageName: node + linkType: hard + +"@solana/codecs-strings@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/codecs-strings@npm:5.5.1" + dependencies: + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-numbers": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: ^5.0.0 + peerDependenciesMeta: + fastestsmallesttextencoderdecoder: + optional: true + typescript: + optional: true + checksum: 10c0/16cf7f6edee96a11862bf41cc31e0162848ecd5ba67826eee3e5fe9f10007631db5f34f794fcf44bb075cbcaf43843e34632659105f75a02c7ff3d703ee49325 + languageName: node + linkType: hard + +"@solana/codecs@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/codecs@npm:5.5.1" + dependencies: + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-data-structures": "npm:5.5.1" + "@solana/codecs-numbers": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/options": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/bf576cb014f342edddb4b77f83a111ceecfc5709ecaa6225c71cbb40b3d31aba26f3c3f5787684d472b1ed0c705df10be517fdbab659cf43cd7a6e21bea9a9c1 + languageName: node + linkType: hard + +"@solana/errors@npm:2.3.0": + version: 2.3.0 + resolution: "@solana/errors@npm:2.3.0" + dependencies: + chalk: "npm:^5.4.1" + commander: "npm:^14.0.0" + peerDependencies: + typescript: ">=5.3.3" + bin: + errors: bin/cli.mjs + checksum: 10c0/55bef8828b4a6bb5222d3dbfe27162684906ba90753126b9cfd1e8e39c6c29209c0f4f331cfb1d3d1cf43fd456022af92337b4234a145d8de292588197c12c71 + languageName: node + linkType: hard + +"@solana/errors@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/errors@npm:5.5.1" + dependencies: + chalk: "npm:5.6.2" + commander: "npm:14.0.2" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + bin: + errors: bin/cli.mjs + checksum: 10c0/cafa60aa4ca91c78b0d85e5d296c9080fc537b0c62ba1bc3d3d00eaad96d2894178849be478e653cf963a2d18d71b54e0f58f319a7d77f6dbfdd5845af4c6a08 + languageName: node + linkType: hard + +"@solana/fast-stable-stringify@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/fast-stable-stringify@npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/b116c515e71cdace7a2e45c001de486c528e178f6170dc6faaea33a3a076a5ddd7806302584e480ef0dbf9f84c9a808cbc99a068c48b0e777bc5b5e178291ed9 + languageName: node + linkType: hard + +"@solana/functional@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/functional@npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/17f60572407006b8913529019d928b0b43b6c24798fd743673a7878e8b8db25ebe27b7eb9ef0e28cc24773d34acbb1d5fe617f9096d527efc62c9e6719f7ada2 + languageName: node + linkType: hard + +"@solana/instruction-plans@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/instruction-plans@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + "@solana/instructions": "npm:5.5.1" + "@solana/keys": "npm:5.5.1" + "@solana/promises": "npm:5.5.1" + "@solana/transaction-messages": "npm:5.5.1" + "@solana/transactions": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/9f1cde9b925f1ecc01f3ceb6b87ba6154befb991ad58b176f58f2f210d75968d2dc26adada623d54eb5039a4116c5f8bf48e5153b813720dfc91301c2e37eb42 + languageName: node + linkType: hard + +"@solana/instructions@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/instructions@npm:5.5.1" + dependencies: + "@solana/codecs-core": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/72b3d599e8016ec6fdb34b3cdbc9cca76a8153e911fd18bee3ea9af8caf19591615425eb3c24aa04ee5da16f87fc568a17574532859b7a50c829c49397458dc4 + languageName: node + linkType: hard + +"@solana/keys@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/keys@npm:5.5.1" + dependencies: + "@solana/assertions": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/nominal-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/1b76a7c5b15a331ebc51c003f2f2e248c91a0f3c09659de855b05757c203c7a0e165c18c3a1b3636fd919859eb58b3e51afac234aa186e01305d4c5a38a3255d + languageName: node + linkType: hard + +"@solana/kit@npm:^5.4.0": + version: 5.5.1 + resolution: "@solana/kit@npm:5.5.1" + dependencies: + "@solana/accounts": "npm:5.5.1" + "@solana/addresses": "npm:5.5.1" + "@solana/codecs": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/functional": "npm:5.5.1" + "@solana/instruction-plans": "npm:5.5.1" + "@solana/instructions": "npm:5.5.1" + "@solana/keys": "npm:5.5.1" + "@solana/offchain-messages": "npm:5.5.1" + "@solana/plugin-core": "npm:5.5.1" + "@solana/programs": "npm:5.5.1" + "@solana/rpc": "npm:5.5.1" + "@solana/rpc-api": "npm:5.5.1" + "@solana/rpc-parsed-types": "npm:5.5.1" + "@solana/rpc-spec-types": "npm:5.5.1" + "@solana/rpc-subscriptions": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + "@solana/signers": "npm:5.5.1" + "@solana/sysvars": "npm:5.5.1" + "@solana/transaction-confirmation": "npm:5.5.1" + "@solana/transaction-messages": "npm:5.5.1" + "@solana/transactions": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/391fd781c28c2550dae77395b0bc4e37799da13695be03c5c57e82c31b4556c29b8ac4853087908549415c419ed758c34c1ac9cdae37c4e0d28b4c9be6867b81 + languageName: node + linkType: hard + +"@solana/nominal-types@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/nominal-types@npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/aa0f5b850c6e74d6f883d9a2513f561112d531cda750ba75efbc84a524ffc69e014740f5fac308b42499b5ea4fcaa5d34fe3acd334ef65dffe22ba822c476fbc + languageName: node + linkType: hard + +"@solana/offchain-messages@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/offchain-messages@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-data-structures": "npm:5.5.1" + "@solana/codecs-numbers": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/keys": "npm:5.5.1" + "@solana/nominal-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/93ba0fec4a3387e4809d8ebbdeb71901d69821cdd4b3645ee054197f9d564227cb76d66b509b98f1902fe522575662824ea58e583665c624dfb05e9a0d52b6dc + languageName: node + linkType: hard + +"@solana/options@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/options@npm:5.5.1" + dependencies: + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-data-structures": "npm:5.5.1" + "@solana/codecs-numbers": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/d4ab205e1286ba02a2ad97d8a3ad22e57798ce8f0fd77f3734f2c4a923c9fc7f0f949d5ceeb8b33eaf5484460c49ed0d9138f3eff5a571e754488f8aa4819269 + languageName: node + linkType: hard + +"@solana/plugin-core@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/plugin-core@npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/6d981acfde238517692126f66594598b203eec84753677851f0dc038d01a8c55603aff1319513ba5306a29bf6b0018a1ad2d3b9de49d984acc0ecf76abfffbaa + languageName: node + linkType: hard + +"@solana/programs@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/programs@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/4d31ca06655366d368a853772559d5853494e82c559a02b8f6c4f90d390fb196df50b2d0d0540c2f7bbb7cc0abb3ac2e5694c2148a2bcc034a33dd64b7a105f4 + languageName: node + linkType: hard + +"@solana/promises@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/promises@npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/d9818a5d38b85a17f74782457d8953c95835cc1190a63ff6749610e5f6272ee50d08f5720a84f9a5885e0faa94390210b86d927cf81c95f63707a122dfae100d + languageName: node + linkType: hard + +"@solana/rpc-api@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-api@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/keys": "npm:5.5.1" + "@solana/rpc-parsed-types": "npm:5.5.1" + "@solana/rpc-spec": "npm:5.5.1" + "@solana/rpc-transformers": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + "@solana/transaction-messages": "npm:5.5.1" + "@solana/transactions": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/7ac47bc771d825c251f18d92e0eaef8a1f90542e5313249f88970aff666e8aa4ba446d9efc0ded2188d60c41512c09aa285bf1847bd0c439e1a4ddcb20748fc4 + languageName: node + linkType: hard + +"@solana/rpc-parsed-types@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-parsed-types@npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/b042b4d252e7b31a2e2cdc957711f0ecc438d1667da7414c0da25218fb439b1de2de0c1845a2ca776cddd8e399ba886a43a1f72a50e1ae0790ea6a500c90cfdb + languageName: node + linkType: hard + +"@solana/rpc-spec-types@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-spec-types@npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/19b4c0e3de748db5520ab4f21a97e7ddf8e5f7a722bf635eb62aacd72ee334b2b8ab8f9343bf660055ad61f4ff71cc402e52dd41b3742944e71f54e67bf82f5a + languageName: node + linkType: hard + +"@solana/rpc-spec@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-spec@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + "@solana/rpc-spec-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/634d5cd3ea7789ff20ca82782ce2fde6bb96c09fcd49dc9d113ade98a4516d2d080f771f3247454e9d4478933a3c1f1380a8409817c12cd40ef6e3579faa1d0d + languageName: node + linkType: hard + +"@solana/rpc-subscriptions-api@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-subscriptions-api@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/keys": "npm:5.5.1" + "@solana/rpc-subscriptions-spec": "npm:5.5.1" + "@solana/rpc-transformers": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + "@solana/transaction-messages": "npm:5.5.1" + "@solana/transactions": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/3ad059f20c361d5ced84f1d584ff5513d78559497c7cf8855703a7c1437dcb3024fc1dfe9d1be65e8241a4d1a4d0c272ed2ddca7e1aca3086f204546836503f9 + languageName: node + linkType: hard + +"@solana/rpc-subscriptions-channel-websocket@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-subscriptions-channel-websocket@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + "@solana/functional": "npm:5.5.1" + "@solana/rpc-subscriptions-spec": "npm:5.5.1" + "@solana/subscribable": "npm:5.5.1" + ws: "npm:^8.19.0" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/37619caefa2f36fdbbbdab0478965a0bc14f72254caa511ecc067700d9c23f4ac221a61079974b8f6286aa2b71bb4ae5fa106297e7044ef0ed7ceb2d816c74a2 + languageName: node + linkType: hard + +"@solana/rpc-subscriptions-spec@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-subscriptions-spec@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + "@solana/promises": "npm:5.5.1" + "@solana/rpc-spec-types": "npm:5.5.1" + "@solana/subscribable": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/9b9e3a81977ee4deac918226a6f6d41fb524563a027d09da4439e18d3c99dd79b2af5a022a16ac97744f8e93ec9dd409714d5c371a313cb811c22194b94f28cc + languageName: node + linkType: hard + +"@solana/rpc-subscriptions@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-subscriptions@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + "@solana/fast-stable-stringify": "npm:5.5.1" + "@solana/functional": "npm:5.5.1" + "@solana/promises": "npm:5.5.1" + "@solana/rpc-spec-types": "npm:5.5.1" + "@solana/rpc-subscriptions-api": "npm:5.5.1" + "@solana/rpc-subscriptions-channel-websocket": "npm:5.5.1" + "@solana/rpc-subscriptions-spec": "npm:5.5.1" + "@solana/rpc-transformers": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + "@solana/subscribable": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/4dda3a418bae0eff6f7da59cc21840e45bd80f3e5fee9edd32ad66b4d128490838017e2ade245fbcd8f4f765bb67350bace41fc56e00a82b739be6d24fd00bbd + languageName: node + linkType: hard + +"@solana/rpc-transformers@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-transformers@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + "@solana/functional": "npm:5.5.1" + "@solana/nominal-types": "npm:5.5.1" + "@solana/rpc-spec-types": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/3500e42b486627be8e39838f02f2f28c759b0183c1bc34e28d2f2289e9ae2e58d5d0825973da601f9f29b1ab366b0017b49df5329c1dcc9932724b9bfdfafafd + languageName: node + linkType: hard + +"@solana/rpc-transport-http@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-transport-http@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + "@solana/rpc-spec": "npm:5.5.1" + "@solana/rpc-spec-types": "npm:5.5.1" + undici-types: "npm:^7.19.2" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/4300e1a334e2ea8deb66542dabff835ae3dbccbaba0011c1cb027f55219cb3144c7fcd5220da06565ef5fa87a25e73a43497caeb7100ff9f1a947792b2325489 + languageName: node + linkType: hard + +"@solana/rpc-types@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-types@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-numbers": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/nominal-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/84fcad12f65c88bfbbe0689d1fb6715e37c41454b85f50ae0963f2626c45a26155f2395b03ab48f261966f1a5c02b1c96ad42ba0b1ca80c5fe22f08757401b1b + languageName: node + linkType: hard + +"@solana/rpc@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + "@solana/fast-stable-stringify": "npm:5.5.1" + "@solana/functional": "npm:5.5.1" + "@solana/rpc-api": "npm:5.5.1" + "@solana/rpc-spec": "npm:5.5.1" + "@solana/rpc-spec-types": "npm:5.5.1" + "@solana/rpc-transformers": "npm:5.5.1" + "@solana/rpc-transport-http": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/c469655555013f5dcfa67ef3285c9abe48929a34bdc8a3c7c21823f86f58f07f91980ee59d48190bcda5b427399a81cb180ae0ca2542e9dd47e39407f62c7458 + languageName: node + linkType: hard + +"@solana/signers@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/signers@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/instructions": "npm:5.5.1" + "@solana/keys": "npm:5.5.1" + "@solana/nominal-types": "npm:5.5.1" + "@solana/offchain-messages": "npm:5.5.1" + "@solana/transaction-messages": "npm:5.5.1" + "@solana/transactions": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/53957109e4a99122b1225b04d477760e0c557fa9c66095e334de543e78f79c4b35b280dde942a0d7725dc3e61ee63c41d52b7fe5ddfc28967c3db009856573aa + languageName: node + linkType: hard + +"@solana/subscribable@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/subscribable@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/ff9f4af066488448276a439a9299f481cd70c1866b4ab4cce7c3486d6c950bab092f4f678b8b79b45681942c99090cd624b3eaa2a6c2820079d44c2502e7c77b + languageName: node + linkType: hard + +"@solana/sysvars@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/sysvars@npm:5.5.1" + dependencies: + "@solana/accounts": "npm:5.5.1" + "@solana/codecs": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/773e4ae956ed29999a5e0c76e44c3b390330325b03827a5a5092292678e3d1d46c2958911faf8b94b350bf42db02874b8942bd7679fc63519a259520c269883a + languageName: node + linkType: hard + +"@solana/transaction-confirmation@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/transaction-confirmation@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/keys": "npm:5.5.1" + "@solana/promises": "npm:5.5.1" + "@solana/rpc": "npm:5.5.1" + "@solana/rpc-subscriptions": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + "@solana/transaction-messages": "npm:5.5.1" + "@solana/transactions": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/01b96aa0518417bf257f8691e02aba5ce8a7144c64d1b96b0b17045bfe34dfa00b2035e6a930f3e36bb689dd2f00c56fc6b8a521711b2fcd262dcdabd3187966 + languageName: node + linkType: hard + +"@solana/transaction-messages@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/transaction-messages@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-data-structures": "npm:5.5.1" + "@solana/codecs-numbers": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/functional": "npm:5.5.1" + "@solana/instructions": "npm:5.5.1" + "@solana/nominal-types": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/711503174284bf449b5ffbf32ae149a82a097781f0eac1cc777d941b3cc3b9de19a6daa9993c77650e001d8f8e9e2f749bd232a4da6e09fa9c856a03a6ec1cc8 + languageName: node + linkType: hard + +"@solana/transactions@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/transactions@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-data-structures": "npm:5.5.1" + "@solana/codecs-numbers": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/functional": "npm:5.5.1" + "@solana/instructions": "npm:5.5.1" + "@solana/keys": "npm:5.5.1" + "@solana/nominal-types": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + "@solana/transaction-messages": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/1dc87a6599ee60e6026b7de917b1e85a2bc2ec2e13732f872453bed597c86002c8b50ae3a4f2ea5725c969fbebe7f4987c5a2f17b02722a40f0b34191f1c7cf2 + languageName: node + linkType: hard + +"@solana/web3.js@npm:^1.93.0, @solana/web3.js@npm:^1.98.0": + version: 1.98.4 + resolution: "@solana/web3.js@npm:1.98.4" + dependencies: + "@babel/runtime": "npm:^7.25.0" + "@noble/curves": "npm:^1.4.2" + "@noble/hashes": "npm:^1.4.0" + "@solana/buffer-layout": "npm:^4.0.1" + "@solana/codecs-numbers": "npm:^2.1.0" + agentkeepalive: "npm:^4.5.0" + bn.js: "npm:^5.2.1" + borsh: "npm:^0.7.0" + bs58: "npm:^4.0.1" + buffer: "npm:6.0.3" + fast-stable-stringify: "npm:^1.0.0" + jayson: "npm:^4.1.1" + node-fetch: "npm:^2.7.0" + rpc-websockets: "npm:^9.0.2" + superstruct: "npm:^2.0.2" + checksum: 10c0/73bf7b6b5b65c7f264587182bbfd65327775b4f3e4831750de6356f58858e57d49213098eec671650940bb7a9bbaa1f352e0710c4075f126d903d72ddddcbdbc + languageName: node + linkType: hard + +"@swc/helpers@npm:^0.5.11": + version: 0.5.21 + resolution: "@swc/helpers@npm:0.5.21" + dependencies: + tslib: "npm:^2.8.0" + checksum: 10c0/692018ec8a9f7ea5ea3fe576fea5af1a782c8bc1752fcb60f949b482fb2521609d1d3710908aebae67086f152e57d231d59b08f4653fd20a2e3e0fa4a34e6322 + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.12 + resolution: "@tsconfig/node10@npm:1.0.12" + checksum: 10c0/7bbbd7408cfaced86387a9b1b71cebc91c6fd701a120369735734da8eab1a4773fc079abd9f40c9e0b049e12586c8ac0e13f0da596bfd455b9b4c3faa813ebc5 + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 10c0/dddca2b553e2bee1308a056705103fc8304e42bb2d2cbd797b84403a223b25c78f2c683ec3e24a095e82cd435387c877239bffcb15a590ba817cd3f6b9a99fd9 + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 10c0/67c1316d065fdaa32525bc9449ff82c197c4c19092b9663b23213c8cbbf8d88b6ed6a17898e0cbc2711950fbfaf40388938c1c748a2ee89f7234fc9e7fe2bf44 + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 10c0/05f8f2734e266fb1839eb1d57290df1664fe2aa3b0fdd685a9035806daa635f7519bf6d5d9b33f6e69dd545b8c46bd6e2b5c79acb2b1f146e885f7f11a42a5bb + languageName: node + linkType: hard + +"@types/chai-subset@npm:^1.3.3": + version: 1.3.6 + resolution: "@types/chai-subset@npm:1.3.6" + peerDependencies: + "@types/chai": <5.2.0 + checksum: 10c0/d8e2362ff7e96b742e00326e656a91fffd6dc1260fd081c30bd607f908eb4d6777cec1e535bae905a8741b8287acded8955c0fe84ee3b6874d38502c029d35c4 + languageName: node + linkType: hard + +"@types/chai@npm:^4.3.5": + version: 4.3.20 + resolution: "@types/chai@npm:4.3.20" + checksum: 10c0/4601189d611752e65018f1ecadac82e94eed29f348e1d5430e5681a60b01e1ecf855d9bcc74ae43b07394751f184f6970fac2b5561fc57a1f36e93a0f5ffb6e8 + languageName: node + linkType: hard + +"@types/connect@npm:^3.4.33": + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/2e1cdba2c410f25649e77856505cd60223250fa12dff7a503e492208dbfdd25f62859918f28aba95315251fd1f5e1ffbfca1e25e73037189ab85dd3f8d0a148c + languageName: node + linkType: hard + +"@types/estree@npm:1.0.8": + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 25.6.0 + resolution: "@types/node@npm:25.6.0" + dependencies: + undici-types: "npm:~7.19.0" + checksum: 10c0/d2d2015630ff098a201407f55f5077a20270ae4f465c739b40865cd9933b91b9c5d2b85568eadaf3db0801b91e267333ca7eb39f007428b173d1cdab4b339ac5 + languageName: node + linkType: hard + +"@types/node@npm:^12.12.54": + version: 12.20.55 + resolution: "@types/node@npm:12.20.55" + checksum: 10c0/3b190bb0410047d489c49bbaab592d2e6630de6a50f00ba3d7d513d59401d279972a8f5a598b5bb8ddc1702f8a2f4ec57a65d93852f9c329639738e7053637d1 + languageName: node + linkType: hard + +"@types/node@npm:^20.0.0": + version: 20.19.39 + resolution: "@types/node@npm:20.19.39" + dependencies: + undici-types: "npm:~6.21.0" + checksum: 10c0/1d16da7b5f47a7415b827fcf3b94d279febf4c14671afec74a03e47856b5270023d9beb1b9aeab4d3b622fd97d61a60206cfc2cca588663181331bc592468289 + languageName: node + linkType: hard + +"@types/uuid@npm:^10.0.0": + version: 10.0.0 + resolution: "@types/uuid@npm:10.0.0" + checksum: 10c0/9a1404bf287164481cb9b97f6bb638f78f955be57c40c6513b7655160beb29df6f84c915aaf4089a1559c216557dc4d2f79b48d978742d3ae10b937420ddac60 + languageName: node + linkType: hard + +"@types/ws@npm:^7.4.4": + version: 7.4.7 + resolution: "@types/ws@npm:7.4.7" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/f1f53febd8623a85cef2652949acd19d83967e350ea15a851593e3033501750a1e04f418552e487db90a3d48611a1cff3ffcf139b94190c10f2fd1e1dc95ff10 + languageName: node + linkType: hard + +"@types/ws@npm:^8.2.2": + version: 8.18.1 + resolution: "@types/ws@npm:8.18.1" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/61aff1129143fcc4312f083bc9e9e168aa3026b7dd6e70796276dcfb2c8211c4292603f9c4864fae702f2ed86e4abd4d38aa421831c2fd7f856c931a481afbab + languageName: node + linkType: hard + +"@vitest/expect@npm:0.34.6": + version: 0.34.6 + resolution: "@vitest/expect@npm:0.34.6" + dependencies: + "@vitest/spy": "npm:0.34.6" + "@vitest/utils": "npm:0.34.6" + chai: "npm:^4.3.10" + checksum: 10c0/d68abc53d673c2c98cad84da4fa73bd407d59a1098ca528c6925c202321d4eeecde5eaf512980614a755200ae1aa6b648d44da09b78ce4cc95aa78eff8ee558a + languageName: node + linkType: hard + +"@vitest/runner@npm:0.34.6": + version: 0.34.6 + resolution: "@vitest/runner@npm:0.34.6" + dependencies: + "@vitest/utils": "npm:0.34.6" + p-limit: "npm:^4.0.0" + pathe: "npm:^1.1.1" + checksum: 10c0/d00d8c399513693eb6c82fd08b0e32fcf486bede5b88805e8dea90e156d502418477788b501b1c078abd38f0147e99a187061b2da81819e8d5c162a63edf5b40 + languageName: node + linkType: hard + +"@vitest/snapshot@npm:0.34.6": + version: 0.34.6 + resolution: "@vitest/snapshot@npm:0.34.6" + dependencies: + magic-string: "npm:^0.30.1" + pathe: "npm:^1.1.1" + pretty-format: "npm:^29.5.0" + checksum: 10c0/08dbfb3cb6d202116e981abf421096eae920d65bca867c38651b02d2623e25a18e2ead6e5de13a49ebe9f2f9d007b2f692714aa6a5c9f18c3ff17b9f8726dbab + languageName: node + linkType: hard + +"@vitest/spy@npm:0.34.6": + version: 0.34.6 + resolution: "@vitest/spy@npm:0.34.6" + dependencies: + tinyspy: "npm:^2.1.1" + checksum: 10c0/ea36d31c521f4c458f7e439ceeb0d1e5c2e9298aaafad7c9bc5ebe75f36c9b871c1f3a6dcb5bfd6c4e83b34979d511f9a7830fa8720b7e1faa18ef121845e9d5 + languageName: node + linkType: hard + +"@vitest/utils@npm:0.34.6": + version: 0.34.6 + resolution: "@vitest/utils@npm:0.34.6" + dependencies: + diff-sequences: "npm:^29.4.3" + loupe: "npm:^2.3.6" + pretty-format: "npm:^29.5.0" + checksum: 10c0/6f32f086b8bf0e8125a11b26cad4ce77ad90943590b55cd1ebb1424412d1feb6d404ee4ded523c346a8f222c265251652b4888f2ede769e3d7fce6fb1ee0a620 + languageName: node + linkType: hard + +"abbrev@npm:^4.0.0": + version: 4.0.0 + resolution: "abbrev@npm:4.0.0" + checksum: 10c0/b4cc16935235e80702fc90192e349e32f8ef0ed151ef506aa78c81a7c455ec18375c4125414b99f84b2e055199d66383e787675f0bcd87da7a4dbd59f9eac1d5 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": + version: 8.3.5 + resolution: "acorn-walk@npm:8.3.5" + dependencies: + acorn: "npm:^8.11.0" + checksum: 10c0/e31bf5b5423ed1349437029d66d708b9fbd1b77a644b031501e2c753b028d13b56348210ed901d5b1d0d86eb3381c0a0fc0d0998511a9d546d1194936266a332 + languageName: node + linkType: hard + +"acorn@npm:^8.10.0, acorn@npm:^8.11.0, acorn@npm:^8.16.0, acorn@npm:^8.4.1, acorn@npm:^8.9.0": + version: 8.16.0 + resolution: "acorn@npm:8.16.0" + bin: + acorn: bin/acorn + checksum: 10c0/c9c52697227661b68d0debaf972222d4f622aa06b185824164e153438afa7b08273432ca43ea792cadb24dada1d46f6f6bb1ef8de9956979288cc1b96bf9914e + languageName: node + linkType: hard + +"agentkeepalive@npm:^4.5.0": + version: 4.6.0 + resolution: "agentkeepalive@npm:4.6.0" + dependencies: + humanize-ms: "npm:^1.2.1" + checksum: 10c0/235c182432f75046835b05f239708107138a40103deee23b6a08caee5136873709155753b394ec212e49e60e94a378189562cb01347765515cff61b692c69187 + languageName: node + linkType: hard + +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: 10c0/9c4ca80eb3c2fb7b33841c210d2f20807f40865d27008d7c3f707b7f95cab7d67462a565e2388ac3285b71cb3d9bb2173de8da37c57692a362885ec34d6e27df + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 10c0/070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a + languageName: node + linkType: hard + +"asn1.js@npm:^5.4.1": + version: 5.4.1 + resolution: "asn1.js@npm:5.4.1" + dependencies: + bn.js: "npm:^4.0.0" + inherits: "npm:^2.0.1" + minimalistic-assert: "npm:^1.0.0" + safer-buffer: "npm:^2.1.0" + checksum: 10c0/b577232fa6069cc52bb128e564002c62b2b1fe47f7137bdcd709c0b8495aa79cee0f8cc458a831b2d8675900eea0d05781b006be5e1aa4f0ae3577a73ec20324 + languageName: node + linkType: hard + +"asn1js@npm:^3.0.6": + version: 3.0.10 + resolution: "asn1js@npm:3.0.10" + dependencies: + pvtsutils: "npm:^1.3.6" + pvutils: "npm:^1.1.5" + tslib: "npm:^2.8.1" + checksum: 10c0/04056106522e4d0db4eb992299bb76d73438bfd59ffd975ac9c1f15d14e7326161dad383c54a5ccfa203b73ae7b7bf4668f42c2fed01e1f4bf79a58de71e4dc6 + languageName: node + linkType: hard + +"assertion-error@npm:^1.1.0": + version: 1.1.0 + resolution: "assertion-error@npm:1.1.0" + checksum: 10c0/25456b2aa333250f01143968e02e4884a34588a8538fbbf65c91a637f1dbfb8069249133cd2f4e530f10f624d206a664e7df30207830b659e9f5298b00a4099b + languageName: node + linkType: hard + +"base-x@npm:^3.0.2": + version: 3.0.11 + resolution: "base-x@npm:3.0.11" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 10c0/4c5b8cd9cef285973b0460934be4fc890eedfd22a8aca527fac3527f041c5d1c912f7b9a6816f19e43e69dc7c29a5deabfa326bd3d6a57ee46af0ad46e3991d5 + languageName: node + linkType: hard + +"base-x@npm:^5.0.0": + version: 5.0.1 + resolution: "base-x@npm:5.0.1" + checksum: 10c0/4ab6b02262b4fd499b147656f63ce7328bd5f895450401ce58a2f9e87828aea507cf0c320a6d8725389f86e8a48397562661c0bca28ef3276a22821b30f7a713 + languageName: node + linkType: hard + +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + +"bn.js@npm:^4.0.0, bn.js@npm:^4.11.9": + version: 4.12.3 + resolution: "bn.js@npm:4.12.3" + checksum: 10c0/53b6a4db8a583abd2522eacd480fece26fe6c4d8d35d03e5e11e15cb0873a3044eb4e3d1f9fef56f47eb008219e99ba5b620c26f57db49a687c6ab2cf848d50b + languageName: node + linkType: hard + +"bn.js@npm:^5.2.0, bn.js@npm:^5.2.1, bn.js@npm:^5.2.2": + version: 5.2.3 + resolution: "bn.js@npm:5.2.3" + checksum: 10c0/eef19cb9cf5e91e91e3e0f036b799ce6c72f79463c3934d62991c3dcdb58f6c94dc3d806495d9b0bf31cd121870ed79bb2115cea71b56c03e794fb71485031fa + languageName: node + linkType: hard + +"borsh@npm:^0.7.0": + version: 0.7.0 + resolution: "borsh@npm:0.7.0" + dependencies: + bn.js: "npm:^5.2.0" + bs58: "npm:^4.0.0" + text-encoding-utf-8: "npm:^1.0.2" + checksum: 10c0/513b3e51823d2bf5be77cec27742419d2b0427504825dd7ceb00dedb820f246a4762f04b83d5e3aa39c8e075b3cbaeb7ca3c90bd1cbeecccb4a510575be8c581 + languageName: node + linkType: hard + +"brorand@npm:^1.1.0": + version: 1.1.0 + resolution: "brorand@npm:1.1.0" + checksum: 10c0/6f366d7c4990f82c366e3878492ba9a372a73163c09871e80d82fb4ae0d23f9f8924cb8a662330308206e6b3b76ba1d528b4601c9ef73c2166b440b2ea3b7571 + languageName: node + linkType: hard + +"bs58@npm:^4.0.0, bs58@npm:^4.0.1": + version: 4.0.1 + resolution: "bs58@npm:4.0.1" + dependencies: + base-x: "npm:^3.0.2" + checksum: 10c0/613a1b1441e754279a0e3f44d1faeb8c8e838feef81e550efe174ff021dd2e08a4c9ae5805b52dfdde79f97b5c0918c78dd24a0eb726c4a94365f0984a0ffc65 + languageName: node + linkType: hard + +"bs58@npm:^6.0.0": + version: 6.0.0 + resolution: "bs58@npm:6.0.0" + dependencies: + base-x: "npm:^5.0.0" + checksum: 10c0/61910839746625ee4f69369f80e2634e2123726caaa1da6b3bcefcf7efcd9bdca86603360fed9664ffdabe0038c51e542c02581c72ca8d44f60329fe1a6bc8f4 + languageName: node + linkType: hard + +"buffer@npm:6.0.3, buffer@npm:^6.0.3, buffer@npm:~6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.2.1" + checksum: 10c0/2a905fbbcde73cc5d8bd18d1caa23715d5f83a5935867c2329f0ac06104204ba7947be098fe1317fbd8830e26090ff8e764f08cd14fefc977bb248c3487bcbd0 + languageName: node + linkType: hard + +"bufferutil@npm:^4.0.1": + version: 4.1.0 + resolution: "bufferutil@npm:4.1.0" + dependencies: + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.3.0" + checksum: 10c0/12d63bbc80a3b6525bc62a28387fca0a5aed09e41b74375c500e60721b6a1ab2960b82e48f1773eddea2b14e490f129214b8b57bd6e1a5078b6235857d658508 + languageName: node + linkType: hard + +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 10c0/4ee06aaa7bab8981f0d54e5f5f9d4adcd64058e9697563ce336d8a3878ed018ee18ebe5359b2430eceae87e0758e62ea2019c3f52ae6e211b1bd2e133856cd10 + languageName: node + linkType: hard + +"chai@npm:^4.3.10": + version: 4.5.0 + resolution: "chai@npm:4.5.0" + dependencies: + assertion-error: "npm:^1.1.0" + check-error: "npm:^1.0.3" + deep-eql: "npm:^4.1.3" + get-func-name: "npm:^2.0.2" + loupe: "npm:^2.3.6" + pathval: "npm:^1.1.1" + type-detect: "npm:^4.1.0" + checksum: 10c0/b8cb596bd1aece1aec659e41a6e479290c7d9bee5b3ad63d2898ad230064e5b47889a3bc367b20100a0853b62e026e2dc514acf25a3c9385f936aa3614d4ab4d + languageName: node + linkType: hard + +"chalk@npm:5.6.2, chalk@npm:^5.4.1": + version: 5.6.2 + resolution: "chalk@npm:5.6.2" + checksum: 10c0/99a4b0f0e7991796b1e7e3f52dceb9137cae2a9dfc8fc0784a550dc4c558e15ab32ed70b14b21b52beb2679b4892b41a0aa44249bcb996f01e125d58477c6976 + languageName: node + linkType: hard + +"check-error@npm:^1.0.3": + version: 1.0.3 + resolution: "check-error@npm:1.0.3" + dependencies: + get-func-name: "npm:^2.0.2" + checksum: 10c0/94aa37a7315c0e8a83d0112b5bfb5a8624f7f0f81057c73e4707729cdd8077166c6aefb3d8e2b92c63ee130d4a2ff94bad46d547e12f3238cc1d78342a973841 + languageName: node + linkType: hard + +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + +"commander@npm:14.0.2": + version: 14.0.2 + resolution: "commander@npm:14.0.2" + checksum: 10c0/245abd1349dbad5414cb6517b7b5c584895c02c4f7836ff5395f301192b8566f9796c82d7bd6c92d07eba8775fe4df86602fca5d86d8d10bcc2aded1e21c2aeb + languageName: node + linkType: hard + +"commander@npm:^14.0.0": + version: 14.0.3 + resolution: "commander@npm:14.0.3" + checksum: 10c0/755652564bbf56ff2ff083313912b326450d3f8d8c85f4b71416539c9a05c3c67dbd206821ca72635bf6b160e2afdefcb458e86b317827d5cb333b69ce7f1a24 + languageName: node + linkType: hard + +"commander@npm:^2.20.3": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 + languageName: node + linkType: hard + +"confbox@npm:^0.1.8": + version: 0.1.8 + resolution: "confbox@npm:0.1.8" + checksum: 10c0/fc2c68d97cb54d885b10b63e45bd8da83a8a71459d3ecf1825143dd4c7f9f1b696b3283e07d9d12a144c1301c2ebc7842380bdf0014e55acc4ae1c9550102418 + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: 10c0/157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 + languageName: node + linkType: hard + +"debug@npm:^4.3.4": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 + languageName: node + linkType: hard + +"deep-eql@npm:^4.1.3": + version: 4.1.4 + resolution: "deep-eql@npm:4.1.4" + dependencies: + type-detect: "npm:^4.0.0" + checksum: 10c0/264e0613493b43552fc908f4ff87b8b445c0e6e075656649600e1b8a17a57ee03e960156fce7177646e4d2ddaf8e5ee616d76bd79929ff593e5c79e4e5e6c517 + languageName: node + linkType: hard + +"delay@npm:^5.0.0": + version: 5.0.0 + resolution: "delay@npm:5.0.0" + checksum: 10c0/01cdc4cd0cd35fb622518a3df848e67e09763a38e7cdada2232b6fda9ddda72eddcf74f0e24211200fbe718434f2335f2a2633875a6c96037fefa6de42896ad7 + languageName: node + linkType: hard + +"diff-sequences@npm:^29.4.3": + version: 29.6.3 + resolution: "diff-sequences@npm:29.6.3" + checksum: 10c0/32e27ac7dbffdf2fb0eb5a84efd98a9ad084fbabd5ac9abb8757c6770d5320d2acd172830b28c4add29bb873d59420601dfc805ac4064330ce59b1adfd0593b2 + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.4 + resolution: "diff@npm:4.0.4" + checksum: 10c0/855fb70b093d1d9643ddc12ea76dca90dc9d9cdd7f82c08ee8b9325c0dc5748faf3c82e2047ced5dcaa8b26e58f7903900be2628d0380a222c02d79d8de385df + languageName: node + linkType: hard + +"dotenv@npm:^16.0.0": + version: 16.6.1 + resolution: "dotenv@npm:16.6.1" + checksum: 10c0/15ce56608326ea0d1d9414a5c8ee6dcf0fffc79d2c16422b4ac2268e7e2d76ff5a572d37ffe747c377de12005f14b3cc22361e79fc7f1061cce81f77d2c973dc + languageName: node + linkType: hard + +"elliptic@npm:^6.6.1": + version: 6.6.1 + resolution: "elliptic@npm:6.6.1" + dependencies: + bn.js: "npm:^4.11.9" + brorand: "npm:^1.1.0" + hash.js: "npm:^1.0.0" + hmac-drbg: "npm:^1.0.1" + inherits: "npm:^2.0.4" + minimalistic-assert: "npm:^1.0.1" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10c0/8b24ef782eec8b472053793ea1e91ae6bee41afffdfcb78a81c0a53b191e715cbe1292aa07165958a9bbe675bd0955142560b1a007ffce7d6c765bcaf951a867 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"es6-promise@npm:^4.0.3": + version: 4.2.8 + resolution: "es6-promise@npm:4.2.8" + checksum: 10c0/2373d9c5e9a93bdd9f9ed32ff5cb6dd3dd785368d1c21e9bbbfd07d16345b3774ae260f2bd24c8f836a6903f432b4151e7816a7fa8891ccb4e1a55a028ec42c3 + languageName: node + linkType: hard + +"es6-promisify@npm:^5.0.0": + version: 5.0.0 + resolution: "es6-promisify@npm:5.0.0" + dependencies: + es6-promise: "npm:^4.0.3" + checksum: 10c0/23284c6a733cbf7842ec98f41eac742c9f288a78753c4fe46652bae826446ced7615b9e8a5c5f121a08812b1cd478ea58630f3e1c3d70835bd5dcd69c7cd75c9 + languageName: node + linkType: hard + +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": "npm:0.21.5" + "@esbuild/android-arm": "npm:0.21.5" + "@esbuild/android-arm64": "npm:0.21.5" + "@esbuild/android-x64": "npm:0.21.5" + "@esbuild/darwin-arm64": "npm:0.21.5" + "@esbuild/darwin-x64": "npm:0.21.5" + "@esbuild/freebsd-arm64": "npm:0.21.5" + "@esbuild/freebsd-x64": "npm:0.21.5" + "@esbuild/linux-arm": "npm:0.21.5" + "@esbuild/linux-arm64": "npm:0.21.5" + "@esbuild/linux-ia32": "npm:0.21.5" + "@esbuild/linux-loong64": "npm:0.21.5" + "@esbuild/linux-mips64el": "npm:0.21.5" + "@esbuild/linux-ppc64": "npm:0.21.5" + "@esbuild/linux-riscv64": "npm:0.21.5" + "@esbuild/linux-s390x": "npm:0.21.5" + "@esbuild/linux-x64": "npm:0.21.5" + "@esbuild/netbsd-x64": "npm:0.21.5" + "@esbuild/openbsd-x64": "npm:0.21.5" + "@esbuild/sunos-x64": "npm:0.21.5" + "@esbuild/win32-arm64": "npm:0.21.5" + "@esbuild/win32-ia32": "npm:0.21.5" + "@esbuild/win32-x64": "npm:0.21.5" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/fa08508adf683c3f399e8a014a6382a6b65542213431e26206c0720e536b31c09b50798747c2a105a4bbba1d9767b8d3615a74c2f7bf1ddf6d836cd11eb672de + languageName: node + linkType: hard + +"eventemitter3@npm:^5.0.1": + version: 5.0.4 + resolution: "eventemitter3@npm:5.0.4" + checksum: 10c0/575b8cac8d709e1473da46f8f15ef311b57ff7609445a7c71af5cd42598583eee6f098fa7a593e30f27e94b8865642baa0689e8fa97c016f742abdb3b1bf6d9a + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.3 + resolution: "exponential-backoff@npm:3.1.3" + checksum: 10c0/77e3ae682b7b1f4972f563c6dbcd2b0d54ac679e62d5d32f3e5085feba20483cf28bd505543f520e287a56d4d55a28d7874299941faf637e779a1aa5994d1267 + languageName: node + linkType: hard + +"eyes@npm:^0.1.8": + version: 0.1.8 + resolution: "eyes@npm:0.1.8" + checksum: 10c0/4c79a9cbf45746d8c9f48cc957e35ad8ea336add1c7b8d5a0e002efc791a7a62b27b2188184ef1a1eea7bc3cd06b161791421e0e6c5fe78309705a162c53eea8 + languageName: node + linkType: hard + +"fast-stable-stringify@npm:^1.0.0": + version: 1.0.0 + resolution: "fast-stable-stringify@npm:1.0.0" + checksum: 10c0/1d773440c7a9615950577665074746c2e92edafceefa789616ecb6166229e0ccc6dae206ca9b9f7da0d274ba5779162aab2d07940a0f6e52a41a4e555392eb3b + languageName: node + linkType: hard + +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": + version: 2.0.2 + resolution: "get-func-name@npm:2.0.2" + checksum: 10c0/89830fd07623fa73429a711b9daecdb304386d237c71268007f788f113505ef1d4cc2d0b9680e072c5082490aec9df5d7758bf5ac6f1c37062855e8e3dc0b9df + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3, hash.js@npm:^1.1.7": + version: 1.1.7 + resolution: "hash.js@npm:1.1.7" + dependencies: + inherits: "npm:^2.0.3" + minimalistic-assert: "npm:^1.0.1" + checksum: 10c0/41ada59494eac5332cfc1ce6b7ebdd7b88a3864a6d6b08a3ea8ef261332ed60f37f10877e0c825aaa4bddebf164fbffa618286aeeec5296675e2671cbfa746c4 + languageName: node + linkType: hard + +"hmac-drbg@npm:^1.0.1": + version: 1.0.1 + resolution: "hmac-drbg@npm:1.0.1" + dependencies: + hash.js: "npm:^1.0.3" + minimalistic-assert: "npm:^1.0.0" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10c0/f3d9ba31b40257a573f162176ac5930109816036c59a09f901eb2ffd7e5e705c6832bedfff507957125f2086a0ab8f853c0df225642a88bf1fcaea945f20600d + languageName: node + linkType: hard + +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: "npm:^2.0.0" + checksum: 10c0/f34a2c20161d02303c2807badec2f3b49cbfbbb409abd4f95a07377ae01cfe6b59e3d15ac609cffcd8f2521f0eb37b7e1091acf65da99aa2a4f1ad63c21e7e7a + languageName: node + linkType: hard + +"ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + +"inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"isexe@npm:^4.0.0": + version: 4.0.0 + resolution: "isexe@npm:4.0.0" + checksum: 10c0/5884815115bceac452877659a9c7726382531592f43dc29e5d48b7c4100661aed54018cb90bd36cb2eaeba521092570769167acbb95c18d39afdccbcca06c5ce + languageName: node + linkType: hard + +"isomorphic-ws@npm:^4.0.1": + version: 4.0.1 + resolution: "isomorphic-ws@npm:4.0.1" + peerDependencies: + ws: "*" + checksum: 10c0/7cb90dc2f0eb409825558982fb15d7c1d757a88595efbab879592f9d2b63820d6bbfb5571ab8abe36c715946e165a413a99f6aafd9f40ab1f514d73487bc9996 + languageName: node + linkType: hard + +"jayson@npm:^4.1.1": + version: 4.3.0 + resolution: "jayson@npm:4.3.0" + dependencies: + "@types/connect": "npm:^3.4.33" + "@types/node": "npm:^12.12.54" + "@types/ws": "npm:^7.4.4" + commander: "npm:^2.20.3" + delay: "npm:^5.0.0" + es6-promisify: "npm:^5.0.0" + eyes: "npm:^0.1.8" + isomorphic-ws: "npm:^4.0.1" + json-stringify-safe: "npm:^5.0.1" + stream-json: "npm:^1.9.1" + uuid: "npm:^8.3.2" + ws: "npm:^7.5.10" + bin: + jayson: bin/jayson.js + checksum: 10c0/d3d1ee1bd9d8b57eb6c13da83965e6052b030b24ee9ee6b8763ea33e986d7f161428bda8a3f5e4b30e0194867fe48ef0652db521363ccc6227b89d7998f0dbda + languageName: node + linkType: hard + +"json-stringify-safe@npm:^5.0.1": + version: 5.0.1 + resolution: "json-stringify-safe@npm:5.0.1" + checksum: 10c0/7dbf35cd0411d1d648dceb6d59ce5857ec939e52e4afc37601aa3da611f0987d5cee5b38d58329ceddf3ed48bd7215229c8d52059ab01f2444a338bf24ed0f37 + languageName: node + linkType: hard + +"local-pkg@npm:^0.4.3": + version: 0.4.3 + resolution: "local-pkg@npm:0.4.3" + checksum: 10c0/361c77d7873a629f09c9e86128926227171ee0fe3435d282fb80303ff255bb4d3c053b555d47e953b4f41d2561f2a7bc0e53e9ca5c9bc9607226a77c91ea4994 + languageName: node + linkType: hard + +"loupe@npm:^2.3.6": + version: 2.3.7 + resolution: "loupe@npm:2.3.7" + dependencies: + get-func-name: "npm:^2.0.1" + checksum: 10c0/71a781c8fc21527b99ed1062043f1f2bb30bdaf54fa4cf92463427e1718bc6567af2988300bc243c1f276e4f0876f29e3cbf7b58106fdc186915687456ce5bf4 + languageName: node + linkType: hard + +"magic-string@npm:^0.30.1": + version: 0.30.21 + resolution: "magic-string@npm:0.30.21" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.5" + checksum: 10c0/299378e38f9a270069fc62358522ddfb44e94244baa0d6a8980ab2a9b2490a1d03b236b447eee309e17eb3bddfa482c61259d47960eb018a904f0ded52780c4a + languageName: node + linkType: hard + +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f + languageName: node + linkType: hard + +"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd + languageName: node + linkType: hard + +"minimalistic-crypto-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-crypto-utils@npm:1.0.1" + checksum: 10c0/790ecec8c5c73973a4fbf2c663d911033e8494d5fb0960a4500634766ab05d6107d20af896ca2132e7031741f19888154d44b2408ada0852446705441383e9f8 + languageName: node + linkType: hard + +"minipass@npm:^7.0.4, minipass@npm:^7.1.2": + version: 7.1.3 + resolution: "minipass@npm:7.1.3" + checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb + languageName: node + linkType: hard + +"minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" + dependencies: + minipass: "npm:^7.1.2" + checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec + languageName: node + linkType: hard + +"mlly@npm:^1.4.0, mlly@npm:^1.7.4": + version: 1.8.2 + resolution: "mlly@npm:1.8.2" + dependencies: + acorn: "npm:^8.16.0" + pathe: "npm:^2.0.3" + pkg-types: "npm:^1.3.1" + ufo: "npm:^1.6.3" + checksum: 10c0/aa826683a6daddf2aef65f9c8142e362731cf8e415a5591faf92fd51040a76697e45ab6dbb7a3b38be74e0f8c464825a7eabe827750455c7472421953f5da733 + languageName: node + linkType: hard + +"ms@npm:^2.0.0, ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"nanoid@npm:^3.3.11": + version: 3.3.12 + resolution: "nanoid@npm:3.3.12" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/ba142b7b39e11e80c16dd74b0365d407880c87c1cf7e1480956981ae940ee36060fa5b6f092cd1e315184dd19244c657bd017d03327bd3c62247d691c5e8edfb + languageName: node + linkType: hard + +"node-fetch@npm:^2.7.0": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: "npm:^5.0.0" + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 10c0/b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 + languageName: node + linkType: hard + +"node-gyp-build@npm:^4.3.0": + version: 4.8.4 + resolution: "node-gyp-build@npm:4.8.4" + bin: + node-gyp-build: bin.js + node-gyp-build-optional: optional.js + node-gyp-build-test: build-test.js + checksum: 10c0/444e189907ece2081fe60e75368784f7782cfddb554b60123743dfb89509df89f1f29c03bbfa16b3a3e0be3f48799a4783f487da6203245fa5bed239ba7407e1 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 12.3.0 + resolution: "node-gyp@npm:12.3.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + graceful-fs: "npm:^4.2.6" + nopt: "npm:^9.0.0" + proc-log: "npm:^6.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.5.4" + tinyglobby: "npm:^0.2.12" + undici: "npm:^6.25.0" + which: "npm:^6.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/9d9032b405cbe42f72a105259d9eb679376470c102df4a2dbaa51e07d59bf741dcffb85897087ea9d8318b9cabb824a8978af51508ae142f0239ae1e6a3c2329 + languageName: node + linkType: hard + +"nopt@npm:^9.0.0": + version: 9.0.0 + resolution: "nopt@npm:9.0.0" + dependencies: + abbrev: "npm:^4.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/1822eb6f9b020ef6f7a7516d7b64a8036e09666ea55ac40416c36e4b2b343122c3cff0e2f085675f53de1d2db99a2a89a60ccea1d120bcd6a5347bf6ceb4a7fd + languageName: node + linkType: hard + +"p-limit@npm:^4.0.0": + version: 4.0.0 + resolution: "p-limit@npm:4.0.0" + dependencies: + yocto-queue: "npm:^1.0.0" + checksum: 10c0/a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad + languageName: node + linkType: hard + +"pathe@npm:^1.1.1": + version: 1.1.2 + resolution: "pathe@npm:1.1.2" + checksum: 10c0/64ee0a4e587fb0f208d9777a6c56e4f9050039268faaaaecd50e959ef01bf847b7872785c36483fa5cdcdbdfdb31fef2ff222684d4fc21c330ab60395c681897 + languageName: node + linkType: hard + +"pathe@npm:^2.0.1, pathe@npm:^2.0.3": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10c0/c118dc5a8b5c4166011b2b70608762e260085180bb9e33e80a50dcdb1e78c010b1624f4280c492c92b05fc276715a4c357d1f9edc570f8f1b3d90b6839ebaca1 + languageName: node + linkType: hard + +"pathval@npm:^1.1.1": + version: 1.1.1 + resolution: "pathval@npm:1.1.1" + checksum: 10c0/f63e1bc1b33593cdf094ed6ff5c49c1c0dc5dc20a646ca9725cc7fe7cd9995002d51d5685b9b2ec6814342935748b711bafa840f84c0bb04e38ff40a335c94dc + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + +"picomatch@npm:^4.0.4": + version: 4.0.4 + resolution: "picomatch@npm:4.0.4" + checksum: 10c0/e2c6023372cc7b5764719a5ffb9da0f8e781212fa7ca4bd0562db929df8e117460f00dff3cb7509dacfc06b86de924b247f504d0ce1806a37fac4633081466b0 + languageName: node + linkType: hard + +"pinocchio-ephemeral-permission-counter@workspace:.": + version: 0.0.0-use.local + resolution: "pinocchio-ephemeral-permission-counter@workspace:." + dependencies: + "@magicblock-labs/ephemeral-rollups-sdk": "npm:^0.11.1" + "@solana-program/system": "npm:^0.10.0" + "@solana/kit": "npm:^5.4.0" + "@solana/web3.js": "npm:^1.93.0" + "@types/node": "npm:^20.0.0" + borsh: "npm:^0.7.0" + dotenv: "npm:^16.0.0" + ts-node: "npm:^10.9.0" + tweetnacl: "npm:^1.0.3" + typescript: "npm:^5.0.0" + vitest: "npm:^0.34.0" + languageName: unknown + linkType: soft + +"pkg-types@npm:^1.3.1": + version: 1.3.1 + resolution: "pkg-types@npm:1.3.1" + dependencies: + confbox: "npm:^0.1.8" + mlly: "npm:^1.7.4" + pathe: "npm:^2.0.1" + checksum: 10c0/19e6cb8b66dcc66c89f2344aecfa47f2431c988cfa3366bdfdcfb1dd6695f87dcce37fbd90fe9d1605e2f4440b77f391e83c23255347c35cf84e7fd774d7fcea + languageName: node + linkType: hard + +"postcss@npm:^8.4.43": + version: 8.5.14 + resolution: "postcss@npm:8.5.14" + dependencies: + nanoid: "npm:^3.3.11" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/48138207cf5ef5581be1bfe2cb65ccfe0ac75e43888ba045afc8ed6043d7b56aeb3b9a9fe5b353ff554be943cd0cc15d826ccb991525159175971e5ee8ab0237 + languageName: node + linkType: hard + +"pretty-format@npm:^29.5.0": + version: 29.7.0 + resolution: "pretty-format@npm:29.7.0" + dependencies: + "@jest/schemas": "npm:^29.6.3" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^18.0.0" + checksum: 10c0/edc5ff89f51916f036c62ed433506b55446ff739358de77207e63e88a28ca2894caac6e73dcb68166a606e51c8087d32d400473e6a9fdd2dbe743f46c9c0276f + languageName: node + linkType: hard + +"proc-log@npm:^6.0.0": + version: 6.1.0 + resolution: "proc-log@npm:6.1.0" + checksum: 10c0/4f178d4062733ead9d71a9b1ab24ebcecdfe2250916a5b1555f04fe2eda972a0ec76fbaa8df1ad9c02707add6749219d118a4fc46dc56bdfe4dde4b47d80bb82 + languageName: node + linkType: hard + +"pvtsutils@npm:^1.3.6": + version: 1.3.6 + resolution: "pvtsutils@npm:1.3.6" + dependencies: + tslib: "npm:^2.8.1" + checksum: 10c0/b1b42646370505ccae536dcffa662303b2c553995211330c8e39dec9ab8c197585d7751c2c5b9ab2f186feda0219d9bb23c34ee1e565573be96450f79d89a13c + languageName: node + linkType: hard + +"pvutils@npm:^1.1.5": + version: 1.1.5 + resolution: "pvutils@npm:1.1.5" + checksum: 10c0/e968b07b78a58fec9377fe7aa6342c8cfa21c8fb4afc4e51e1489bd42bec6dc71b8a52541d0aede0aea17adec7ca3f89f29f56efdc31d0083cc02e9bb5721bcf + languageName: node + linkType: hard + +"react-is@npm:^18.0.0": + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: 10c0/f2f1e60010c683479e74c63f96b09fb41603527cd131a9959e2aee1e5a8b0caf270b365e5ca77d4a6b18aae659b60a86150bb3979073528877029b35aecd2072 + languageName: node + linkType: hard + +"rollup@npm:^4.20.0": + version: 4.60.3 + resolution: "rollup@npm:4.60.3" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.60.3" + "@rollup/rollup-android-arm64": "npm:4.60.3" + "@rollup/rollup-darwin-arm64": "npm:4.60.3" + "@rollup/rollup-darwin-x64": "npm:4.60.3" + "@rollup/rollup-freebsd-arm64": "npm:4.60.3" + "@rollup/rollup-freebsd-x64": "npm:4.60.3" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.60.3" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.60.3" + "@rollup/rollup-linux-arm64-gnu": "npm:4.60.3" + "@rollup/rollup-linux-arm64-musl": "npm:4.60.3" + "@rollup/rollup-linux-loong64-gnu": "npm:4.60.3" + "@rollup/rollup-linux-loong64-musl": "npm:4.60.3" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.60.3" + "@rollup/rollup-linux-ppc64-musl": "npm:4.60.3" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.60.3" + "@rollup/rollup-linux-riscv64-musl": "npm:4.60.3" + "@rollup/rollup-linux-s390x-gnu": "npm:4.60.3" + "@rollup/rollup-linux-x64-gnu": "npm:4.60.3" + "@rollup/rollup-linux-x64-musl": "npm:4.60.3" + "@rollup/rollup-openbsd-x64": "npm:4.60.3" + "@rollup/rollup-openharmony-arm64": "npm:4.60.3" + "@rollup/rollup-win32-arm64-msvc": "npm:4.60.3" + "@rollup/rollup-win32-ia32-msvc": "npm:4.60.3" + "@rollup/rollup-win32-x64-gnu": "npm:4.60.3" + "@rollup/rollup-win32-x64-msvc": "npm:4.60.3" + "@types/estree": "npm:1.0.8" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loong64-gnu": + optional: true + "@rollup/rollup-linux-loong64-musl": + optional: true + "@rollup/rollup-linux-ppc64-gnu": + optional: true + "@rollup/rollup-linux-ppc64-musl": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-riscv64-musl": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-openbsd-x64": + optional: true + "@rollup/rollup-openharmony-arm64": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-gnu": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/72c9c768f3fabeaeff228b6364e6600c169d6c231a4324c47c34880fd8961aebacd974cf905ecc2db75e56c6491bdd676409a06aecf589791bf419cd41d06e76 + languageName: node + linkType: hard + +"rpc-websockets@npm:^9.0.2, rpc-websockets@npm:^9.0.4": + version: 9.3.8 + resolution: "rpc-websockets@npm:9.3.8" + dependencies: + "@swc/helpers": "npm:^0.5.11" + "@types/uuid": "npm:^10.0.0" + "@types/ws": "npm:^8.2.2" + buffer: "npm:^6.0.3" + bufferutil: "npm:^4.0.1" + eventemitter3: "npm:^5.0.1" + utf-8-validate: "npm:^6.0.0" + uuid: "npm:^11.0.0" + ws: "npm:^8.5.0" + dependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/4a0601c497762f7fffe685bdb4595e60e31e363b5988a01a4370b867f3d23a6fdd240f22f5f25125e7bfa70d94e81b98537d8824b0d43c171f363ed5555d4cae + languageName: node + linkType: hard + +"safe-buffer@npm:^5.0.1": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"safer-buffer@npm:^2.1.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"semver@npm:^7.3.5": + version: 7.7.4 + resolution: "semver@npm:7.7.4" + bin: + semver: bin/semver.js + checksum: 10c0/5215ad0234e2845d4ea5bb9d836d42b03499546ddafb12075566899fc617f68794bb6f146076b6881d755de17d6c6cc73372555879ec7dce2c2feee947866ad2 + languageName: node + linkType: hard + +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 10c0/3def8f8e516fbb34cb6ae415b07ccc5d9c018d85b4b8611e3dc6f8be6d1899f693a4382913c9ed51a06babb5201639d76453ab297d1c54a456544acf5c892e34 + languageName: node + linkType: hard + +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 10c0/89a1416668f950236dd5ac9f9a6b2588e1b9b62b1b6ad8dff1bfc5d1a15dbf0aafc9b52d2226d00c28dffff212da464eaeebfc6b7578b9d180cef3e3782c5983 + languageName: node + linkType: hard + +"std-env@npm:^3.3.3": + version: 3.10.0 + resolution: "std-env@npm:3.10.0" + checksum: 10c0/1814927a45004d36dde6707eaf17552a546769bc79a6421be2c16ce77d238158dfe5de30910b78ec30d95135cc1c59ea73ee22d2ca170f8b9753f84da34c427f + languageName: node + linkType: hard + +"stream-chain@npm:^2.2.5": + version: 2.2.5 + resolution: "stream-chain@npm:2.2.5" + checksum: 10c0/c512f50190d7c92d688fa64e7af540c51b661f9c2b775fc72bca38ea9bca515c64c22c2197b1be463741daacbaaa2dde8a8ea24ebda46f08391224f15249121a + languageName: node + linkType: hard + +"stream-json@npm:^1.9.1": + version: 1.9.1 + resolution: "stream-json@npm:1.9.1" + dependencies: + stream-chain: "npm:^2.2.5" + checksum: 10c0/0521e5cb3fb6b0e2561d715975e891bd81fa77d0239c8d0b1756846392bc3c7cdd7f1ddb0fe7ed77e6fdef58daab9e665d3b39f7d677bd0859e65a2bff59b92c + languageName: node + linkType: hard + +"strip-literal@npm:^1.0.1": + version: 1.3.0 + resolution: "strip-literal@npm:1.3.0" + dependencies: + acorn: "npm:^8.10.0" + checksum: 10c0/3c0c9ee41eb346e827eede61ef288457f53df30e3e6ff8b94fa81b636933b0c13ca4ea5c97d00a10d72d04be326da99ac819f8769f0c6407ba8177c98344a916 + languageName: node + linkType: hard + +"superstruct@npm:^2.0.2": + version: 2.0.2 + resolution: "superstruct@npm:2.0.2" + checksum: 10c0/c6853db5240b4920f47b3c864dd1e23ede6819ea399ad29a65387d746374f6958c5f1c5b7e5bb152d9db117a74973e5005056d9bb83c24e26f18ec6bfae4a718 + languageName: node + linkType: hard + +"tar@npm:^7.5.4": + version: 7.5.13 + resolution: "tar@npm:7.5.13" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.1.0" + yallist: "npm:^5.0.0" + checksum: 10c0/5c65b8084799bde7a791593a1c1a45d3d6ee98182e3700b24c247b7b8f8654df4191642abbdb07ff25043d45dcff35620827c3997b88ae6c12040f64bed5076b + languageName: node + linkType: hard + +"text-encoding-utf-8@npm:^1.0.2": + version: 1.0.2 + resolution: "text-encoding-utf-8@npm:1.0.2" + checksum: 10c0/87a64b394c850e8387c2ca7fc6929a26ce97fb598f1c55cd0fdaec4b8e2c3ed6770f65b2f3309c9175ef64ac5e403c8e48b53ceeb86d2897940c5e19cc00bb99 + languageName: node + linkType: hard + +"tinybench@npm:^2.5.0": + version: 2.9.0 + resolution: "tinybench@npm:2.9.0" + checksum: 10c0/c3500b0f60d2eb8db65250afe750b66d51623057ee88720b7f064894a6cb7eb93360ca824a60a31ab16dab30c7b1f06efe0795b352e37914a9d4bad86386a20c + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.12": + version: 0.2.16 + resolution: "tinyglobby@npm:0.2.16" + dependencies: + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.4" + checksum: 10c0/f2e09fd93dd95c41e522113b686ff6f7c13020962f8698a864a257f3d7737599afc47722b7ab726e12f8a813f779906187911ff8ee6701ede65072671a7e934b + languageName: node + linkType: hard + +"tinypool@npm:^0.7.0": + version: 0.7.0 + resolution: "tinypool@npm:0.7.0" + checksum: 10c0/ecb35d9f74e72722c059acb1947ffc3c2caccb45266b89b72f74be2d28f0784d948b50bd9c6c68fa4159afd423ac5f5a07271a5f516d18a565dd06af0a37bc44 + languageName: node + linkType: hard + +"tinyspy@npm:^2.1.1": + version: 2.2.1 + resolution: "tinyspy@npm:2.2.1" + checksum: 10c0/0b4cfd07c09871e12c592dfa7b91528124dc49a4766a0b23350638c62e6a483d5a2a667de7e6282246c0d4f09996482ddaacbd01f0c05b7ed7e0f79d32409bdc + languageName: node + linkType: hard + +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 10c0/047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 + languageName: node + linkType: hard + +"ts-node@npm:^10.9.0": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + dependencies: + "@cspotcode/source-map-support": "npm:^0.8.0" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" + make-error: "npm:^1.1.1" + v8-compile-cache-lib: "npm:^3.0.1" + yn: "npm:3.1.1" + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 10c0/5f29938489f96982a25ba650b64218e83a3357d76f7bede80195c65ab44ad279c8357264639b7abdd5d7e75fc269a83daa0e9c62fd8637a3def67254ecc9ddc2 + languageName: node + linkType: hard + +"tslib@npm:^2.8.0, tslib@npm:^2.8.1": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 + languageName: node + linkType: hard + +"tweetnacl@npm:^1.0.3": + version: 1.0.3 + resolution: "tweetnacl@npm:1.0.3" + checksum: 10c0/069d9df51e8ad4a89fbe6f9806c68e06c65be3c7d42f0701cc43dba5f0d6064686b238bbff206c5addef8854e3ce00c643bff59432ea2f2c639feab0ee1a93f9 + languageName: node + linkType: hard + +"type-detect@npm:^4.0.0, type-detect@npm:^4.1.0": + version: 4.1.0 + resolution: "type-detect@npm:4.1.0" + checksum: 10c0/df8157ca3f5d311edc22885abc134e18ff8ffbc93d6a9848af5b682730ca6a5a44499259750197250479c5331a8a75b5537529df5ec410622041650a7f293e2a + languageName: node + linkType: hard + +"typescript@npm:^5.0.0, typescript@npm:^5.3.0": + version: 5.9.3 + resolution: "typescript@npm:5.9.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5.0.0#optional!builtin, typescript@patch:typescript@npm%3A^5.3.0#optional!builtin": + version: 5.9.3 + resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=cef18b" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/6f7e53bf0d9702350deeb6f35e08b69cbc8b958c33e0ec77bdc0ad6a6c8e280f3959dcbfde6f5b0848bece57810696489deaaa53d75de3578ff255d168c1efbd + languageName: node + linkType: hard + +"ufo@npm:^1.6.3": + version: 1.6.4 + resolution: "ufo@npm:1.6.4" + checksum: 10c0/3a2b29e7e3d772fbf6893d7d23bf442981457adb2fe122828abdbda89bedcb81aafd0dcc080e41b45f9a877db00cb42cbfee9639753a19d9b9bd39b5627039cf + languageName: node + linkType: hard + +"undici-types@npm:^7.19.2": + version: 7.25.0 + resolution: "undici-types@npm:7.25.0" + checksum: 10c0/b30edc6d3a0aa0f1f4e0f4f56dc08b81ffbecc27e3b142b1363555104b076f9eebaa61dfd835d91a8341ad6c5e6f789ed2161f75b80855378828cd93ad7c9d26 + languageName: node + linkType: hard + +"undici-types@npm:~6.21.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04 + languageName: node + linkType: hard + +"undici-types@npm:~7.19.0": + version: 7.19.2 + resolution: "undici-types@npm:7.19.2" + checksum: 10c0/7159f10546f9f6c47d36776bb1bbf8671e87c1e587a6fee84ae1f111ae8de4f914efa8ca0dfcd224f4f4a9dfc3f6028f627ccb5ddaccf82d7fd54671b89fac3e + languageName: node + linkType: hard + +"undici@npm:^6.25.0": + version: 6.25.0 + resolution: "undici@npm:6.25.0" + checksum: 10c0/2597cc6689bdb02c210c557b1f85febbfda65becae6e6fc1061508e2f33734d25207f81cd8af56ada9956329eb3a7bd7431e87dcfeceba20ee87059b57dcf985 + languageName: node + linkType: hard + +"utf-8-validate@npm:^6.0.0": + version: 6.0.6 + resolution: "utf-8-validate@npm:6.0.6" + dependencies: + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.3.0" + checksum: 10c0/88c3581c43b9f824f0939b0da0ecf0cf092ff944ace7be517a5459bc18fe1884fc4acda3502ed369b4ce44baf40590a8f1e820c43a425df0758f2ba76b055f77 + languageName: node + linkType: hard + +"uuid@npm:^11.0.0": + version: 11.1.1 + resolution: "uuid@npm:11.1.1" + bin: + uuid: dist/esm/bin/uuid + checksum: 10c0/9e3af58eba872ece5a5e76f4773a94fc78a0ef2c2444c38dbe6b42f41dadf76c01850fd783604f27986f6195e6286aef064d45987d401b2a33127b98ddf7c0c5 + languageName: node + linkType: hard + +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 10c0/bdc36fb8095d3b41df197f5fb6f11e3a26adf4059df3213e3baa93810d8f0cc76f9a74aaefc18b73e91fe7e19154ed6f134eda6fded2e0f1c8d2272ed2d2d391 + languageName: node + linkType: hard + +"vite-node@npm:0.34.6": + version: 0.34.6 + resolution: "vite-node@npm:0.34.6" + dependencies: + cac: "npm:^6.7.14" + debug: "npm:^4.3.4" + mlly: "npm:^1.4.0" + pathe: "npm:^1.1.1" + picocolors: "npm:^1.0.0" + vite: "npm:^3.0.0 || ^4.0.0 || ^5.0.0-0" + bin: + vite-node: vite-node.mjs + checksum: 10c0/0e804eab1ae5f0d98014f0a933ec08bfc287228283c3c4792f5f8b8fec6657896e513498e8436449e3116839a5592f9b497cf0b982b8da1152d7d419ccc306f1 + languageName: node + linkType: hard + +"vite@npm:^3.0.0 || ^4.0.0 || ^5.0.0-0, vite@npm:^3.1.0 || ^4.0.0 || ^5.0.0-0": + version: 5.4.21 + resolution: "vite@npm:5.4.21" + dependencies: + esbuild: "npm:^0.21.3" + fsevents: "npm:~2.3.3" + postcss: "npm:^8.4.43" + rollup: "npm:^4.20.0" + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/468336a1409f728b464160cbf02672e72271fb688d0e605e776b74a89d27e1029509eef3a3a6c755928d8011e474dbf234824d054d07960be5f23cd176bc72de + languageName: node + linkType: hard + +"vitest@npm:^0.34.0": + version: 0.34.6 + resolution: "vitest@npm:0.34.6" + dependencies: + "@types/chai": "npm:^4.3.5" + "@types/chai-subset": "npm:^1.3.3" + "@types/node": "npm:*" + "@vitest/expect": "npm:0.34.6" + "@vitest/runner": "npm:0.34.6" + "@vitest/snapshot": "npm:0.34.6" + "@vitest/spy": "npm:0.34.6" + "@vitest/utils": "npm:0.34.6" + acorn: "npm:^8.9.0" + acorn-walk: "npm:^8.2.0" + cac: "npm:^6.7.14" + chai: "npm:^4.3.10" + debug: "npm:^4.3.4" + local-pkg: "npm:^0.4.3" + magic-string: "npm:^0.30.1" + pathe: "npm:^1.1.1" + picocolors: "npm:^1.0.0" + std-env: "npm:^3.3.3" + strip-literal: "npm:^1.0.1" + tinybench: "npm:^2.5.0" + tinypool: "npm:^0.7.0" + vite: "npm:^3.1.0 || ^4.0.0 || ^5.0.0-0" + vite-node: "npm:0.34.6" + why-is-node-running: "npm:^2.2.2" + peerDependencies: + "@edge-runtime/vm": "*" + "@vitest/browser": "*" + "@vitest/ui": "*" + happy-dom: "*" + jsdom: "*" + playwright: "*" + safaridriver: "*" + webdriverio: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + bin: + vitest: vitest.mjs + checksum: 10c0/7b5e87875991a66fe5cca62477f21447d7cdf4d101ac381ca02a16f4223b1ae5d0bc17ce42616d6dc74742757730ed511ada05aaa7090b6075e304c883cf0bc3 + languageName: node + linkType: hard + +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: 10c0/5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db + languageName: node + linkType: hard + +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: "npm:~0.0.3" + webidl-conversions: "npm:^3.0.0" + checksum: 10c0/1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 + languageName: node + linkType: hard + +"which@npm:^6.0.0": + version: 6.0.1 + resolution: "which@npm:6.0.1" + dependencies: + isexe: "npm:^4.0.0" + bin: + node-which: bin/which.js + checksum: 10c0/7e710e54ea36d2d6183bee2f9caa27a3b47b9baf8dee55a199b736fcf85eab3b9df7556fca3d02b50af7f3dfba5ea3a45644189836df06267df457e354da66d5 + languageName: node + linkType: hard + +"why-is-node-running@npm:^2.2.2": + version: 2.3.0 + resolution: "why-is-node-running@npm:2.3.0" + dependencies: + siginfo: "npm:^2.0.0" + stackback: "npm:0.0.2" + bin: + why-is-node-running: cli.js + checksum: 10c0/1cde0b01b827d2cf4cb11db962f3958b9175d5d9e7ac7361d1a7b0e2dc6069a263e69118bd974c4f6d0a890ef4eedfe34cf3d5167ec14203dbc9a18620537054 + languageName: node + linkType: hard + +"ws@npm:^7.5.10": + version: 7.5.10 + resolution: "ws@npm:7.5.10" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/bd7d5f4aaf04fae7960c23dcb6c6375d525e00f795dd20b9385902bd008c40a94d3db3ce97d878acc7573df852056ca546328b27b39f47609f80fb22a0a9b61d + languageName: node + linkType: hard + +"ws@npm:^8.19.0, ws@npm:^8.5.0": + version: 8.20.0 + resolution: "ws@npm:8.20.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/956ac5f11738c914089b65878b9223692ace77337ba55379ae68e1ecbeae9b47a0c6eb9403688f609999a58c80d83d99865fe0029b229d308b08c1ef93d4ea14 + languageName: node + linkType: hard + +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 10c0/0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 + languageName: node + linkType: hard + +"yocto-queue@npm:^1.0.0": + version: 1.2.2 + resolution: "yocto-queue@npm:1.2.2" + checksum: 10c0/36d4793e9cf7060f9da543baf67c55e354f4862c8d3d34de1a1b1d7c382d44171315cc54abf84d8900b8113d742b830108a1434f4898fb244f9b7e8426d4b8f5 + languageName: node + linkType: hard diff --git a/private-payments b/private-payments deleted file mode 160000 index 14545736..00000000 --- a/private-payments +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 14545736ef8adca15072d802e16c1176452cbd56 diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index fb57ccd1..00000000 --- a/yarn.lock +++ /dev/null @@ -1,4 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - From 128a8e63c754b122138f572240cb933df4979352 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 16:22:45 +0200 Subject: [PATCH 02/42] fix: import --- pinocchio-ephemeral-permission-counter/Cargo.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pinocchio-ephemeral-permission-counter/Cargo.toml b/pinocchio-ephemeral-permission-counter/Cargo.toml index 510aea78..a826db25 100644 --- a/pinocchio-ephemeral-permission-counter/Cargo.toml +++ b/pinocchio-ephemeral-permission-counter/Cargo.toml @@ -14,5 +14,4 @@ pinocchio = { version = "0.10.1", features = ["cpi", "copy"] } pinocchio-log = { version = "0.5.1" } pinocchio-system = { version = "0.5" } solana-address = { version = "2.6", features = ["syscalls"] } -# ephemeral-rollups-pinocchio = { git = "https://github.com/magicblock-labs/ephemeral-rollups-sdk.git", rev = "a8ecea450d3bbe5bac119a3f4c55cd9f96b4837b" } -ephemeral-rollups-pinocchio = { path = "../../ephemeral-rollups-sdk/rust/pinocchio" } +ephemeral-rollups-pinocchio = { git = "https://github.com/magicblock-labs/ephemeral-rollups-sdk.git", rev = "a8ecea450d3bbe5bac119a3f4c55cd9f96b4837b" } From d0b4b082a0346bb8fbe317a3179ecac89aed3166 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 16:23:30 +0200 Subject: [PATCH 03/42] fix: license --- pinocchio-ephemeral-permission-counter/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinocchio-ephemeral-permission-counter/package.json b/pinocchio-ephemeral-permission-counter/package.json index 85cd429f..f9e745aa 100644 --- a/pinocchio-ephemeral-permission-counter/package.json +++ b/pinocchio-ephemeral-permission-counter/package.json @@ -18,7 +18,7 @@ "program" ], "author": "", - "license": "Apache-2.0", + "license": "MIT", "devDependencies": { "@magicblock-labs/ephemeral-rollups-sdk": "^0.11.1", "@solana-program/system": "^0.10.0", From ad2bf5c431cb370cdc3037ae148d79f99c605813 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 16:24:56 +0200 Subject: [PATCH 04/42] feat: update vitest --- .../package.json | 4 +- .../yarn.lock | 785 +++++++++--------- 2 files changed, 382 insertions(+), 407 deletions(-) diff --git a/pinocchio-ephemeral-permission-counter/package.json b/pinocchio-ephemeral-permission-counter/package.json index f9e745aa..56788185 100644 --- a/pinocchio-ephemeral-permission-counter/package.json +++ b/pinocchio-ephemeral-permission-counter/package.json @@ -30,6 +30,6 @@ "ts-node": "^10.9.0", "tweetnacl": "^1.0.3", "typescript": "^5.0.0", - "vitest": "^0.34.0" + "vitest": "^3.0.0" } -} \ No newline at end of file +} diff --git a/pinocchio-ephemeral-permission-counter/yarn.lock b/pinocchio-ephemeral-permission-counter/yarn.lock index c2b25232..0e5aef44 100644 --- a/pinocchio-ephemeral-permission-counter/yarn.lock +++ b/pinocchio-ephemeral-permission-counter/yarn.lock @@ -21,163 +21,184 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/aix-ppc64@npm:0.21.5" +"@esbuild/aix-ppc64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/aix-ppc64@npm:0.27.7" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/android-arm64@npm:0.21.5" +"@esbuild/android-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/android-arm64@npm:0.27.7" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/android-arm@npm:0.21.5" +"@esbuild/android-arm@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/android-arm@npm:0.27.7" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/android-x64@npm:0.21.5" +"@esbuild/android-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/android-x64@npm:0.27.7" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/darwin-arm64@npm:0.21.5" +"@esbuild/darwin-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/darwin-arm64@npm:0.27.7" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/darwin-x64@npm:0.21.5" +"@esbuild/darwin-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/darwin-x64@npm:0.27.7" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/freebsd-arm64@npm:0.21.5" +"@esbuild/freebsd-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/freebsd-arm64@npm:0.27.7" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/freebsd-x64@npm:0.21.5" +"@esbuild/freebsd-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/freebsd-x64@npm:0.27.7" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-arm64@npm:0.21.5" +"@esbuild/linux-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-arm64@npm:0.27.7" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-arm@npm:0.21.5" +"@esbuild/linux-arm@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-arm@npm:0.27.7" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-ia32@npm:0.21.5" +"@esbuild/linux-ia32@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-ia32@npm:0.27.7" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-loong64@npm:0.21.5" +"@esbuild/linux-loong64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-loong64@npm:0.27.7" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-mips64el@npm:0.21.5" +"@esbuild/linux-mips64el@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-mips64el@npm:0.27.7" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-ppc64@npm:0.21.5" +"@esbuild/linux-ppc64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-ppc64@npm:0.27.7" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-riscv64@npm:0.21.5" +"@esbuild/linux-riscv64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-riscv64@npm:0.27.7" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-s390x@npm:0.21.5" +"@esbuild/linux-s390x@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-s390x@npm:0.27.7" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-x64@npm:0.21.5" +"@esbuild/linux-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-x64@npm:0.27.7" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/netbsd-x64@npm:0.21.5" +"@esbuild/netbsd-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/netbsd-arm64@npm:0.27.7" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/netbsd-x64@npm:0.27.7" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/openbsd-x64@npm:0.21.5" +"@esbuild/openbsd-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/openbsd-arm64@npm:0.27.7" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/openbsd-x64@npm:0.27.7" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/sunos-x64@npm:0.21.5" +"@esbuild/openharmony-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/openharmony-arm64@npm:0.27.7" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/sunos-x64@npm:0.27.7" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/win32-arm64@npm:0.21.5" +"@esbuild/win32-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/win32-arm64@npm:0.27.7" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/win32-ia32@npm:0.21.5" +"@esbuild/win32-ia32@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/win32-ia32@npm:0.27.7" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/win32-x64@npm:0.21.5" +"@esbuild/win32-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/win32-x64@npm:0.27.7" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -191,15 +212,6 @@ __metadata: languageName: node linkType: hard -"@jest/schemas@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/schemas@npm:29.6.3" - dependencies: - "@sinclair/typebox": "npm:^0.27.8" - checksum: 10c0/b329e89cd5f20b9278ae1233df74016ebf7b385e0d14b9f4c1ad18d096c4c19d1e687aa113a9c976b16ec07f021ae53dea811fb8c1248a50ac34fbe009fdf6be - languageName: node - linkType: hard - "@jridgewell/resolve-uri@npm:^3.0.3": version: 3.1.2 resolution: "@jridgewell/resolve-uri@npm:3.1.2" @@ -481,13 +493,6 @@ __metadata: languageName: node linkType: hard -"@sinclair/typebox@npm:^0.27.8": - version: 0.27.10 - resolution: "@sinclair/typebox@npm:0.27.10" - checksum: 10c0/ca42a02817656dbdae464ed4bb8aca6ad4718d7618e270760fea84a834ad0ecc1a22eba51421f09e5047174571131356ff3b5d80d609ced775d631df7b404b0d - languageName: node - linkType: hard - "@solana-program/system@npm:^0.10.0": version: 0.10.0 resolution: "@solana-program/system@npm:0.10.0" @@ -1295,19 +1300,13 @@ __metadata: languageName: node linkType: hard -"@types/chai-subset@npm:^1.3.3": - version: 1.3.6 - resolution: "@types/chai-subset@npm:1.3.6" - peerDependencies: - "@types/chai": <5.2.0 - checksum: 10c0/d8e2362ff7e96b742e00326e656a91fffd6dc1260fd081c30bd607f908eb4d6777cec1e535bae905a8741b8287acded8955c0fe84ee3b6874d38502c029d35c4 - languageName: node - linkType: hard - -"@types/chai@npm:^4.3.5": - version: 4.3.20 - resolution: "@types/chai@npm:4.3.20" - checksum: 10c0/4601189d611752e65018f1ecadac82e94eed29f348e1d5430e5681a60b01e1ecf855d9bcc74ae43b07394751f184f6970fac2b5561fc57a1f36e93a0f5ffb6e8 +"@types/chai@npm:^5.2.2": + version: 5.2.3 + resolution: "@types/chai@npm:5.2.3" + dependencies: + "@types/deep-eql": "npm:*" + assertion-error: "npm:^2.0.1" + checksum: 10c0/e0ef1de3b6f8045a5e473e867c8565788c444271409d155588504840ad1a53611011f85072188c2833941189400228c1745d78323dac13fcede9c2b28bacfb2f languageName: node linkType: hard @@ -1320,7 +1319,14 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.8": +"@types/deep-eql@npm:*": + version: 4.0.2 + resolution: "@types/deep-eql@npm:4.0.2" + checksum: 10c0/bf3f811843117900d7084b9d0c852da9a044d12eb40e6de73b552598a6843c21291a8a381b0532644574beecd5e3491c5ff3a0365ab86b15d59862c025384844 + languageName: node + linkType: hard + +"@types/estree@npm:1.0.8, @types/estree@npm:^1.0.0": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 @@ -1377,56 +1383,86 @@ __metadata: languageName: node linkType: hard -"@vitest/expect@npm:0.34.6": - version: 0.34.6 - resolution: "@vitest/expect@npm:0.34.6" +"@vitest/expect@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/expect@npm:3.2.4" + dependencies: + "@types/chai": "npm:^5.2.2" + "@vitest/spy": "npm:3.2.4" + "@vitest/utils": "npm:3.2.4" + chai: "npm:^5.2.0" + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/7586104e3fd31dbe1e6ecaafb9a70131e4197dce2940f727b6a84131eee3decac7b10f9c7c72fa5edbdb68b6f854353bd4c0fa84779e274207fb7379563b10db + languageName: node + linkType: hard + +"@vitest/mocker@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/mocker@npm:3.2.4" + dependencies: + "@vitest/spy": "npm:3.2.4" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.17" + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 10c0/f7a4aea19bbbf8f15905847ee9143b6298b2c110f8b64789224cb0ffdc2e96f9802876aa2ca83f1ec1b6e1ff45e822abb34f0054c24d57b29ab18add06536ccd + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:3.2.4, @vitest/pretty-format@npm:^3.2.4": + version: 3.2.4 + resolution: "@vitest/pretty-format@npm:3.2.4" dependencies: - "@vitest/spy": "npm:0.34.6" - "@vitest/utils": "npm:0.34.6" - chai: "npm:^4.3.10" - checksum: 10c0/d68abc53d673c2c98cad84da4fa73bd407d59a1098ca528c6925c202321d4eeecde5eaf512980614a755200ae1aa6b648d44da09b78ce4cc95aa78eff8ee558a + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/5ad7d4278e067390d7d633e307fee8103958806a419ca380aec0e33fae71b44a64415f7a9b4bc11635d3c13d4a9186111c581d3cef9c65cc317e68f077456887 languageName: node linkType: hard -"@vitest/runner@npm:0.34.6": - version: 0.34.6 - resolution: "@vitest/runner@npm:0.34.6" +"@vitest/runner@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/runner@npm:3.2.4" dependencies: - "@vitest/utils": "npm:0.34.6" - p-limit: "npm:^4.0.0" - pathe: "npm:^1.1.1" - checksum: 10c0/d00d8c399513693eb6c82fd08b0e32fcf486bede5b88805e8dea90e156d502418477788b501b1c078abd38f0147e99a187061b2da81819e8d5c162a63edf5b40 + "@vitest/utils": "npm:3.2.4" + pathe: "npm:^2.0.3" + strip-literal: "npm:^3.0.0" + checksum: 10c0/e8be51666c72b3668ae3ea348b0196656a4a5adb836cb5e270720885d9517421815b0d6c98bfdf1795ed02b994b7bfb2b21566ee356a40021f5bf4f6ed4e418a languageName: node linkType: hard -"@vitest/snapshot@npm:0.34.6": - version: 0.34.6 - resolution: "@vitest/snapshot@npm:0.34.6" +"@vitest/snapshot@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/snapshot@npm:3.2.4" dependencies: - magic-string: "npm:^0.30.1" - pathe: "npm:^1.1.1" - pretty-format: "npm:^29.5.0" - checksum: 10c0/08dbfb3cb6d202116e981abf421096eae920d65bca867c38651b02d2623e25a18e2ead6e5de13a49ebe9f2f9d007b2f692714aa6a5c9f18c3ff17b9f8726dbab + "@vitest/pretty-format": "npm:3.2.4" + magic-string: "npm:^0.30.17" + pathe: "npm:^2.0.3" + checksum: 10c0/f8301a3d7d1559fd3d59ed51176dd52e1ed5c2d23aa6d8d6aa18787ef46e295056bc726a021698d8454c16ed825ecba163362f42fa90258bb4a98cfd2c9424fc languageName: node linkType: hard -"@vitest/spy@npm:0.34.6": - version: 0.34.6 - resolution: "@vitest/spy@npm:0.34.6" +"@vitest/spy@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/spy@npm:3.2.4" dependencies: - tinyspy: "npm:^2.1.1" - checksum: 10c0/ea36d31c521f4c458f7e439ceeb0d1e5c2e9298aaafad7c9bc5ebe75f36c9b871c1f3a6dcb5bfd6c4e83b34979d511f9a7830fa8720b7e1faa18ef121845e9d5 + tinyspy: "npm:^4.0.3" + checksum: 10c0/6ebf0b4697dc238476d6b6a60c76ba9eb1dd8167a307e30f08f64149612fd50227682b876420e4c2e09a76334e73f72e3ebf0e350714dc22474258292e202024 languageName: node linkType: hard -"@vitest/utils@npm:0.34.6": - version: 0.34.6 - resolution: "@vitest/utils@npm:0.34.6" +"@vitest/utils@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/utils@npm:3.2.4" dependencies: - diff-sequences: "npm:^29.4.3" - loupe: "npm:^2.3.6" - pretty-format: "npm:^29.5.0" - checksum: 10c0/6f32f086b8bf0e8125a11b26cad4ce77ad90943590b55cd1ebb1424412d1feb6d404ee4ded523c346a8f222c265251652b4888f2ede769e3d7fce6fb1ee0a620 + "@vitest/pretty-format": "npm:3.2.4" + loupe: "npm:^3.1.4" + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/024a9b8c8bcc12cf40183c246c244b52ecff861c6deb3477cbf487ac8781ad44c68a9c5fd69f8c1361878e55b97c10d99d511f2597f1f7244b5e5101d028ba64 languageName: node linkType: hard @@ -1437,7 +1473,7 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": +"acorn-walk@npm:^8.1.1": version: 8.3.5 resolution: "acorn-walk@npm:8.3.5" dependencies: @@ -1446,7 +1482,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.10.0, acorn@npm:^8.11.0, acorn@npm:^8.16.0, acorn@npm:^8.4.1, acorn@npm:^8.9.0": +"acorn@npm:^8.11.0, acorn@npm:^8.4.1": version: 8.16.0 resolution: "acorn@npm:8.16.0" bin: @@ -1464,13 +1500,6 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^5.0.0": - version: 5.2.0 - resolution: "ansi-styles@npm:5.2.0" - checksum: 10c0/9c4ca80eb3c2fb7b33841c210d2f20807f40865d27008d7c3f707b7f95cab7d67462a565e2388ac3285b71cb3d9bb2173de8da37c57692a362885ec34d6e27df - languageName: node - linkType: hard - "arg@npm:^4.1.0": version: 4.1.3 resolution: "arg@npm:4.1.3" @@ -1501,10 +1530,10 @@ __metadata: languageName: node linkType: hard -"assertion-error@npm:^1.1.0": - version: 1.1.0 - resolution: "assertion-error@npm:1.1.0" - checksum: 10c0/25456b2aa333250f01143968e02e4884a34588a8538fbbf65c91a637f1dbfb8069249133cd2f4e530f10f624d206a664e7df30207830b659e9f5298b00a4099b +"assertion-error@npm:^2.0.1": + version: 2.0.1 + resolution: "assertion-error@npm:2.0.1" + checksum: 10c0/bbbcb117ac6480138f8c93cf7f535614282dea9dc828f540cdece85e3c665e8f78958b96afac52f29ff883c72638e6a87d469ecc9fe5bc902df03ed24a55dba8 languageName: node linkType: hard @@ -1608,18 +1637,16 @@ __metadata: languageName: node linkType: hard -"chai@npm:^4.3.10": - version: 4.5.0 - resolution: "chai@npm:4.5.0" +"chai@npm:^5.2.0": + version: 5.3.3 + resolution: "chai@npm:5.3.3" dependencies: - assertion-error: "npm:^1.1.0" - check-error: "npm:^1.0.3" - deep-eql: "npm:^4.1.3" - get-func-name: "npm:^2.0.2" - loupe: "npm:^2.3.6" - pathval: "npm:^1.1.1" - type-detect: "npm:^4.1.0" - checksum: 10c0/b8cb596bd1aece1aec659e41a6e479290c7d9bee5b3ad63d2898ad230064e5b47889a3bc367b20100a0853b62e026e2dc514acf25a3c9385f936aa3614d4ab4d + assertion-error: "npm:^2.0.1" + check-error: "npm:^2.1.1" + deep-eql: "npm:^5.0.1" + loupe: "npm:^3.1.0" + pathval: "npm:^2.0.0" + checksum: 10c0/b360fd4d38861622e5010c2f709736988b05c7f31042305fa3f4e9911f6adb80ccfb4e302068bf8ed10e835c2e2520cba0f5edc13d878b886987e5aa62483f53 languageName: node linkType: hard @@ -1630,12 +1657,10 @@ __metadata: languageName: node linkType: hard -"check-error@npm:^1.0.3": - version: 1.0.3 - resolution: "check-error@npm:1.0.3" - dependencies: - get-func-name: "npm:^2.0.2" - checksum: 10c0/94aa37a7315c0e8a83d0112b5bfb5a8624f7f0f81057c73e4707729cdd8077166c6aefb3d8e2b92c63ee130d4a2ff94bad46d547e12f3238cc1d78342a973841 +"check-error@npm:^2.1.1": + version: 2.1.3 + resolution: "check-error@npm:2.1.3" + checksum: 10c0/878e99038fb6476316b74668cd6a498c7e66df3efe48158fa40db80a06ba4258742ac3ee2229c4a2a98c5e73f5dff84eb3e50ceb6b65bbd8f831eafc8338607d languageName: node linkType: hard @@ -1667,13 +1692,6 @@ __metadata: languageName: node linkType: hard -"confbox@npm:^0.1.8": - version: 0.1.8 - resolution: "confbox@npm:0.1.8" - checksum: 10c0/fc2c68d97cb54d885b10b63e45bd8da83a8a71459d3ecf1825143dd4c7f9f1b696b3283e07d9d12a144c1301c2ebc7842380bdf0014e55acc4ae1c9550102418 - languageName: node - linkType: hard - "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -1681,7 +1699,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.3.4": +"debug@npm:^4.4.1": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -1693,12 +1711,10 @@ __metadata: languageName: node linkType: hard -"deep-eql@npm:^4.1.3": - version: 4.1.4 - resolution: "deep-eql@npm:4.1.4" - dependencies: - type-detect: "npm:^4.0.0" - checksum: 10c0/264e0613493b43552fc908f4ff87b8b445c0e6e075656649600e1b8a17a57ee03e960156fce7177646e4d2ddaf8e5ee616d76bd79929ff593e5c79e4e5e6c517 +"deep-eql@npm:^5.0.1": + version: 5.0.2 + resolution: "deep-eql@npm:5.0.2" + checksum: 10c0/7102cf3b7bb719c6b9c0db2e19bf0aa9318d141581befe8c7ce8ccd39af9eaa4346e5e05adef7f9bd7015da0f13a3a25dcfe306ef79dc8668aedbecb658dd247 languageName: node linkType: hard @@ -1709,13 +1725,6 @@ __metadata: languageName: node linkType: hard -"diff-sequences@npm:^29.4.3": - version: 29.6.3 - resolution: "diff-sequences@npm:29.6.3" - checksum: 10c0/32e27ac7dbffdf2fb0eb5a84efd98a9ad084fbabd5ac9abb8757c6770d5320d2acd172830b28c4add29bb873d59420601dfc805ac4064330ce59b1adfd0593b2 - languageName: node - linkType: hard - "diff@npm:^4.0.1": version: 4.0.4 resolution: "diff@npm:4.0.4" @@ -1752,6 +1761,13 @@ __metadata: languageName: node linkType: hard +"es-module-lexer@npm:^1.7.0": + version: 1.7.0 + resolution: "es-module-lexer@npm:1.7.0" + checksum: 10c0/4c935affcbfeba7fb4533e1da10fa8568043df1e3574b869385980de9e2d475ddc36769891936dbb07036edb3c3786a8b78ccf44964cd130dedc1f2c984b6c7b + languageName: node + linkType: hard + "es6-promise@npm:^4.0.3": version: 4.2.8 resolution: "es6-promise@npm:4.2.8" @@ -1768,33 +1784,36 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.21.3": - version: 0.21.5 - resolution: "esbuild@npm:0.21.5" - dependencies: - "@esbuild/aix-ppc64": "npm:0.21.5" - "@esbuild/android-arm": "npm:0.21.5" - "@esbuild/android-arm64": "npm:0.21.5" - "@esbuild/android-x64": "npm:0.21.5" - "@esbuild/darwin-arm64": "npm:0.21.5" - "@esbuild/darwin-x64": "npm:0.21.5" - "@esbuild/freebsd-arm64": "npm:0.21.5" - "@esbuild/freebsd-x64": "npm:0.21.5" - "@esbuild/linux-arm": "npm:0.21.5" - "@esbuild/linux-arm64": "npm:0.21.5" - "@esbuild/linux-ia32": "npm:0.21.5" - "@esbuild/linux-loong64": "npm:0.21.5" - "@esbuild/linux-mips64el": "npm:0.21.5" - "@esbuild/linux-ppc64": "npm:0.21.5" - "@esbuild/linux-riscv64": "npm:0.21.5" - "@esbuild/linux-s390x": "npm:0.21.5" - "@esbuild/linux-x64": "npm:0.21.5" - "@esbuild/netbsd-x64": "npm:0.21.5" - "@esbuild/openbsd-x64": "npm:0.21.5" - "@esbuild/sunos-x64": "npm:0.21.5" - "@esbuild/win32-arm64": "npm:0.21.5" - "@esbuild/win32-ia32": "npm:0.21.5" - "@esbuild/win32-x64": "npm:0.21.5" +"esbuild@npm:^0.27.0": + version: 0.27.7 + resolution: "esbuild@npm:0.27.7" + dependencies: + "@esbuild/aix-ppc64": "npm:0.27.7" + "@esbuild/android-arm": "npm:0.27.7" + "@esbuild/android-arm64": "npm:0.27.7" + "@esbuild/android-x64": "npm:0.27.7" + "@esbuild/darwin-arm64": "npm:0.27.7" + "@esbuild/darwin-x64": "npm:0.27.7" + "@esbuild/freebsd-arm64": "npm:0.27.7" + "@esbuild/freebsd-x64": "npm:0.27.7" + "@esbuild/linux-arm": "npm:0.27.7" + "@esbuild/linux-arm64": "npm:0.27.7" + "@esbuild/linux-ia32": "npm:0.27.7" + "@esbuild/linux-loong64": "npm:0.27.7" + "@esbuild/linux-mips64el": "npm:0.27.7" + "@esbuild/linux-ppc64": "npm:0.27.7" + "@esbuild/linux-riscv64": "npm:0.27.7" + "@esbuild/linux-s390x": "npm:0.27.7" + "@esbuild/linux-x64": "npm:0.27.7" + "@esbuild/netbsd-arm64": "npm:0.27.7" + "@esbuild/netbsd-x64": "npm:0.27.7" + "@esbuild/openbsd-arm64": "npm:0.27.7" + "@esbuild/openbsd-x64": "npm:0.27.7" + "@esbuild/openharmony-arm64": "npm:0.27.7" + "@esbuild/sunos-x64": "npm:0.27.7" + "@esbuild/win32-arm64": "npm:0.27.7" + "@esbuild/win32-ia32": "npm:0.27.7" + "@esbuild/win32-x64": "npm:0.27.7" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -1830,10 +1849,16 @@ __metadata: optional: true "@esbuild/linux-x64": optional: true + "@esbuild/netbsd-arm64": + optional: true "@esbuild/netbsd-x64": optional: true + "@esbuild/openbsd-arm64": + optional: true "@esbuild/openbsd-x64": optional: true + "@esbuild/openharmony-arm64": + optional: true "@esbuild/sunos-x64": optional: true "@esbuild/win32-arm64": @@ -1844,7 +1869,16 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10c0/fa08508adf683c3f399e8a014a6382a6b65542213431e26206c0720e536b31c09b50798747c2a105a4bbba1d9767b8d3615a74c2f7bf1ddf6d836cd11eb672de + checksum: 10c0/ccd51f0555708bc9ff4ec9dc3ac92d3daacd45ecaac949ca8645984c5c323bf8cefe98c2df307418685e0b4ce37f9a3bdbfe8e3651fe632a0059a436195a17d4 + languageName: node + linkType: hard + +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d languageName: node linkType: hard @@ -1855,6 +1889,13 @@ __metadata: languageName: node linkType: hard +"expect-type@npm:^1.2.1": + version: 1.3.0 + resolution: "expect-type@npm:1.3.0" + checksum: 10c0/8412b3fe4f392c420ab41dae220b09700e4e47c639a29ba7ba2e83cc6cffd2b4926f7ac9e47d7e277e8f4f02acda76fd6931cb81fd2b382fa9477ef9ada953fd + languageName: node + linkType: hard + "exponential-backoff@npm:^3.1.1": version: 3.1.3 resolution: "exponential-backoff@npm:3.1.3" @@ -1907,13 +1948,6 @@ __metadata: languageName: node linkType: hard -"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": - version: 2.0.2 - resolution: "get-func-name@npm:2.0.2" - checksum: 10c0/89830fd07623fa73429a711b9daecdb304386d237c71268007f788f113505ef1d4cc2d0b9680e072c5082490aec9df5d7758bf5ac6f1c37062855e8e3dc0b9df - languageName: node - linkType: hard - "graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" @@ -2003,6 +2037,13 @@ __metadata: languageName: node linkType: hard +"js-tokens@npm:^9.0.1": + version: 9.0.1 + resolution: "js-tokens@npm:9.0.1" + checksum: 10c0/68dcab8f233dde211a6b5fd98079783cbcd04b53617c1250e3553ee16ab3e6134f5e65478e41d82f6d351a052a63d71024553933808570f04dbf828d7921e80e + languageName: node + linkType: hard + "json-stringify-safe@npm:^5.0.1": version: 5.0.1 resolution: "json-stringify-safe@npm:5.0.1" @@ -2010,23 +2051,14 @@ __metadata: languageName: node linkType: hard -"local-pkg@npm:^0.4.3": - version: 0.4.3 - resolution: "local-pkg@npm:0.4.3" - checksum: 10c0/361c77d7873a629f09c9e86128926227171ee0fe3435d282fb80303ff255bb4d3c053b555d47e953b4f41d2561f2a7bc0e53e9ca5c9bc9607226a77c91ea4994 - languageName: node - linkType: hard - -"loupe@npm:^2.3.6": - version: 2.3.7 - resolution: "loupe@npm:2.3.7" - dependencies: - get-func-name: "npm:^2.0.1" - checksum: 10c0/71a781c8fc21527b99ed1062043f1f2bb30bdaf54fa4cf92463427e1718bc6567af2988300bc243c1f276e4f0876f29e3cbf7b58106fdc186915687456ce5bf4 +"loupe@npm:^3.1.0, loupe@npm:^3.1.4": + version: 3.2.1 + resolution: "loupe@npm:3.2.1" + checksum: 10c0/910c872cba291309664c2d094368d31a68907b6f5913e989d301b5c25f30e97d76d77f23ab3bf3b46d0f601ff0b6af8810c10c31b91d2c6b2f132809ca2cc705 languageName: node linkType: hard -"magic-string@npm:^0.30.1": +"magic-string@npm:^0.30.17": version: 0.30.21 resolution: "magic-string@npm:0.30.21" dependencies: @@ -2072,18 +2104,6 @@ __metadata: languageName: node linkType: hard -"mlly@npm:^1.4.0, mlly@npm:^1.7.4": - version: 1.8.2 - resolution: "mlly@npm:1.8.2" - dependencies: - acorn: "npm:^8.16.0" - pathe: "npm:^2.0.3" - pkg-types: "npm:^1.3.1" - ufo: "npm:^1.6.3" - checksum: 10c0/aa826683a6daddf2aef65f9c8142e362731cf8e415a5591faf92fd51040a76697e45ab6dbb7a3b38be74e0f8c464825a7eabe827750455c7472421953f5da733 - languageName: node - linkType: hard - "ms@npm:^2.0.0, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" @@ -2156,44 +2176,28 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^4.0.0": - version: 4.0.0 - resolution: "p-limit@npm:4.0.0" - dependencies: - yocto-queue: "npm:^1.0.0" - checksum: 10c0/a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad - languageName: node - linkType: hard - -"pathe@npm:^1.1.1": - version: 1.1.2 - resolution: "pathe@npm:1.1.2" - checksum: 10c0/64ee0a4e587fb0f208d9777a6c56e4f9050039268faaaaecd50e959ef01bf847b7872785c36483fa5cdcdbdfdb31fef2ff222684d4fc21c330ab60395c681897 - languageName: node - linkType: hard - -"pathe@npm:^2.0.1, pathe@npm:^2.0.3": +"pathe@npm:^2.0.3": version: 2.0.3 resolution: "pathe@npm:2.0.3" checksum: 10c0/c118dc5a8b5c4166011b2b70608762e260085180bb9e33e80a50dcdb1e78c010b1624f4280c492c92b05fc276715a4c357d1f9edc570f8f1b3d90b6839ebaca1 languageName: node linkType: hard -"pathval@npm:^1.1.1": - version: 1.1.1 - resolution: "pathval@npm:1.1.1" - checksum: 10c0/f63e1bc1b33593cdf094ed6ff5c49c1c0dc5dc20a646ca9725cc7fe7cd9995002d51d5685b9b2ec6814342935748b711bafa840f84c0bb04e38ff40a335c94dc +"pathval@npm:^2.0.0": + version: 2.0.1 + resolution: "pathval@npm:2.0.1" + checksum: 10c0/460f4709479fbf2c45903a65655fc8f0a5f6d808f989173aeef5fdea4ff4f303dc13f7870303999add60ec49d4c14733895c0a869392e9866f1091fa64fd7581 languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": +"picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 languageName: node linkType: hard -"picomatch@npm:^4.0.4": +"picomatch@npm:^4.0.2, picomatch@npm:^4.0.3, picomatch@npm:^4.0.4": version: 4.0.4 resolution: "picomatch@npm:4.0.4" checksum: 10c0/e2c6023372cc7b5764719a5ffb9da0f8e781212fa7ca4bd0562db929df8e117460f00dff3cb7509dacfc06b86de924b247f504d0ce1806a37fac4633081466b0 @@ -2214,22 +2218,11 @@ __metadata: ts-node: "npm:^10.9.0" tweetnacl: "npm:^1.0.3" typescript: "npm:^5.0.0" - vitest: "npm:^0.34.0" + vitest: "npm:^3.0.0" languageName: unknown linkType: soft -"pkg-types@npm:^1.3.1": - version: 1.3.1 - resolution: "pkg-types@npm:1.3.1" - dependencies: - confbox: "npm:^0.1.8" - mlly: "npm:^1.7.4" - pathe: "npm:^2.0.1" - checksum: 10c0/19e6cb8b66dcc66c89f2344aecfa47f2431c988cfa3366bdfdcfb1dd6695f87dcce37fbd90fe9d1605e2f4440b77f391e83c23255347c35cf84e7fd774d7fcea - languageName: node - linkType: hard - -"postcss@npm:^8.4.43": +"postcss@npm:^8.5.6": version: 8.5.14 resolution: "postcss@npm:8.5.14" dependencies: @@ -2240,17 +2233,6 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.5.0": - version: 29.7.0 - resolution: "pretty-format@npm:29.7.0" - dependencies: - "@jest/schemas": "npm:^29.6.3" - ansi-styles: "npm:^5.0.0" - react-is: "npm:^18.0.0" - checksum: 10c0/edc5ff89f51916f036c62ed433506b55446ff739358de77207e63e88a28ca2894caac6e73dcb68166a606e51c8087d32d400473e6a9fdd2dbe743f46c9c0276f - languageName: node - linkType: hard - "proc-log@npm:^6.0.0": version: 6.1.0 resolution: "proc-log@npm:6.1.0" @@ -2274,14 +2256,7 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^18.0.0": - version: 18.3.1 - resolution: "react-is@npm:18.3.1" - checksum: 10c0/f2f1e60010c683479e74c63f96b09fb41603527cd131a9959e2aee1e5a8b0caf270b365e5ca77d4a6b18aae659b60a86150bb3979073528877029b35aecd2072 - languageName: node - linkType: hard - -"rollup@npm:^4.20.0": +"rollup@npm:^4.43.0": version: 4.60.3 resolution: "rollup@npm:4.60.3" dependencies: @@ -2437,7 +2412,7 @@ __metadata: languageName: node linkType: hard -"std-env@npm:^3.3.3": +"std-env@npm:^3.9.0": version: 3.10.0 resolution: "std-env@npm:3.10.0" checksum: 10c0/1814927a45004d36dde6707eaf17552a546769bc79a6421be2c16ce77d238158dfe5de30910b78ec30d95135cc1c59ea73ee22d2ca170f8b9753f84da34c427f @@ -2460,12 +2435,12 @@ __metadata: languageName: node linkType: hard -"strip-literal@npm:^1.0.1": - version: 1.3.0 - resolution: "strip-literal@npm:1.3.0" +"strip-literal@npm:^3.0.0": + version: 3.1.0 + resolution: "strip-literal@npm:3.1.0" dependencies: - acorn: "npm:^8.10.0" - checksum: 10c0/3c0c9ee41eb346e827eede61ef288457f53df30e3e6ff8b94fa81b636933b0c13ca4ea5c97d00a10d72d04be326da99ac819f8769f0c6407ba8177c98344a916 + js-tokens: "npm:^9.0.1" + checksum: 10c0/50918f669915d9ad0fe4b7599902b735f853f2201c97791ead00104a654259c0c61bc2bc8fa3db05109339b61f4cf09e47b94ecc874ffbd0e013965223893af8 languageName: node linkType: hard @@ -2496,14 +2471,21 @@ __metadata: languageName: node linkType: hard -"tinybench@npm:^2.5.0": +"tinybench@npm:^2.9.0": version: 2.9.0 resolution: "tinybench@npm:2.9.0" checksum: 10c0/c3500b0f60d2eb8db65250afe750b66d51623057ee88720b7f064894a6cb7eb93360ca824a60a31ab16dab30c7b1f06efe0795b352e37914a9d4bad86386a20c languageName: node linkType: hard -"tinyglobby@npm:^0.2.12": +"tinyexec@npm:^0.3.2": + version: 0.3.2 + resolution: "tinyexec@npm:0.3.2" + checksum: 10c0/3efbf791a911be0bf0821eab37a3445c2ba07acc1522b1fa84ae1e55f10425076f1290f680286345ed919549ad67527d07281f1c19d584df3b74326909eb1f90 + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.15": version: 0.2.16 resolution: "tinyglobby@npm:0.2.16" dependencies: @@ -2513,17 +2495,24 @@ __metadata: languageName: node linkType: hard -"tinypool@npm:^0.7.0": - version: 0.7.0 - resolution: "tinypool@npm:0.7.0" - checksum: 10c0/ecb35d9f74e72722c059acb1947ffc3c2caccb45266b89b72f74be2d28f0784d948b50bd9c6c68fa4159afd423ac5f5a07271a5f516d18a565dd06af0a37bc44 +"tinypool@npm:^1.1.1": + version: 1.1.1 + resolution: "tinypool@npm:1.1.1" + checksum: 10c0/bf26727d01443061b04fa863f571016950888ea994ba0cd8cba3a1c51e2458d84574341ab8dbc3664f1c3ab20885c8cf9ff1cc4b18201f04c2cde7d317fff69b languageName: node linkType: hard -"tinyspy@npm:^2.1.1": - version: 2.2.1 - resolution: "tinyspy@npm:2.2.1" - checksum: 10c0/0b4cfd07c09871e12c592dfa7b91528124dc49a4766a0b23350638c62e6a483d5a2a667de7e6282246c0d4f09996482ddaacbd01f0c05b7ed7e0f79d32409bdc +"tinyrainbow@npm:^2.0.0": + version: 2.0.0 + resolution: "tinyrainbow@npm:2.0.0" + checksum: 10c0/c83c52bef4e0ae7fb8ec6a722f70b5b6fa8d8be1c85792e829f56c0e1be94ab70b293c032dc5048d4d37cfe678f1f5babb04bdc65fd123098800148ca989184f + languageName: node + linkType: hard + +"tinyspy@npm:^4.0.3": + version: 4.0.4 + resolution: "tinyspy@npm:4.0.4" + checksum: 10c0/a8020fc17799251e06a8398dcc352601d2770aa91c556b9531ecd7a12581161fd1c14e81cbdaff0c1306c93bfdde8ff6d1c1a3f9bbe6d91604f0fd4e01e2f1eb languageName: node linkType: hard @@ -2586,13 +2575,6 @@ __metadata: languageName: node linkType: hard -"type-detect@npm:^4.0.0, type-detect@npm:^4.1.0": - version: 4.1.0 - resolution: "type-detect@npm:4.1.0" - checksum: 10c0/df8157ca3f5d311edc22885abc134e18ff8ffbc93d6a9848af5b682730ca6a5a44499259750197250479c5331a8a75b5537529df5ec410622041650a7f293e2a - languageName: node - linkType: hard - "typescript@npm:^5.0.0, typescript@npm:^5.3.0": version: 5.9.3 resolution: "typescript@npm:5.9.3" @@ -2605,18 +2587,11 @@ __metadata: "typescript@patch:typescript@npm%3A^5.0.0#optional!builtin, typescript@patch:typescript@npm%3A^5.3.0#optional!builtin": version: 5.9.3 - resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=cef18b" + resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/6f7e53bf0d9702350deeb6f35e08b69cbc8b958c33e0ec77bdc0ad6a6c8e280f3959dcbfde6f5b0848bece57810696489deaaa53d75de3578ff255d168c1efbd - languageName: node - linkType: hard - -"ufo@npm:^1.6.3": - version: 1.6.4 - resolution: "ufo@npm:1.6.4" - checksum: 10c0/3a2b29e7e3d772fbf6893d7d23bf442981457adb2fe122828abdbda89bedcb81aafd0dcc080e41b45f9a877db00cb42cbfee9639753a19d9b9bd39b5627039cf + checksum: 10c0/ad09fdf7a756814dce65bc60c1657b40d44451346858eea230e10f2e95a289d9183b6e32e5c11e95acc0ccc214b4f36289dcad4bf1886b0adb84d711d336a430 languageName: node linkType: hard @@ -2683,45 +2658,52 @@ __metadata: languageName: node linkType: hard -"vite-node@npm:0.34.6": - version: 0.34.6 - resolution: "vite-node@npm:0.34.6" +"vite-node@npm:3.2.4": + version: 3.2.4 + resolution: "vite-node@npm:3.2.4" dependencies: cac: "npm:^6.7.14" - debug: "npm:^4.3.4" - mlly: "npm:^1.4.0" - pathe: "npm:^1.1.1" - picocolors: "npm:^1.0.0" - vite: "npm:^3.0.0 || ^4.0.0 || ^5.0.0-0" + debug: "npm:^4.4.1" + es-module-lexer: "npm:^1.7.0" + pathe: "npm:^2.0.3" + vite: "npm:^5.0.0 || ^6.0.0 || ^7.0.0-0" bin: vite-node: vite-node.mjs - checksum: 10c0/0e804eab1ae5f0d98014f0a933ec08bfc287228283c3c4792f5f8b8fec6657896e513498e8436449e3116839a5592f9b497cf0b982b8da1152d7d419ccc306f1 + checksum: 10c0/6ceca67c002f8ef6397d58b9539f80f2b5d79e103a18367288b3f00a8ab55affa3d711d86d9112fce5a7fa658a212a087a005a045eb8f4758947dd99af2a6c6b languageName: node linkType: hard -"vite@npm:^3.0.0 || ^4.0.0 || ^5.0.0-0, vite@npm:^3.1.0 || ^4.0.0 || ^5.0.0-0": - version: 5.4.21 - resolution: "vite@npm:5.4.21" +"vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0": + version: 7.3.2 + resolution: "vite@npm:7.3.2" dependencies: - esbuild: "npm:^0.21.3" + esbuild: "npm:^0.27.0" + fdir: "npm:^6.5.0" fsevents: "npm:~2.3.3" - postcss: "npm:^8.4.43" - rollup: "npm:^4.20.0" + picomatch: "npm:^4.0.3" + postcss: "npm:^8.5.6" + rollup: "npm:^4.43.0" + tinyglobby: "npm:^0.2.15" peerDependencies: - "@types/node": ^18.0.0 || >=20.0.0 - less: "*" + "@types/node": ^20.19.0 || >=22.12.0 + jiti: ">=1.21.0" + less: ^4.0.0 lightningcss: ^1.21.0 - sass: "*" - sass-embedded: "*" - stylus: "*" - sugarss: "*" - terser: ^5.4.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: ">=0.54.8" + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 dependenciesMeta: fsevents: optional: true peerDependenciesMeta: "@types/node": optional: true + jiti: + optional: true less: optional: true lightningcss: @@ -2736,52 +2718,58 @@ __metadata: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true bin: vite: bin/vite.js - checksum: 10c0/468336a1409f728b464160cbf02672e72271fb688d0e605e776b74a89d27e1029509eef3a3a6c755928d8011e474dbf234824d054d07960be5f23cd176bc72de - languageName: node - linkType: hard - -"vitest@npm:^0.34.0": - version: 0.34.6 - resolution: "vitest@npm:0.34.6" - dependencies: - "@types/chai": "npm:^4.3.5" - "@types/chai-subset": "npm:^1.3.3" - "@types/node": "npm:*" - "@vitest/expect": "npm:0.34.6" - "@vitest/runner": "npm:0.34.6" - "@vitest/snapshot": "npm:0.34.6" - "@vitest/spy": "npm:0.34.6" - "@vitest/utils": "npm:0.34.6" - acorn: "npm:^8.9.0" - acorn-walk: "npm:^8.2.0" - cac: "npm:^6.7.14" - chai: "npm:^4.3.10" - debug: "npm:^4.3.4" - local-pkg: "npm:^0.4.3" - magic-string: "npm:^0.30.1" - pathe: "npm:^1.1.1" - picocolors: "npm:^1.0.0" - std-env: "npm:^3.3.3" - strip-literal: "npm:^1.0.1" - tinybench: "npm:^2.5.0" - tinypool: "npm:^0.7.0" - vite: "npm:^3.1.0 || ^4.0.0 || ^5.0.0-0" - vite-node: "npm:0.34.6" - why-is-node-running: "npm:^2.2.2" + checksum: 10c0/74be36907e208916f18bfec81c8eba18b869f0a170f1ece0a4dcb14874d0f0e7c022fb6c2ad896e3ee6c973fe88f53ac23b4078879ada340d8b263260868b8d4 + languageName: node + linkType: hard + +"vitest@npm:^3.0.0": + version: 3.2.4 + resolution: "vitest@npm:3.2.4" + dependencies: + "@types/chai": "npm:^5.2.2" + "@vitest/expect": "npm:3.2.4" + "@vitest/mocker": "npm:3.2.4" + "@vitest/pretty-format": "npm:^3.2.4" + "@vitest/runner": "npm:3.2.4" + "@vitest/snapshot": "npm:3.2.4" + "@vitest/spy": "npm:3.2.4" + "@vitest/utils": "npm:3.2.4" + chai: "npm:^5.2.0" + debug: "npm:^4.4.1" + expect-type: "npm:^1.2.1" + magic-string: "npm:^0.30.17" + pathe: "npm:^2.0.3" + picomatch: "npm:^4.0.2" + std-env: "npm:^3.9.0" + tinybench: "npm:^2.9.0" + tinyexec: "npm:^0.3.2" + tinyglobby: "npm:^0.2.14" + tinypool: "npm:^1.1.1" + tinyrainbow: "npm:^2.0.0" + vite: "npm:^5.0.0 || ^6.0.0 || ^7.0.0-0" + vite-node: "npm:3.2.4" + why-is-node-running: "npm:^2.3.0" peerDependencies: "@edge-runtime/vm": "*" - "@vitest/browser": "*" - "@vitest/ui": "*" + "@types/debug": ^4.1.12 + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + "@vitest/browser": 3.2.4 + "@vitest/ui": 3.2.4 happy-dom: "*" jsdom: "*" - playwright: "*" - safaridriver: "*" - webdriverio: "*" peerDependenciesMeta: "@edge-runtime/vm": optional: true + "@types/debug": + optional: true + "@types/node": + optional: true "@vitest/browser": optional: true "@vitest/ui": @@ -2790,15 +2778,9 @@ __metadata: optional: true jsdom: optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true bin: vitest: vitest.mjs - checksum: 10c0/7b5e87875991a66fe5cca62477f21447d7cdf4d101ac381ca02a16f4223b1ae5d0bc17ce42616d6dc74742757730ed511ada05aaa7090b6075e304c883cf0bc3 + checksum: 10c0/5bf53ede3ae6a0e08956d72dab279ae90503f6b5a05298a6a5e6ef47d2fd1ab386aaf48fafa61ed07a0ebfe9e371772f1ccbe5c258dd765206a8218bf2eb79eb languageName: node linkType: hard @@ -2830,7 +2812,7 @@ __metadata: languageName: node linkType: hard -"why-is-node-running@npm:^2.2.2": +"why-is-node-running@npm:^2.3.0": version: 2.3.0 resolution: "why-is-node-running@npm:2.3.0" dependencies: @@ -2885,10 +2867,3 @@ __metadata: checksum: 10c0/0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 languageName: node linkType: hard - -"yocto-queue@npm:^1.0.0": - version: 1.2.2 - resolution: "yocto-queue@npm:1.2.2" - checksum: 10c0/36d4793e9cf7060f9da543baf67c55e354f4862c8d3d34de1a1b1d7c382d44171315cc54abf84d8900b8113d742b830108a1434f4898fb244f9b7e8426d4b8f5 - languageName: node - linkType: hard From 39ea3574f35e0d9b3b26d2a445efd62f2f0efa04 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 16:29:28 +0200 Subject: [PATCH 05/42] feat: undelegate --- .../tests/pinocchio-secret-counter.test.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/pinocchio-ephemeral-permission-counter/tests/pinocchio-secret-counter.test.ts b/pinocchio-ephemeral-permission-counter/tests/pinocchio-secret-counter.test.ts index c31ef89a..53e78a50 100644 --- a/pinocchio-ephemeral-permission-counter/tests/pinocchio-secret-counter.test.ts +++ b/pinocchio-ephemeral-permission-counter/tests/pinocchio-secret-counter.test.ts @@ -494,7 +494,7 @@ describe("pinocchio-ephemeral-secret-counter", async () => { ); }); - it.skip("Commit and undelegate counter on ER to Solana", async function () { + it("Commit and undelegate counter on ER to Solana", async function () { const ixData = Buffer.from([3, 0, 0, 0, 0, 0, 0, 0]); const tx = new Transaction().add( new TransactionInstruction({ @@ -535,10 +535,20 @@ describe("pinocchio-ephemeral-secret-counter", async () => { console.log(`(ER) Undelegate txHash: ${txHash}`); expect(txHash).toBeDefined(); - await GetCommitmentSignature(txHash, connectionEphemeralRollup); + const commitHash = await GetCommitmentSignature( + txHash, + connectionEphemeralRollup, + ); + console.log(`(ER) Commit txHash: ${commitHash}`); + expect(commitHash).toBeDefined(); - // Check readability - let counter = await connectionBaseLayer.getAccountInfo(counterPda); + const result = await connectionBaseLayer.confirmTransaction(commitHash); + console.log(`(Base Layer) Commit result: ${result}`); + expect(result.value?.err).toBeNull(); + + let counter = await connectionBaseLayer.getAccountInfo(counterPda, { + commitment: "confirmed", + }); expect(counter?.owner.equals(PROGRAM_ID)).toBe(true); }); }); From d3f952fbc7998da81644d84d6b14892c07574563 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 16:34:45 +0200 Subject: [PATCH 06/42] feat: update permission --- .../src/processor.rs | 7 +- .../tests/pinocchio-secret-counter.test.ts | 82 +++++++++++++++++++ 2 files changed, 84 insertions(+), 5 deletions(-) diff --git a/pinocchio-ephemeral-permission-counter/src/processor.rs b/pinocchio-ephemeral-permission-counter/src/processor.rs index 91be32ec..7ff8cb27 100644 --- a/pinocchio-ephemeral-permission-counter/src/processor.rs +++ b/pinocchio-ephemeral-permission-counter/src/processor.rs @@ -263,14 +263,11 @@ pub fn process_update_permission(accounts: &[AccountView]) -> ProgramResult { magic_program: magic_program, vault: vault_info, args: EphemeralMembersArgs { - members: &[Member { - flags: MemberFlags::default(), - pubkey: *payer_info.address(), - }], + members: &[], is_private: true, }, } - .invoke_signed::<{ data_buffer_size(1) }>(&[signer])?; + .invoke_signed::<{ data_buffer_size(0) }>(&[signer])?; Ok(()) } diff --git a/pinocchio-ephemeral-permission-counter/tests/pinocchio-secret-counter.test.ts b/pinocchio-ephemeral-permission-counter/tests/pinocchio-secret-counter.test.ts index 53e78a50..ed211314 100644 --- a/pinocchio-ephemeral-permission-counter/tests/pinocchio-secret-counter.test.ts +++ b/pinocchio-ephemeral-permission-counter/tests/pinocchio-secret-counter.test.ts @@ -429,6 +429,88 @@ describe("pinocchio-ephemeral-secret-counter", async () => { ); }); + it("Update permission on ER", async () => { + const ixData = Buffer.from([5, 0, 0, 0, 0, 0, 0, 0]); + const tx = new Transaction().add( + new TransactionInstruction({ + programId: PROGRAM_ID, + data: ixData, + keys: [ + { + pubkey: userKeypair.publicKey, + isSigner: true, + isWritable: true, + }, + { + pubkey: counterPda, + isSigner: false, + isWritable: true, + }, + { + pubkey: PERMISSION_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, + { + pubkey: permissionPda, + isSigner: false, + isWritable: true, + }, + { + pubkey: MAGIC_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, + { + pubkey: VAULT, + isSigner: false, + isWritable: true, + }, + ], + }), + ); + + const txHash = await sendAndConfirmTransaction( + connectionEphemeralRollup, + tx, + [userKeypair], + { + commitment: "confirmed", + skipPreflight: true, + }, + ); + console.log(`(ER) Create permission txHash: ${txHash}`); + expect(txHash).toBeDefined(); + + // Check readability + let counter = await connectionEphemeralRollup.getAccountInfo(counterPda); + if (teeUrl.includes("tee")) { + expect(counter).toBeNull(); + } else { + expect(counter).toBeDefined(); + expect(counter?.data.subarray(32, 40)).toEqual( + Buffer.from([2, 0, 0, 0, 0, 0, 0, 0]), + ); + } + + counter = await unauthorizedConnection.getAccountInfo(counterPda); + if (teeUrl.includes("tee")) { + expect(counter).toBeNull(); + } else { + expect(counter).toBeDefined(); + expect(counter?.data.subarray(32, 40)).toEqual( + Buffer.from([2, 0, 0, 0, 0, 0, 0, 0]), + ); + } + + // Check permission + let permission = + await connectionEphemeralRollup.getAccountInfo(permissionPda); + expect(permission).toBeDefined(); + expect(permission?.data.subarray(36, 68)).toEqual(PROGRAM_ID.toBuffer()); + expect(permission?.data.length).toEqual(68); + }); + it("Close permission on ER", async () => { const ixData = Buffer.from([6, 0, 0, 0, 0, 0, 0, 0]); const tx = new Transaction().add( From a59a4cebf4360cd3d8ca2d182ec9feaee891898a Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 16:37:26 +0200 Subject: [PATCH 07/42] docs: update readme --- .../README.md | 99 +++++++++++++------ 1 file changed, 68 insertions(+), 31 deletions(-) diff --git a/pinocchio-ephemeral-permission-counter/README.md b/pinocchio-ephemeral-permission-counter/README.md index 90f864f4..e85469ff 100644 --- a/pinocchio-ephemeral-permission-counter/README.md +++ b/pinocchio-ephemeral-permission-counter/README.md @@ -1,59 +1,96 @@ -# ➕ Pinocchio Counter +# Pinocchio Ephemeral Permission Counter -Simple counter program using Pinocchio and Ephemeral Rollups. +A minimal Solana counter program built with [Pinocchio](https://github.com/anza-xyz/pinocchio) and MagicBlock Ephemeral Rollups. The example shows how to initialize a counter PDA, delegate it to an Ephemeral Rollup, protect it with ephemeral permissions, and commit the final state back to the base layer. -This is a port of the Rust Counter program to use Pinocchio instead of Borsh for serialization, eliminating the need for Vec types. +The program is `no_std`, does not use Borsh, and keeps account data in a fixed-size `Counter` struct. -## Software Packages +## Requirements | Software | Version | Installation Guide | -| -------- | ------- | ------------------- | -| **Solana** | 2.3.13 | [Install Solana](https://docs.anza.xyz/cli/install) | -| **Rust** | 1.85.0 | [Install Rust](https://www.rust-lang.org/tools/install) | -| **Node** | 24.10.0 | [Install Node](https://nodejs.org/en/download/current) | +| -------- | ------- | ------------------ | +| Solana CLI | 2.3.13 | [Install Solana](https://docs.anza.xyz/cli/install) | +| Rust | 1.85.0 | [Install Rust](https://www.rust-lang.org/tools/install) | +| Node.js | 24.10.0 | [Install Node](https://nodejs.org/en/download/current) | +| Yarn | 4.x | [Install Yarn](https://yarnpkg.com/getting-started/install) | + +## Setup + +Install the TypeScript test dependencies: + +```bash +yarn install +``` + +The tests read `PRIVATE_KEY` from the environment, or fall back to `~/.config/solana/id.json`. + +```bash +cp .env.example .env +``` + +Optional RPC overrides: + +- `PROVIDER_ENDPOINT` +- `WS_ENDPOINT` +- `EPHEMERAL_PROVIDER_ENDPOINT` +- `EPHEMERAL_WS_ENDPOINT` ## Build +```bash +yarn build +``` + +This runs: + ```bash cargo build-sbf ``` ## Test +Run the Vitest integration flow: + ```bash -cargo test-sbf --features logging +yarn test ``` -## Key Differences from Rust Counter +The test initializes the counter on Solana devnet, delegates it to the Ephemeral Rollup, increments it on both layers, creates/updates/closes a permission account, and commits the delegated state back to Solana. -- **No Borsh**: Uses manual serialization with `to_le_bytes()` and `from_le_bytes()` for simplicity -- **No Vec**: All types use fixed-size arrays or primitives -- **Pinocchio Framework**: Leverages Pinocchio's lightweight instruction handling -- **Direct State Management**: Simple `Counter` struct with manual serialization +## Program Model -## Instructions +The counter PDA is derived with: -### 0: InitializeCounter -Initialize a counter PDA to 0. Payload: `bump` (u8). +```text +["counter", id] +``` -### 1: IncreaseCounter -Increase the counter by a specified amount. Payload: `bump` (u8) + `increase_by` (u64). +where `id` is a 32-byte client-provided public key. The account stores: -### 2: Delegate -Delegate the counter account to the Ephemeral Rollups delegation program. Payload: `bump` (u8). +| Field | Size | Description | +| ----- | ---- | ----------- | +| `id` | 32 bytes | Identifier used in the PDA seeds | +| `count` | 8 bytes | Little-endian `u64` counter value | +| `bump` | 1 byte | PDA bump | +| `_pad` | 7 bytes | Alignment padding | -### 3: CommitAndUndelegate -Commit changes and undelegate the counter account. +Total size: 48 bytes. -### 4: Commit -Commit changes to the base layer. +## Instructions -### 5: IncrementAndCommit -Increment counter and commit in one instruction. Payload: `bump` (u8) + `increase_by` (u64). +Each instruction starts with an 8-byte little-endian discriminator. -### 6: IncrementAndUndelegate -Increment counter and undelegate in one instruction. Payload: `bump` (u8) + `increase_by` (u64). +| Discriminator | Instruction | Payload | Description | +| ------------- | ----------- | ------- | ----------- | +| `0` | `InitializeCounter` | `id` (`[u8; 32]`) | Creates the counter PDA and initializes `count` to `0`. | +| `1` | `IncreaseCounter` | `increase_by` (`u64`) | Adds `increase_by` to the counter with overflow checking. | +| `2` | `Delegate` | None | Delegates the counter PDA to the Ephemeral Rollups delegation program. | +| `3` | `CommitAndUndelegate` | None | Commits the counter state and undelegates it back to the base layer. | +| `4` | `CreatePermission` | None | Creates a private ephemeral permission for the counter. | +| `5` | `UpdatePermission` | None | Updates the counter permission membership. | +| `6` | `ClosePermission` | None | Closes the counter permission account. | -## Account Structure +The delegation program also invokes the undelegation callback discriminator: -- **Counter**: 8 bytes (u64 count value) +```text +[196, 28, 41, 206, 48, 37, 51, 167] +``` From f4441d18c41b938aee88abf709755718fa3e7c8e Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 16:37:39 +0200 Subject: [PATCH 08/42] feat: safer ix data reads --- pinocchio-ephemeral-permission-counter/src/entrypoint.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pinocchio-ephemeral-permission-counter/src/entrypoint.rs b/pinocchio-ephemeral-permission-counter/src/entrypoint.rs index 2a7bc809..611fdcfe 100644 --- a/pinocchio-ephemeral-permission-counter/src/entrypoint.rs +++ b/pinocchio-ephemeral-permission-counter/src/entrypoint.rs @@ -104,7 +104,9 @@ pub(crate) fn inner_process_instruction( .try_into() .map_err(|_| ProgramError::InvalidInstructionData)?; let discriminator = InstructionDiscriminator::from_bytes(discriminator)?; - let payload = &instruction_data[8..]; + let payload = instruction_data + .get(8..) + .ok_or(ProgramError::InvalidInstructionData)?; #[cfg(feature = "logging")] log_instruction(discriminator); @@ -112,7 +114,9 @@ pub(crate) fn inner_process_instruction( match discriminator { InstructionDiscriminator::InitializeCounter => { let id = Address::new_from_array( - payload[..32] + payload + .get(..32) + .ok_or(ProgramError::InvalidInstructionData)? .try_into() .map_err(|_| ProgramError::InvalidInstructionData)?, ); From a19528284838896d76df2581f3528136d37ea75d Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 16:41:19 +0200 Subject: [PATCH 09/42] feat: rent for --- pinocchio-ephemeral-permission-counter/src/processor.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pinocchio-ephemeral-permission-counter/src/processor.rs b/pinocchio-ephemeral-permission-counter/src/processor.rs index 7ff8cb27..6a412990 100644 --- a/pinocchio-ephemeral-permission-counter/src/processor.rs +++ b/pinocchio-ephemeral-permission-counter/src/processor.rs @@ -17,6 +17,11 @@ use pinocchio::{ use pinocchio_log::log; use pinocchio_system::instructions::CreateAccount; +// TODO: Use method from SDK +fn rent_for(size: u64) -> u64 { + (size + 60) * 32 +} + /// Create and initialize the counter PDA for the initializer. pub fn process_initialize_counter(accounts: &[AccountView], id: &Address) -> ProgramResult { let [payer_info, counter_info, _system_program] = accounts else { @@ -47,8 +52,8 @@ pub fn process_initialize_counter(accounts: &[AccountView], id: &Address) -> Pro // Create counter account if it doesn't exist. log!("Creating counter ..."); let rent_exempt_lamports = Rent::get()?.try_minimum_balance(Counter::SIZE)?; - // TODO: Use method from SDK - let ephemeral_rent = (35 + 2 * MAX_MEMBER_SIZE as u64 + 60) * 32; + // Header size + 2 members + let ephemeral_rent = rent_for(35 + 2 * MAX_MEMBER_SIZE as u64); log!("Rent exempt lamports: {}", rent_exempt_lamports); CreateAccount { from: payer_info, From dc4bb71fa143d4d21fb3c19182892ec2bd914053 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 16:42:37 +0200 Subject: [PATCH 10/42] feat: remove log --- pinocchio-ephemeral-permission-counter/src/processor.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pinocchio-ephemeral-permission-counter/src/processor.rs b/pinocchio-ephemeral-permission-counter/src/processor.rs index 6a412990..34c1a2e5 100644 --- a/pinocchio-ephemeral-permission-counter/src/processor.rs +++ b/pinocchio-ephemeral-permission-counter/src/processor.rs @@ -89,12 +89,6 @@ pub fn process_increase_counter(accounts: &[AccountView], increase_by: u64) -> P return Err(ProgramError::InvalidSeeds); } - log!( - "Increasing counter by {} from {} to {}", - increase_by, - counter_data.count, - counter_data.count + increase_by - ); counter_data.count = counter_data .count .checked_add(increase_by) From 4d4e5381f0150a2d88dcd61d99c52bebe39b7132 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 16:48:00 +0200 Subject: [PATCH 11/42] feat: check ownership --- .../src/processor.rs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/pinocchio-ephemeral-permission-counter/src/processor.rs b/pinocchio-ephemeral-permission-counter/src/processor.rs index 34c1a2e5..c7521ada 100644 --- a/pinocchio-ephemeral-permission-counter/src/processor.rs +++ b/pinocchio-ephemeral-permission-counter/src/processor.rs @@ -81,6 +81,10 @@ pub fn process_increase_counter(accounts: &[AccountView], increase_by: u64) -> P return Err(ProgramError::NotEnoughAccountKeys); }; + if !counter_info.owned_by(&crate::ID) { + return Err(ProgramError::IllegalOwner); + } + let mut data = counter_info.try_borrow_mut()?; let counter_data = Counter::load_mut(&mut data)?; let counter_pda = Counter::derive_pda(&counter_data.id, &[counter_data.bump])?; @@ -106,6 +110,10 @@ pub fn process_delegate(accounts: &[AccountView]) -> ProgramResult { }; let validator = rest.first().map(|account| *account.address()); + if !counter_info.owned_by(&crate::ID) { + return Err(ProgramError::IllegalOwner); + } + let (bump, id, counter_pda) = { let data = counter_info.try_borrow()?; let counter_data = Counter::load(&data)?; @@ -154,6 +162,10 @@ pub fn process_commit_and_undelegate(accounts: &[AccountView]) -> ProgramResult return Err(ProgramError::MissingRequiredSignature); } + if !counter_info.owned_by(&crate::ID) { + return Err(ProgramError::IllegalOwner); + } + { let data = counter_info.try_borrow()?; let counter_data = Counter::load(&data)?; @@ -184,6 +196,10 @@ pub fn process_create_permission(accounts: &[AccountView]) -> ProgramResult { return Err(ProgramError::NotEnoughAccountKeys); }; + if !counter_info.owned_by(&crate::ID) { + return Err(ProgramError::IllegalOwner); + } + let (bump, id, counter_pda) = { let data = counter_info.try_borrow()?; let counter_data = Counter::load(&data)?; @@ -233,6 +249,10 @@ pub fn process_update_permission(accounts: &[AccountView]) -> ProgramResult { return Err(ProgramError::NotEnoughAccountKeys); }; + if !counter_info.owned_by(&crate::ID) { + return Err(ProgramError::IllegalOwner); + } + let (bump, id, counter_pda) = { let data = counter_info.try_borrow()?; let counter_data = Counter::load(&data)?; @@ -279,6 +299,10 @@ pub fn process_close_permission(accounts: &[AccountView]) -> ProgramResult { return Err(ProgramError::NotEnoughAccountKeys); }; + if !counter_info.owned_by(&crate::ID) { + return Err(ProgramError::IllegalOwner); + } + let (bump, id, counter_pda) = { let data = counter_info.try_borrow()?; let counter_data = Counter::load(&data)?; From c94d255e6427659b2929e0b5bfd968c11ac11559 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 16:53:34 +0200 Subject: [PATCH 12/42] feat: reuse check --- .../src/processor.rs | 89 +++++-------------- 1 file changed, 20 insertions(+), 69 deletions(-) diff --git a/pinocchio-ephemeral-permission-counter/src/processor.rs b/pinocchio-ephemeral-permission-counter/src/processor.rs index c7521ada..070587ec 100644 --- a/pinocchio-ephemeral-permission-counter/src/processor.rs +++ b/pinocchio-ephemeral-permission-counter/src/processor.rs @@ -110,16 +110,7 @@ pub fn process_delegate(accounts: &[AccountView]) -> ProgramResult { }; let validator = rest.first().map(|account| *account.address()); - if !counter_info.owned_by(&crate::ID) { - return Err(ProgramError::IllegalOwner); - } - - let (bump, id, counter_pda) = { - let data = counter_info.try_borrow()?; - let counter_data = Counter::load(&data)?; - let counter_pda = Counter::derive_pda(&counter_data.id, &[counter_data.bump])?; - (counter_data.bump, counter_data.id, counter_pda) - }; + let (bump, id) = load_and_verify_counter(counter_info)?; let seed_1 = b"counter"; let seed_2 = id.as_ref(); @@ -130,10 +121,6 @@ pub fn process_delegate(accounts: &[AccountView]) -> ProgramResult { ..Default::default() }; - if &counter_pda != counter_info.address() { - return Err(ProgramError::InvalidSeeds); - } - delegate_account( &[ payer_info, @@ -162,19 +149,7 @@ pub fn process_commit_and_undelegate(accounts: &[AccountView]) -> ProgramResult return Err(ProgramError::MissingRequiredSignature); } - if !counter_info.owned_by(&crate::ID) { - return Err(ProgramError::IllegalOwner); - } - - { - let data = counter_info.try_borrow()?; - let counter_data = Counter::load(&data)?; - let counter_pda = Counter::derive_pda(&counter_data.id, &[counter_data.bump])?; - - if &counter_pda != counter_info.address() { - return Err(ProgramError::InvalidSeeds); - } - } + load_and_verify_counter(counter_info)?; commit_and_undelegate_accounts( payer_info, @@ -196,20 +171,7 @@ pub fn process_create_permission(accounts: &[AccountView]) -> ProgramResult { return Err(ProgramError::NotEnoughAccountKeys); }; - if !counter_info.owned_by(&crate::ID) { - return Err(ProgramError::IllegalOwner); - } - - let (bump, id, counter_pda) = { - let data = counter_info.try_borrow()?; - let counter_data = Counter::load(&data)?; - let counter_pda = Counter::derive_pda(&counter_data.id, &[counter_data.bump])?; - (counter_data.bump, counter_data.id, counter_pda) - }; - - if &counter_pda != counter_info.address() { - return Err(ProgramError::InvalidSeeds); - } + let (bump, id) = load_and_verify_counter(counter_info)?; let bump_seed = [bump]; let seeds = [ @@ -249,20 +211,7 @@ pub fn process_update_permission(accounts: &[AccountView]) -> ProgramResult { return Err(ProgramError::NotEnoughAccountKeys); }; - if !counter_info.owned_by(&crate::ID) { - return Err(ProgramError::IllegalOwner); - } - - let (bump, id, counter_pda) = { - let data = counter_info.try_borrow()?; - let counter_data = Counter::load(&data)?; - let counter_pda = Counter::derive_pda(&counter_data.id, &[counter_data.bump])?; - (counter_data.bump, counter_data.id, counter_pda) - }; - - if &counter_pda != counter_info.address() { - return Err(ProgramError::InvalidSeeds); - } + let (bump, id) = load_and_verify_counter(counter_info)?; let bump_seed = [bump]; let seeds = [ @@ -299,20 +248,7 @@ pub fn process_close_permission(accounts: &[AccountView]) -> ProgramResult { return Err(ProgramError::NotEnoughAccountKeys); }; - if !counter_info.owned_by(&crate::ID) { - return Err(ProgramError::IllegalOwner); - } - - let (bump, id, counter_pda) = { - let data = counter_info.try_borrow()?; - let counter_data = Counter::load(&data)?; - let counter_pda = Counter::derive_pda(&counter_data.id, &[counter_data.bump])?; - (counter_data.bump, counter_data.id, counter_pda) - }; - - if &counter_pda != counter_info.address() { - return Err(ProgramError::InvalidSeeds); - } + let (bump, id) = load_and_verify_counter(counter_info)?; let bump_seed = [bump]; let seeds = [ @@ -345,3 +281,18 @@ pub fn process_undelegation_callback(accounts: &[AccountView], ix_data: &[u8]) - undelegate(counter_info, &crate::ID, buffer_acc, payer_info, ix_data)?; Ok(()) } + +/// Borrow `counter_info`, validate it is the PDA derived from its own state, +/// and return (bump, id). +fn load_and_verify_counter(counter_info: &AccountView) -> Result<(u8, Address), ProgramError> { + if !counter_info.owned_by(&crate::ID) { + return Err(ProgramError::IllegalOwner); + } + let data = counter_info.try_borrow()?; + let counter = Counter::load(&data)?; + let pda = Counter::derive_pda(&counter.id, &[counter.bump])?; + if &pda != counter_info.address() { + return Err(ProgramError::InvalidSeeds); + } + Ok((counter.bump, counter.id)) +} From 587bb779e486e0202ea1b236117473f9e58707dc Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 16:56:11 +0200 Subject: [PATCH 13/42] style: lint --- .../src/processor.rs | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pinocchio-ephemeral-permission-counter/src/processor.rs b/pinocchio-ephemeral-permission-counter/src/processor.rs index 070587ec..cdc38096 100644 --- a/pinocchio-ephemeral-permission-counter/src/processor.rs +++ b/pinocchio-ephemeral-permission-counter/src/processor.rs @@ -62,7 +62,7 @@ pub fn process_initialize_counter(accounts: &[AccountView], id: &Address) -> Pro space: Counter::SIZE as u64, owner: &crate::ID, } - .invoke_signed(&[signer.clone()])?; + .invoke_signed(core::slice::from_ref(&signer))?; log!("Counter created successfully"); // Initialize counter to 0. @@ -153,7 +153,7 @@ pub fn process_commit_and_undelegate(accounts: &[AccountView]) -> ProgramResult commit_and_undelegate_accounts( payer_info, - &[counter_info.clone()], + core::slice::from_ref(counter_info), magic_context, magic_program, None, @@ -185,8 +185,8 @@ pub fn process_create_permission(accounts: &[AccountView]) -> ProgramResult { payer: counter_info, permissioned_account: counter_info, permission: permission_info, - permission_program: permission_program, - magic_program: magic_program, + permission_program, + magic_program, vault: vault_info, args: EphemeralMembersArgs { members: &[Member { @@ -226,9 +226,9 @@ pub fn process_update_permission(accounts: &[AccountView]) -> ProgramResult { authority_is_signer: true, payer: counter_info, permissioned_account: counter_info, - permission: permission, - permission_program: permission_program, - magic_program: magic_program, + permission, + permission_program, + magic_program, vault: vault_info, args: EphemeralMembersArgs { members: &[], @@ -263,9 +263,9 @@ pub fn process_close_permission(accounts: &[AccountView]) -> ProgramResult { authority_is_signer: true, payer: counter_info, permissioned_account: counter_info, - permission: permission, - permission_program: permission_program, - magic_program: magic_program, + permission, + permission_program, + magic_program, vault: vault_info, } .invoke_signed(&[signer])?; From 4c1a2af1c06792a6c71d6ae1f156e388b0338bd5 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 17:01:11 +0200 Subject: [PATCH 14/42] docs: safety --- pinocchio-ephemeral-permission-counter/src/state.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pinocchio-ephemeral-permission-counter/src/state.rs b/pinocchio-ephemeral-permission-counter/src/state.rs index 83b2f0a4..f4236eae 100644 --- a/pinocchio-ephemeral-permission-counter/src/state.rs +++ b/pinocchio-ephemeral-permission-counter/src/state.rs @@ -10,7 +10,7 @@ pub struct Counter { } impl Counter { - pub const SIZE: usize = 32 + 8 + 8; + pub const SIZE: usize = core::mem::size_of::(); pub fn load(data: &[u8]) -> Result<&Self, ProgramError> { if data.len() < Self::SIZE { @@ -20,7 +20,7 @@ impl Counter { if !(ptr as usize).is_multiple_of(core::mem::align_of::()) { return Err(ProgramError::InvalidAccountData); } - // Safety: caller ensures the account data is valid for Counter. + // SAFETY: ensured there are enough bytes in the data buffer for Counter. Ok(unsafe { &*ptr }) } @@ -32,7 +32,7 @@ impl Counter { if !(ptr as usize).is_multiple_of(core::mem::align_of::()) { return Err(ProgramError::InvalidAccountData); } - // Safety: caller ensures the account data is valid for Counter. + // SAFETY: ensured there are enough bytes in the data buffer for Counter. Ok(unsafe { &mut *ptr }) } From 7e0257e3175075d5abc4c6bd924273e412440394 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 17:03:03 +0200 Subject: [PATCH 15/42] chore: align names --- .../README.md | 42 +++++++++---------- ...chio-ephemeral-permission-counter.test.ts} | 2 +- 2 files changed, 22 insertions(+), 22 deletions(-) rename pinocchio-ephemeral-permission-counter/tests/{pinocchio-secret-counter.test.ts => pinocchio-ephemeral-permission-counter.test.ts} (99%) diff --git a/pinocchio-ephemeral-permission-counter/README.md b/pinocchio-ephemeral-permission-counter/README.md index e85469ff..cf8e25a9 100644 --- a/pinocchio-ephemeral-permission-counter/README.md +++ b/pinocchio-ephemeral-permission-counter/README.md @@ -6,12 +6,12 @@ The program is `no_std`, does not use Borsh, and keeps account data in a fixed-s ## Requirements -| Software | Version | Installation Guide | -| -------- | ------- | ------------------ | -| Solana CLI | 2.3.13 | [Install Solana](https://docs.anza.xyz/cli/install) | -| Rust | 1.85.0 | [Install Rust](https://www.rust-lang.org/tools/install) | -| Node.js | 24.10.0 | [Install Node](https://nodejs.org/en/download/current) | -| Yarn | 4.x | [Install Yarn](https://yarnpkg.com/getting-started/install) | +| Software | Version | Installation Guide | +| ---------- | ------- | ----------------------------------------------------------- | +| Solana CLI | 2.3.13 | [Install Solana](https://docs.anza.xyz/cli/install) | +| Rust | 1.87.0 | [Install Rust](https://www.rust-lang.org/tools/install) | +| Node.js | 24.10.0 | [Install Node](https://nodejs.org/en/download/current) | +| Yarn | 4.x | [Install Yarn](https://yarnpkg.com/getting-started/install) | ## Setup @@ -66,12 +66,12 @@ The counter PDA is derived with: where `id` is a 32-byte client-provided public key. The account stores: -| Field | Size | Description | -| ----- | ---- | ----------- | -| `id` | 32 bytes | Identifier used in the PDA seeds | -| `count` | 8 bytes | Little-endian `u64` counter value | -| `bump` | 1 byte | PDA bump | -| `_pad` | 7 bytes | Alignment padding | +| Field | Size | Description | +| ------- | -------- | --------------------------------- | +| `id` | 32 bytes | Identifier used in the PDA seeds | +| `count` | 8 bytes | Little-endian `u64` counter value | +| `bump` | 1 byte | PDA bump | +| `_pad` | 7 bytes | Alignment padding | Total size: 48 bytes. @@ -79,15 +79,15 @@ Total size: 48 bytes. Each instruction starts with an 8-byte little-endian discriminator. -| Discriminator | Instruction | Payload | Description | -| ------------- | ----------- | ------- | ----------- | -| `0` | `InitializeCounter` | `id` (`[u8; 32]`) | Creates the counter PDA and initializes `count` to `0`. | -| `1` | `IncreaseCounter` | `increase_by` (`u64`) | Adds `increase_by` to the counter with overflow checking. | -| `2` | `Delegate` | None | Delegates the counter PDA to the Ephemeral Rollups delegation program. | -| `3` | `CommitAndUndelegate` | None | Commits the counter state and undelegates it back to the base layer. | -| `4` | `CreatePermission` | None | Creates a private ephemeral permission for the counter. | -| `5` | `UpdatePermission` | None | Updates the counter permission membership. | -| `6` | `ClosePermission` | None | Closes the counter permission account. | +| Discriminator | Instruction | Payload | Description | +| ------------- | --------------------- | --------------------- | ---------------------------------------------------------------------- | +| `0` | `InitializeCounter` | `id` (`[u8; 32]`) | Creates the counter PDA and initializes `count` to `0`. | +| `1` | `IncreaseCounter` | `increase_by` (`u64`) | Adds `increase_by` to the counter with overflow checking. | +| `2` | `Delegate` | None | Delegates the counter PDA to the Ephemeral Rollups delegation program. | +| `3` | `CommitAndUndelegate` | None | Commits the counter state and undelegates it back to the base layer. | +| `4` | `CreatePermission` | None | Creates a private ephemeral permission for the counter. | +| `5` | `UpdatePermission` | None | Updates the counter permission membership. | +| `6` | `ClosePermission` | None | Closes the counter permission account. | The delegation program also invokes the undelegation callback discriminator: diff --git a/pinocchio-ephemeral-permission-counter/tests/pinocchio-secret-counter.test.ts b/pinocchio-ephemeral-permission-counter/tests/pinocchio-ephemeral-permission-counter.test.ts similarity index 99% rename from pinocchio-ephemeral-permission-counter/tests/pinocchio-secret-counter.test.ts rename to pinocchio-ephemeral-permission-counter/tests/pinocchio-ephemeral-permission-counter.test.ts index ed211314..949e3841 100644 --- a/pinocchio-ephemeral-permission-counter/tests/pinocchio-secret-counter.test.ts +++ b/pinocchio-ephemeral-permission-counter/tests/pinocchio-ephemeral-permission-counter.test.ts @@ -33,7 +33,7 @@ const PROGRAM_ID = new PublicKey( "AAWCg4eJHpdmUtM8Wz6Thm8FDi6C3vnMksf1pt2vfxhf", ); -describe("pinocchio-ephemeral-secret-counter", async () => { +describe("pinocchio-ephemeral-permission-counter", async () => { // Open user keypair from private key or default location const KEYPAIR = process.env.PRIVATE_KEY || From eb891bf462bc54048d07be75c70dd79341e7931b Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 17:05:14 +0200 Subject: [PATCH 16/42] feat: confirmed get info --- ...cchio-ephemeral-permission-counter.test.ts | 52 ++++++++++++++----- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/pinocchio-ephemeral-permission-counter/tests/pinocchio-ephemeral-permission-counter.test.ts b/pinocchio-ephemeral-permission-counter/tests/pinocchio-ephemeral-permission-counter.test.ts index 949e3841..f78c70f0 100644 --- a/pinocchio-ephemeral-permission-counter/tests/pinocchio-ephemeral-permission-counter.test.ts +++ b/pinocchio-ephemeral-permission-counter/tests/pinocchio-ephemeral-permission-counter.test.ts @@ -336,13 +336,17 @@ describe("pinocchio-ephemeral-permission-counter", async () => { expect(txHash).toBeDefined(); // Check readability - let counter = await connectionEphemeralRollup.getAccountInfo(counterPda); + let counter = await connectionEphemeralRollup.getAccountInfo(counterPda, { + commitment: "confirmed", + }); expect(counter).toBeDefined(); expect(counter?.data.subarray(32, 40)).toEqual( Buffer.from([2, 0, 0, 0, 0, 0, 0, 0]), ); - counter = await unauthorizedConnection.getAccountInfo(counterPda); + counter = await unauthorizedConnection.getAccountInfo(counterPda, { + commitment: "confirmed", + }); expect(counter).toBeDefined(); expect(counter?.data.subarray(32, 40)).toEqual( Buffer.from([2, 0, 0, 0, 0, 0, 0, 0]), @@ -403,13 +407,17 @@ describe("pinocchio-ephemeral-permission-counter", async () => { expect(txHash).toBeDefined(); // Check readability - let counter = await connectionEphemeralRollup.getAccountInfo(counterPda); + let counter = await connectionEphemeralRollup.getAccountInfo(counterPda, { + commitment: "confirmed", + }); expect(counter).toBeDefined(); expect(counter?.data.subarray(32, 40)).toEqual( Buffer.from([2, 0, 0, 0, 0, 0, 0, 0]), ); - counter = await unauthorizedConnection.getAccountInfo(counterPda); + counter = await unauthorizedConnection.getAccountInfo(counterPda, { + commitment: "confirmed", + }); if (teeUrl.includes("tee")) { expect(counter).toBeNull(); } else { @@ -420,8 +428,12 @@ describe("pinocchio-ephemeral-permission-counter", async () => { } // Check permission - let permission = - await connectionEphemeralRollup.getAccountInfo(permissionPda); + let permission = await connectionEphemeralRollup.getAccountInfo( + permissionPda, + { + commitment: "confirmed", + }, + ); expect(permission).toBeDefined(); expect(permission?.data.subarray(36, 68)).toEqual(PROGRAM_ID.toBuffer()); expect(permission?.data.subarray(69, 101)).toEqual( @@ -483,7 +495,9 @@ describe("pinocchio-ephemeral-permission-counter", async () => { expect(txHash).toBeDefined(); // Check readability - let counter = await connectionEphemeralRollup.getAccountInfo(counterPda); + let counter = await connectionEphemeralRollup.getAccountInfo(counterPda, { + commitment: "confirmed", + }); if (teeUrl.includes("tee")) { expect(counter).toBeNull(); } else { @@ -493,7 +507,9 @@ describe("pinocchio-ephemeral-permission-counter", async () => { ); } - counter = await unauthorizedConnection.getAccountInfo(counterPda); + counter = await unauthorizedConnection.getAccountInfo(counterPda, { + commitment: "confirmed", + }); if (teeUrl.includes("tee")) { expect(counter).toBeNull(); } else { @@ -504,8 +520,12 @@ describe("pinocchio-ephemeral-permission-counter", async () => { } // Check permission - let permission = - await connectionEphemeralRollup.getAccountInfo(permissionPda); + let permission = await connectionEphemeralRollup.getAccountInfo( + permissionPda, + { + commitment: "confirmed", + }, + ); expect(permission).toBeDefined(); expect(permission?.data.subarray(36, 68)).toEqual(PROGRAM_ID.toBuffer()); expect(permission?.data.length).toEqual(68); @@ -559,17 +579,21 @@ describe("pinocchio-ephemeral-permission-counter", async () => { ); console.log(`(ER) Close permission txHash: ${txHash}`); const result = await connectionEphemeralRollup.confirmTransaction(txHash); - expect(result.value?.err).toBeNull(); + expect(result.value.err).toBeNull(); expect(txHash).toBeDefined(); // Check readability - let counter = await connectionEphemeralRollup.getAccountInfo(counterPda); + let counter = await connectionEphemeralRollup.getAccountInfo(counterPda, { + commitment: "confirmed", + }); expect(counter).toBeDefined(); expect(counter?.data.subarray(32, 40)).toEqual( Buffer.from([2, 0, 0, 0, 0, 0, 0, 0]), ); - counter = await unauthorizedConnection.getAccountInfo(counterPda); + counter = await unauthorizedConnection.getAccountInfo(counterPda, { + commitment: "confirmed", + }); expect(counter).toBeDefined(); expect(counter?.data.subarray(32, 40)).toEqual( Buffer.from([2, 0, 0, 0, 0, 0, 0, 0]), @@ -626,7 +650,7 @@ describe("pinocchio-ephemeral-permission-counter", async () => { const result = await connectionBaseLayer.confirmTransaction(commitHash); console.log(`(Base Layer) Commit result: ${result}`); - expect(result.value?.err).toBeNull(); + expect(result.value.err).toBeNull(); let counter = await connectionBaseLayer.getAccountInfo(counterPda, { commitment: "confirmed", From 6d6caf058e52251933c19e71eef31aeadbbf2d61 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 6 May 2026 17:09:22 +0200 Subject: [PATCH 17/42] feat: update rust --- .github/workflows/test-examples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-examples.yml b/.github/workflows/test-examples.yml index 560393bd..f6f83199 100644 --- a/.github/workflows/test-examples.yml +++ b/.github/workflows/test-examples.yml @@ -17,7 +17,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: "20" - name: Enable Corepack run: corepack enable @@ -25,7 +25,7 @@ jobs: - name: Setup Rust uses: actions-rs/toolchain@v1 with: - toolchain: "1.85.0" + toolchain: stable override: true - name: Install Solana From 6ac6f24d84a9fc974c87391523f0e89459393bf5 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Mon, 18 May 2026 17:46:43 +0200 Subject: [PATCH 18/42] feat: update sdk --- pinocchio-ephemeral-permission-counter/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinocchio-ephemeral-permission-counter/Cargo.toml b/pinocchio-ephemeral-permission-counter/Cargo.toml index a826db25..7f498c8b 100644 --- a/pinocchio-ephemeral-permission-counter/Cargo.toml +++ b/pinocchio-ephemeral-permission-counter/Cargo.toml @@ -14,4 +14,4 @@ pinocchio = { version = "0.10.1", features = ["cpi", "copy"] } pinocchio-log = { version = "0.5.1" } pinocchio-system = { version = "0.5" } solana-address = { version = "2.6", features = ["syscalls"] } -ephemeral-rollups-pinocchio = { git = "https://github.com/magicblock-labs/ephemeral-rollups-sdk.git", rev = "a8ecea450d3bbe5bac119a3f4c55cd9f96b4837b" } +ephemeral-rollups-pinocchio = { git = "https://github.com/magicblock-labs/ephemeral-rollups-sdk.git", rev = "d32189fea8b4ae48cbae1645dd26595c66b28edb" } From 93236c43d1762befe7ca9f5d3d0a2d491c730374 Mon Sep 17 00:00:00 2001 From: jonasXchen Date: Tue, 19 May 2026 14:10:19 +0800 Subject: [PATCH 19/42] fix: escrow revert --- .../src/instructions/transfer_reward_programmable_nft.rs | 4 ++-- .../src/instructions/transfer_reward_spl_token.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rewards-delegated-vrf/programs/rewards-delegated-vrf/src/instructions/transfer_reward_programmable_nft.rs b/rewards-delegated-vrf/programs/rewards-delegated-vrf/src/instructions/transfer_reward_programmable_nft.rs index 7ee67a19..9cd018d0 100644 --- a/rewards-delegated-vrf/programs/rewards-delegated-vrf/src/instructions/transfer_reward_programmable_nft.rs +++ b/rewards-delegated-vrf/programs/rewards-delegated-vrf/src/instructions/transfer_reward_programmable_nft.rs @@ -24,7 +24,7 @@ pub fn transfer_reward_programmable_nft( let cpi_signer_seeds = &[seeds.as_slice()]; let cpi_ata_accounts = Create { - payer: ctx.accounts.escrow_auth.to_account_info(), + payer: ctx.accounts.escrow.to_account_info(), associated_token: ctx.accounts.destination_token_account.to_account_info(), authority: ctx.accounts.user.to_account_info(), mint: ctx.accounts.mint.to_account_info(), @@ -50,7 +50,7 @@ pub fn transfer_reward_programmable_nft( &ctx.accounts.destination_token_record.to_account_info(), )) .authority(&ctx.accounts.reward_distributor.to_account_info()) - .payer(&ctx.accounts.escrow_auth.to_account_info()) + .payer(&ctx.accounts.escrow.to_account_info()) .system_program(&ctx.accounts.system_program.to_account_info()) .sysvar_instructions(&ctx.accounts.sysvar_instruction_program.to_account_info()) .spl_token_program(&ctx.accounts.token_program.to_account_info()) diff --git a/rewards-delegated-vrf/programs/rewards-delegated-vrf/src/instructions/transfer_reward_spl_token.rs b/rewards-delegated-vrf/programs/rewards-delegated-vrf/src/instructions/transfer_reward_spl_token.rs index 95b7e001..706bc40b 100644 --- a/rewards-delegated-vrf/programs/rewards-delegated-vrf/src/instructions/transfer_reward_spl_token.rs +++ b/rewards-delegated-vrf/programs/rewards-delegated-vrf/src/instructions/transfer_reward_spl_token.rs @@ -21,7 +21,7 @@ pub fn transfer_reward_spl_token(ctx: Context, amount: u let cpi_signer_seeds = &[seeds.as_slice()]; let cpi_ata_accounts = Create { - payer: ctx.accounts.escrow_auth.to_account_info(), + payer: ctx.accounts.escrow.to_account_info(), associated_token: ctx.accounts.destination_token_account.to_account_info(), authority: ctx.accounts.user.to_account_info(), mint: ctx.accounts.mint.to_account_info(), From b95584d1d6ef590e1262cc0000f7cf764fabfcf9 Mon Sep 17 00:00:00 2001 From: jonasXchen Date: Wed, 20 May 2026 11:03:56 +0800 Subject: [PATCH 20/42] feat: upgrade anchor v1 vrf example + rewards-delegated-vrf --- 01-backward-compat/roll-dice/.gitignore | 7 + 01-backward-compat/roll-dice/.prettierignore | 7 + 01-backward-compat/roll-dice/Anchor.toml | 24 + 01-backward-compat/roll-dice/Cargo.lock | 3784 ++++++++ 01-backward-compat/roll-dice/Cargo.toml | 14 + 01-backward-compat/roll-dice/README.md | 71 + .../roll-dice/app/.eslintrc.json | 3 + 01-backward-compat/roll-dice/app/.gitignore | 1 + .../roll-dice/app/app/delegated/page.tsx | 1050 ++ .../roll-dice/app/app/globals.css | 94 + .../roll-dice/app/app/layout.tsx | 20 + 01-backward-compat/roll-dice/app/app/page.tsx | 243 + .../roll-dice/app/components.json | 21 + .../roll-dice/app/components/dice.tsx | 117 + .../app/components/solana-address.tsx | 116 + .../app/components/theme-provider.tsx | 11 + .../roll-dice/app/components/ui/accordion.tsx | 58 + .../app/components/ui/alert-dialog.tsx | 141 + .../roll-dice/app/components/ui/alert.tsx | 59 + .../app/components/ui/aspect-ratio.tsx | 7 + .../roll-dice/app/components/ui/avatar.tsx | 50 + .../roll-dice/app/components/ui/badge.tsx | 36 + .../app/components/ui/breadcrumb.tsx | 115 + .../roll-dice/app/components/ui/button.tsx | 56 + .../roll-dice/app/components/ui/calendar.tsx | 66 + .../roll-dice/app/components/ui/card.tsx | 79 + .../roll-dice/app/components/ui/carousel.tsx | 262 + .../roll-dice/app/components/ui/chart.tsx | 365 + .../roll-dice/app/components/ui/checkbox.tsx | 30 + .../app/components/ui/collapsible.tsx | 11 + .../roll-dice/app/components/ui/command.tsx | 153 + .../app/components/ui/context-menu.tsx | 200 + .../roll-dice/app/components/ui/dialog.tsx | 122 + .../roll-dice/app/components/ui/drawer.tsx | 118 + .../app/components/ui/dropdown-menu.tsx | 200 + .../roll-dice/app/components/ui/form.tsx | 178 + .../app/components/ui/hover-card.tsx | 29 + .../roll-dice/app/components/ui/input-otp.tsx | 71 + .../roll-dice/app/components/ui/input.tsx | 22 + .../roll-dice/app/components/ui/label.tsx | 26 + .../roll-dice/app/components/ui/menubar.tsx | 236 + .../app/components/ui/navigation-menu.tsx | 128 + .../app/components/ui/pagination.tsx | 117 + .../roll-dice/app/components/ui/popover.tsx | 31 + .../roll-dice/app/components/ui/progress.tsx | 28 + .../app/components/ui/radio-group.tsx | 44 + .../roll-dice/app/components/ui/resizable.tsx | 45 + .../app/components/ui/scroll-area.tsx | 48 + .../roll-dice/app/components/ui/select.tsx | 160 + .../roll-dice/app/components/ui/separator.tsx | 31 + .../roll-dice/app/components/ui/sheet.tsx | 140 + .../roll-dice/app/components/ui/sidebar.tsx | 763 ++ .../roll-dice/app/components/ui/skeleton.tsx | 15 + .../roll-dice/app/components/ui/slider.tsx | 28 + .../roll-dice/app/components/ui/sonner.tsx | 31 + .../roll-dice/app/components/ui/switch.tsx | 29 + .../roll-dice/app/components/ui/table.tsx | 117 + .../roll-dice/app/components/ui/tabs.tsx | 55 + .../roll-dice/app/components/ui/textarea.tsx | 22 + .../roll-dice/app/components/ui/toast.tsx | 129 + .../roll-dice/app/components/ui/toaster.tsx | 35 + .../app/components/ui/toggle-group.tsx | 61 + .../roll-dice/app/components/ui/toggle.tsx | 45 + .../roll-dice/app/components/ui/tooltip.tsx | 30 + .../app/components/ui/use-mobile.tsx | 19 + .../roll-dice/app/components/ui/use-toast.ts | 194 + .../roll-dice/app/hooks/use-mobile.tsx | 19 + .../roll-dice/app/hooks/use-toast.ts | 194 + .../roll-dice/app/lib/config.ts | 15 + .../app/lib/idl/random_dice_delegated.json | 507 + .../roll-dice/app/lib/solana-utils.ts | 79 + 01-backward-compat/roll-dice/app/lib/types.ts | 15 + 01-backward-compat/roll-dice/app/lib/utils.ts | 6 + .../roll-dice/app/next-env.d.ts | 5 + .../roll-dice/app/next.config.mjs | 48 + .../roll-dice/app/package-lock.json | 8519 +++++++++++++++++ 01-backward-compat/roll-dice/app/package.json | 75 + .../roll-dice/app/pnpm-lock.yaml | 5 + .../roll-dice/app/postcss.config.mjs | 8 + .../roll-dice/app/public/placeholder-logo.png | Bin 0 -> 958 bytes .../roll-dice/app/public/placeholder-logo.svg | 1 + .../roll-dice/app/public/placeholder-user.jpg | Bin 0 -> 2615 bytes .../roll-dice/app/public/placeholder.jpg | Bin 0 -> 1596 bytes .../roll-dice/app/public/placeholder.svg | 1 + .../roll-dice/app/styles/globals.css | 94 + .../roll-dice/app/tailwind.config.ts | 96 + .../roll-dice/app/tsconfig.json | 27 + 01-backward-compat/roll-dice/app/yarn.lock | 4584 +++++++++ .../roll-dice/migrations/deploy.ts | 12 + 01-backward-compat/roll-dice/package.json | 22 + .../programs/roll-dice-delegated/Cargo.toml | 27 + .../programs/roll-dice-delegated/src/lib.rs | 169 + .../roll-dice/programs/roll-dice/Cargo.toml | 26 + .../roll-dice/programs/roll-dice/src/lib.rs | 116 + .../roll-dice/tests/roll-dice-delegated.ts | 76 + .../roll-dice/tests/roll-dice.ts | 26 + 01-backward-compat/roll-dice/tsconfig.json | 10 + 01-backward-compat/roll-dice/yarn.lock | 1456 +++ rewards-delegated-vrf/Anchor.toml | 2 +- rewards-delegated-vrf/Cargo.lock | 1742 +++- .../dashboard/components/AdminActions.tsx | 186 +- .../dashboard/hooks/useTransaction.ts | 30 + .../lib/instructions/ephemeralBalance.ts | 79 + .../programs/rewards-delegated-vrf/Cargo.toml | 10 +- .../src/instructions/consume_random_reward.rs | 14 +- .../src/instructions/shared.rs | 4 +- .../transfer_reward_programmable_nft.rs | 2 +- .../instructions/transfer_reward_spl_token.rs | 4 +- .../programs/rewards-delegated-vrf/src/lib.rs | 10 - roll-dice/Anchor.toml | 1 + roll-dice/Cargo.lock | 2172 ++++- .../programs/roll-dice-delegated/Cargo.toml | 6 +- .../programs/roll-dice-delegated/src/lib.rs | 34 +- roll-dice/programs/roll-dice/Cargo.toml | 6 +- roll-dice/programs/roll-dice/src/lib.rs | 8 +- 115 files changed, 30188 insertions(+), 978 deletions(-) create mode 100644 01-backward-compat/roll-dice/.gitignore create mode 100644 01-backward-compat/roll-dice/.prettierignore create mode 100644 01-backward-compat/roll-dice/Anchor.toml create mode 100644 01-backward-compat/roll-dice/Cargo.lock create mode 100644 01-backward-compat/roll-dice/Cargo.toml create mode 100644 01-backward-compat/roll-dice/README.md create mode 100644 01-backward-compat/roll-dice/app/.eslintrc.json create mode 100644 01-backward-compat/roll-dice/app/.gitignore create mode 100644 01-backward-compat/roll-dice/app/app/delegated/page.tsx create mode 100644 01-backward-compat/roll-dice/app/app/globals.css create mode 100644 01-backward-compat/roll-dice/app/app/layout.tsx create mode 100644 01-backward-compat/roll-dice/app/app/page.tsx create mode 100644 01-backward-compat/roll-dice/app/components.json create mode 100644 01-backward-compat/roll-dice/app/components/dice.tsx create mode 100644 01-backward-compat/roll-dice/app/components/solana-address.tsx create mode 100644 01-backward-compat/roll-dice/app/components/theme-provider.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/accordion.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/alert-dialog.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/alert.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/aspect-ratio.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/avatar.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/badge.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/breadcrumb.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/button.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/calendar.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/card.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/carousel.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/chart.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/checkbox.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/collapsible.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/command.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/context-menu.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/dialog.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/drawer.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/dropdown-menu.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/form.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/hover-card.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/input-otp.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/input.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/label.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/menubar.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/navigation-menu.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/pagination.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/popover.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/progress.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/radio-group.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/resizable.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/scroll-area.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/select.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/separator.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/sheet.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/sidebar.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/skeleton.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/slider.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/sonner.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/switch.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/table.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/tabs.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/textarea.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/toast.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/toaster.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/toggle-group.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/toggle.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/tooltip.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/use-mobile.tsx create mode 100644 01-backward-compat/roll-dice/app/components/ui/use-toast.ts create mode 100644 01-backward-compat/roll-dice/app/hooks/use-mobile.tsx create mode 100644 01-backward-compat/roll-dice/app/hooks/use-toast.ts create mode 100644 01-backward-compat/roll-dice/app/lib/config.ts create mode 100644 01-backward-compat/roll-dice/app/lib/idl/random_dice_delegated.json create mode 100644 01-backward-compat/roll-dice/app/lib/solana-utils.ts create mode 100644 01-backward-compat/roll-dice/app/lib/types.ts create mode 100644 01-backward-compat/roll-dice/app/lib/utils.ts create mode 100644 01-backward-compat/roll-dice/app/next-env.d.ts create mode 100644 01-backward-compat/roll-dice/app/next.config.mjs create mode 100644 01-backward-compat/roll-dice/app/package-lock.json create mode 100644 01-backward-compat/roll-dice/app/package.json create mode 100644 01-backward-compat/roll-dice/app/pnpm-lock.yaml create mode 100644 01-backward-compat/roll-dice/app/postcss.config.mjs create mode 100644 01-backward-compat/roll-dice/app/public/placeholder-logo.png create mode 100644 01-backward-compat/roll-dice/app/public/placeholder-logo.svg create mode 100644 01-backward-compat/roll-dice/app/public/placeholder-user.jpg create mode 100644 01-backward-compat/roll-dice/app/public/placeholder.jpg create mode 100644 01-backward-compat/roll-dice/app/public/placeholder.svg create mode 100644 01-backward-compat/roll-dice/app/styles/globals.css create mode 100644 01-backward-compat/roll-dice/app/tailwind.config.ts create mode 100644 01-backward-compat/roll-dice/app/tsconfig.json create mode 100644 01-backward-compat/roll-dice/app/yarn.lock create mode 100644 01-backward-compat/roll-dice/migrations/deploy.ts create mode 100644 01-backward-compat/roll-dice/package.json create mode 100644 01-backward-compat/roll-dice/programs/roll-dice-delegated/Cargo.toml create mode 100644 01-backward-compat/roll-dice/programs/roll-dice-delegated/src/lib.rs create mode 100644 01-backward-compat/roll-dice/programs/roll-dice/Cargo.toml create mode 100644 01-backward-compat/roll-dice/programs/roll-dice/src/lib.rs create mode 100644 01-backward-compat/roll-dice/tests/roll-dice-delegated.ts create mode 100644 01-backward-compat/roll-dice/tests/roll-dice.ts create mode 100644 01-backward-compat/roll-dice/tsconfig.json create mode 100644 01-backward-compat/roll-dice/yarn.lock create mode 100644 rewards-delegated-vrf/dashboard/lib/instructions/ephemeralBalance.ts diff --git a/01-backward-compat/roll-dice/.gitignore b/01-backward-compat/roll-dice/.gitignore new file mode 100644 index 00000000..2e0446b0 --- /dev/null +++ b/01-backward-compat/roll-dice/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/01-backward-compat/roll-dice/.prettierignore b/01-backward-compat/roll-dice/.prettierignore new file mode 100644 index 00000000..41425834 --- /dev/null +++ b/01-backward-compat/roll-dice/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/01-backward-compat/roll-dice/Anchor.toml b/01-backward-compat/roll-dice/Anchor.toml new file mode 100644 index 00000000..ba13b4e4 --- /dev/null +++ b/01-backward-compat/roll-dice/Anchor.toml @@ -0,0 +1,24 @@ +[toolchain] +package_manager = "yarn" + +[features] +resolution = true +skip-lint = false + +[programs.devnet] +rool_dice = "8xgZ1hY7TnVZ4Bbh7v552Rs3BZMSq3LisyWckkBsNLP" +roll-dice-delegated = "D74Ho1cWBHgZNpVG4FnBBA4JtjX4HFZ5QqqRXXVKA8gM" + +[programs.localnet] +rool_dice = "8xgZ1hY7TnVZ4Bbh7v552Rs3BZMSq3LisyWckkBsNLP" +roll-dice-delegated = "D74Ho1cWBHgZNpVG4FnBBA4JtjX4HFZ5QqqRXXVKA8gM" + +[registry] +url = "https://api.apr.dev" + +[provider] +cluster = "devnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "yarn run ts-mocha -p ./tsconfig.json -t 120000 tests/**/*.ts" diff --git a/01-backward-compat/roll-dice/Cargo.lock b/01-backward-compat/roll-dice/Cargo.lock new file mode 100644 index 00000000..5c086a15 --- /dev/null +++ b/01-backward-compat/roll-dice/Cargo.lock @@ -0,0 +1,3784 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy 0.7.35", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anchor-attribute-access-control" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a883ca44ef14b2113615fc6d3a85fefc68b5002034e88db37f7f1f802f88aa9" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-account" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c4d97763b29030412b4b80715076377edc9cc63bc3c9e667297778384b9fd2" +dependencies = [ + "anchor-syn", + "bs58", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-constant" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae3328bbf9bbd517a51621b1ba6cbec06cbbc25e8cfc7403bddf69bcf088206" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-error" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf2398a6d9e16df1ee9d7d37d970a8246756de898c8dd16ef6bdbe4da20cf39a" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-event" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f12758f4ec2f0e98d4d56916c6fe95cb23d74b8723dd902c762c5ef46ebe7b65" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-program" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c7193b5af2649813584aae6e3569c46fd59616a96af2083c556b13136c3830f" +dependencies = [ + "anchor-lang-idl", + "anchor-syn", + "anyhow", + "bs58", + "heck 0.3.3", + "proc-macro2", + "quote", + "serde_json", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-accounts" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d332d1a13c0fca1a446de140b656e66110a5e8406977dcb6a41e5d6f323760b0" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-serde" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8656e4af182edaeae665fa2d2d7ee81148518b5bd0be9a67f2a381bb17da7d46" +dependencies = [ + "anchor-syn", + "borsh-derive-internal", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-space" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcff2a083560cd79817db07d89a4de39a2c4b2eaa00c1742cf0df49b25ff2bed" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-lang" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67d85d5376578f12d840c29ff323190f6eecd65b00a0b5f2b2f232751d049cc" +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", + "base64 0.21.7", + "bincode", + "borsh 0.10.4", + "bytemuck", + "solana-account-info 2.3.0", + "solana-clock 2.2.1", + "solana-cpi 2.2.1", + "solana-define-syscall 2.2.1", + "solana-feature-gate-interface", + "solana-instruction 2.2.1", + "solana-instructions-sysvar 2.2.2", + "solana-invoke", + "solana-loader-v3-interface 3.0.0", + "solana-msg 2.2.1", + "solana-program-entrypoint 2.2.1", + "solana-program-error 2.2.1", + "solana-program-memory 2.2.1", + "solana-program-option 2.2.1", + "solana-program-pack 2.2.1", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", + "solana-system-interface 1.0.0", + "solana-sysvar 2.2.1", + "solana-sysvar-id 2.2.1", + "thiserror 1.0.69", +] + +[[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", + "anyhow", + "heck 0.3.3", + "regex", + "serde", + "serde_json", + "sha2 0.10.8", +] + +[[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-syn" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b93b69aa7d099b59378433f6d7e20e1008fc10c69e48b220270e5b3f2ec4c8be" +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.69", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "digest 0.10.7", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "borsh" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee" +dependencies = [ + "borsh-derive 0.10.4", + "hashbrown 0.13.2", +] + +[[package]] +name = "borsh" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" +dependencies = [ + "borsh-derive 1.5.7", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" +dependencies = [ + "borsh-derive-internal", + "borsh-schema-derive-internal", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" +dependencies = [ + "once_cell", + "proc-macro-crate 3.3.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "bv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" +dependencies = [ + "feature-probe", + "serde", +] + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "cargo_toml" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a98356df42a2eb1bd8f1793ae4ee4de48e384dd974ce5eac8eee802edb7492be" +dependencies = [ + "serde", + "toml 0.8.21", +] + +[[package]] +name = "cc" +version = "1.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "console_log" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" +dependencies = [ + "log", + "web-sys", +] + +[[package]] +name = "const-crypto" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c06f1eb05f06cf2e380fdded278fbf056a38974299d77960555a311dcf91a52" +dependencies = [ + "keccak-const", + "sha2-const-stable", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rand_core 0.6.4", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.117", +] + +[[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 = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common", + "subtle", +] + +[[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", + "spki", +] + +[[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 = "ephemeral-rollups-sdk" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98afff417a51248d367e645bf1a1a8c0be4522a9dd6ce1717c253ade9b53bc16" +dependencies = [ + "anchor-lang", + "base64ct", + "bincode", + "bytemuck", + "ephemeral-rollups-sdk-attribute-action", + "ephemeral-rollups-sdk-attribute-commit", + "ephemeral-rollups-sdk-attribute-delegate", + "ephemeral-rollups-sdk-attribute-ephemeral", + "ephemeral-rollups-sdk-attribute-ephemeral-accounts", + "five8 0.2.1", + "getrandom 0.2.16", + "magicblock-delegation-program-api", + "magicblock-magic-program-api", + "solana-account-info 2.3.0", + "solana-address 2.6.0", + "solana-program 2.2.1", + "solana-program 3.0.0", + "solana-program-error 2.2.1", + "solana-system-interface 2.0.0", +] + +[[package]] +name = "ephemeral-rollups-sdk-attribute-action" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ae9132b7e5c3bc4ef70e8feb8d2e00688bb1251e4acb528cca603776e1c026" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ephemeral-rollups-sdk-attribute-commit" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c079886a3a6d5a887c2b12ceaea953715c4d1e507c27c198c2ada1c3119c057" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ephemeral-rollups-sdk-attribute-delegate" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a669ca7d003e2f6c1148f052f3bc9a4163489b8773d284961c5585e5210bf48f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ephemeral-rollups-sdk-attribute-ephemeral" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a7395b56b45f11779afbc5d2016dd2a5f140477f0441c0023ef5606418c4084" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ephemeral-rollups-sdk-attribute-ephemeral-accounts" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "569ddbe7759347c13ba5ce3f68d60c242041cfbbd0a04d653c04b042e81b0c77" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ephemeral-vrf-sdk" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cba2ba120676a7dfa3b55d9f14f2b1d52313afa4e1d6a61ffff5989389f76535" +dependencies = [ + "anchor-lang", + "borsh 1.5.7", + "ephemeral-vrf-sdk-vrf-macro", + "solana-program 2.2.1", +] + +[[package]] +name = "ephemeral-vrf-sdk-vrf-macro" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037039c737a7b28d7aa15849a2f7b232065101260359d2b4e84dbf4ef46b3b9a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "feature-probe" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[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" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f76610e969fa1784327ded240f1e28a3fd9520c9cec93b636fcf62dd37f772" +dependencies = [ + "five8_core", +] + +[[package]] +name = "five8_const" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26dec3da8bc3ef08f2c04f61eab298c3ab334523e55f076354d6d6f613799a7b" +dependencies = [ + "five8_core", +] + +[[package]] +name = "five8_const" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a0f1728185f277989ca573a402716ae0beaaea3f76a8ff87ef9dd8fb19436c5" +dependencies = [ + "five8_core", +] + +[[package]] +name = "five8_core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[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 = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[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", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-const" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d8d8ce877200136358e0bbff3a77965875db3af755a11e1fa6b1b3e2df13ea" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "magicblock-delegation-program-api" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "288904a9950bd20f27f0ef934f320ab1410bd35a6d5c9cf138eca276442b6b2e" +dependencies = [ + "bincode", + "borsh 0.10.4", + "borsh 1.5.7", + "bytemuck", + "const-crypto", + "num_enum", + "pinocchio 0.10.2", + "pinocchio-log", + "pinocchio-pubkey", + "pinocchio-system", + "rkyv", + "serde", + "solana-address 2.6.0", + "solana-instruction 3.4.0", + "solana-loader-v3-interface 6.1.1", + "solana-program 3.0.0", + "solana-pubkey 2.4.0", + "solana-sdk-ids 3.1.0", + "solana-sha256-hasher 3.1.0", + "solana-system-interface 2.0.0", + "static_assertions", + "strum", + "thiserror 1.0.69", +] + +[[package]] +name = "magicblock-magic-program-api" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dc8fba0307c90b91b70c9ed06d4242d6c4159f331b2f05bf8f875c2a94e0e98" +dependencies = [ + "bincode", + "const-crypto", + "serde", + "solana-program 2.2.1", + "solana-program 3.0.0", + "solana-signature 2.3.0", + "solana-signature 3.4.0", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate 3.3.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "pastey" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5a797f0e07bdf071d15742978fc3128ec6c22891c31a3a931513263904c982a" + +[[package]] +name = "pinocchio" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8afe4f39c0e25cc471b35b89963312791a5162d45a86578cbeaad9e5e7d1b3b" + +[[package]] +name = "pinocchio" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06810dac15a4ef83d3dabdb4f2f22fb39c9adff669cd2781da4f716510a647c" +dependencies = [ + "solana-account-view", + "solana-address 2.6.0", + "solana-define-syscall 4.0.1", + "solana-instruction-view", + "solana-program-error 3.0.1", +] + +[[package]] +name = "pinocchio-log" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd11022408f312e6179ece321c1f7dc0d1b2aa7765fddd39b2a7378d65a899e8" +dependencies = [ + "pinocchio-log-macro", +] + +[[package]] +name = "pinocchio-log-macro" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69fb52edb3c5736b044cc462b0957b9767d0f574d138f4e2761438c498a4b467" +dependencies = [ + "quote", + "regex", + "syn 1.0.109", +] + +[[package]] +name = "pinocchio-pubkey" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0225638cadcbebae8932cb7f49cb5da7c15c21beb19f048f05a5ca7d93f065" +dependencies = [ + "five8_const 0.1.4", + "pinocchio 0.9.3", + "sha2-const-stable", +] + +[[package]] +name = "pinocchio-system" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24044a0815753862b558e179e78f03f7344cb755de48617a09d7d23b50883b6c" +dependencies = [ + "pinocchio 0.10.2", + "solana-address 2.6.0", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.25", +] + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml 0.5.11", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "redox_syscall" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "rkyv" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "roll-dice" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "ephemeral-rollups-sdk", + "ephemeral-vrf-sdk", +] + +[[package]] +name = "roll-dice-delegated" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "ephemeral-rollups-sdk", + "ephemeral-vrf-sdk", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[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 = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[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 = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" + +[[package]] +name = "solana-account" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f949fe4edaeaea78c844023bfc1c898e0b1f5a100f8a8d2d0f85d0a7b090258" +dependencies = [ + "solana-account-info 2.3.0", + "solana-clock 2.2.1", + "solana-instruction 2.2.1", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", +] + +[[package]] +name = "solana-account-info" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8f5152a288ef1912300fc6efa6c2d1f9bb55d9398eb6c72326360b8063987da" +dependencies = [ + "bincode", + "serde", + "solana-program-error 2.2.1", + "solana-program-memory 2.2.1", + "solana-pubkey 2.4.0", +] + +[[package]] +name = "solana-account-info" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9cf16495d9eb53e3d04e72366a33bb1c20c24e78c171d8b8f5978357b63ae95" +dependencies = [ + "bincode", + "serde_core", + "solana-address 2.6.0", + "solana-program-error 3.0.1", + "solana-program-memory 3.1.0", +] + +[[package]] +name = "solana-account-view" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f37ca34c37f92ee341b73d5ce7c8ef5bb38e9a87955b4bd343c63fa18b149215" +dependencies = [ + "solana-address 2.6.0", + "solana-program-error 3.0.1", +] + +[[package]] +name = "solana-address" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2ecac8e1b7f74c2baa9e774c42817e3e75b20787134b76cc4d45e8a604488f5" +dependencies = [ + "solana-address 2.6.0", +] + +[[package]] +name = "solana-address" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1384b52c435a750cc9c538760fc7bb472fd78e65a9900a2d07312c5bb335b72" +dependencies = [ + "borsh 1.5.7", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "five8 1.0.0", + "five8_const 1.0.0", + "serde", + "serde_derive", + "sha2-const-stable", + "solana-atomic-u64 3.0.1", + "solana-define-syscall 5.1.0", + "solana-program-error 3.0.1", + "solana-sanitize 3.0.1", + "solana-sha256-hasher 3.1.0", + "wincode", +] + +[[package]] +name = "solana-address-lookup-table-interface" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1673f67efe870b64a65cb39e6194be5b26527691ce5922909939961a6e6b395" +dependencies = [ + "bincode", + "bytemuck", + "serde", + "serde_derive", + "solana-clock 2.2.1", + "solana-instruction 2.2.1", + "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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115b4f773acc4f3f3cb986b0d335e9845c0368c82b0940410935bc11ae065578" +dependencies = [ + "solana-clock 3.1.0", + "solana-pubkey 4.2.0", + "solana-sdk-ids 3.1.0", + "solana-slot-hashes 3.0.2", +] + +[[package]] +name = "solana-atomic-u64" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52e52720efe60465b052b9e7445a01c17550666beec855cce66f44766697bc2" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "solana-atomic-u64" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "085db4906d89324cef2a30840d59eaecf3d4231c560ec7c9f6614a93c652f501" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "solana-big-mod-exp" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75db7f2bbac3e62cfd139065d15bcda9e2428883ba61fc8d27ccb251081e7567" +dependencies = [ + "num-bigint", + "num-traits", + "solana-define-syscall 2.2.1", +] + +[[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", + "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 = "19a3787b8cf9c9fe3dd360800e8b70982b9e5a8af9e11c354b6665dd4a003adc" +dependencies = [ + "bincode", + "serde", + "solana-instruction 2.2.1", +] + +[[package]] +name = "solana-blake3-hasher" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a0801e25a1b31a14494fc80882a036be0ffd290efc4c2d640bfcca120a4672" +dependencies = [ + "blake3", + "solana-define-syscall 2.2.1", + "solana-hash 2.2.1", + "solana-sanitize 2.2.1", +] + +[[package]] +name = "solana-blake3-hasher" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7116e1d942a2432ca3f514625104757ab8a56233787e95144c93950029e31176" +dependencies = [ + "blake3", + "solana-define-syscall 4.0.1", + "solana-hash 4.3.0", +] + +[[package]] +name = "solana-borsh" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "718333bcd0a1a7aed6655aa66bef8d7fb047944922b2d3a18f49cbc13e73d004" +dependencies = [ + "borsh 0.10.4", + "borsh 1.5.7", +] + +[[package]] +name = "solana-borsh" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c04abbae16f57178a163125805637b8a076175bb5c0002fb04f4792bea901cf7" +dependencies = [ + "borsh 1.5.7", +] + +[[package]] +name = "solana-clock" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c2177a1b9fe8326004f1151a5acd124420b737811080b1035df31349e4d892" +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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ea35d8f69b67daddb921a9da7f78ca591b533cf5e98833cd9ae62fdc2e4652c" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", +] + +[[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.2.1", + "solana-instruction 2.2.1", + "solana-program-error 2.2.1", + "solana-pubkey 2.4.0", + "solana-stable-layout 2.2.1", +] + +[[package]] +name = "solana-cpi" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dea26709d867aada85d0d3617db0944215c8bb28d3745b912de7db13a23280c" +dependencies = [ + "solana-account-info 3.1.1", + "solana-define-syscall 4.0.1", + "solana-instruction 3.4.0", + "solana-program-error 3.0.1", + "solana-pubkey 4.2.0", + "solana-stable-layout 3.0.1", +] + +[[package]] +name = "solana-decode-error" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a6a6383af236708048f8bd8d03db8ca4ff7baf4a48e5d580f4cce545925470" +dependencies = [ + "num-traits", +] + +[[package]] +name = "solana-define-syscall" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf784bb2cb3e02cac9801813c30187344228d2ae952534902108f6150573a33d" + +[[package]] +name = "solana-define-syscall" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9697086a4e102d28a156b8d6b521730335d6951bd39a5e766512bbe09007cee" + +[[package]] +name = "solana-define-syscall" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57e5b1c0bc1d4a4d10c88a4100499d954c09d3fecfae4912c1a074dff68b1738" + +[[package]] +name = "solana-define-syscall" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e14a4f604117f379840956a8fc8695e4c84f5b0ebed192f31f60d9b85d581d" + +[[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.2.1", + "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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cddf2388b28291210d9aa60690740733cab527531f06ed153c4d388951e407c" +dependencies = [ + "serde", + "serde_derive", + "solana-hash 4.3.0", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce264b7b42322325947c4136a09460bf5c73d9aa8262c9b0a2064be63ba8639" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-epoch-stake" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "027e6d0b9e7daac5b2ac7c3f9ca1b727861121d9ef05084cf435ff736051e7c2" +dependencies = [ + "solana-define-syscall 5.1.0", + "solana-pubkey 4.2.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.1", + "solana-hash 2.2.1", + "solana-instruction 2.2.1", + "solana-keccak-hasher 2.2.1", + "solana-message 2.3.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.18", +] + +[[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.1.0", + "solana-clock 3.1.0", + "solana-hash 3.1.0", + "solana-instruction 3.4.0", + "solana-keccak-hasher 3.1.0", + "solana-message 3.1.0", + "solana-nonce 3.2.0", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.1.0", + "solana-system-interface 2.0.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-feature-gate-interface" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9c7fbf3e58b64a667c5f35e90af580538a95daea7001ff7806c0662d301bdf" +dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-account", + "solana-account-info 2.3.0", + "solana-instruction 2.2.1", + "solana-program-error 2.2.1", + "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-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.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57e8add96b5741573e9f7529c4bb7719cfcfa999c3847a68cdfaef0cb6adf567" +dependencies = [ + "log", + "serde", + "serde_derive", +] + +[[package]] +name = "solana-hash" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf7bcb14392900fe02e4e34e90234fbf0c673d4e327888410ba99fa2ba0f4e99" +dependencies = [ + "borsh 1.5.7", + "bs58", + "bytemuck", + "bytemuck_derive", + "js-sys", + "serde", + "serde_derive", + "solana-atomic-u64 2.2.1", + "solana-sanitize 2.2.1", + "wasm-bindgen", +] + +[[package]] +name = "solana-hash" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "337c246447142f660f778cf6cb582beba8e28deb05b3b24bfb9ffd7c562e5f41" +dependencies = [ + "solana-hash 4.3.0", +] + +[[package]] +name = "solana-hash" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1b113239362cee7093bfb250467138f079a2a03673181dc15bff6ccd677912d" +dependencies = [ + "borsh 1.5.7", + "bytemuck", + "bytemuck_derive", + "five8 1.0.0", + "serde", + "serde_derive", + "solana-atomic-u64 3.0.1", + "solana-sanitize 3.0.1", + "wincode", +] + +[[package]] +name = "solana-instruction" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce496a475e5062ba5de97215ab39d9c358f9c9df4bb7f3a45a1f1a8bd9065ed" +dependencies = [ + "bincode", + "borsh 1.5.7", + "getrandom 0.2.16", + "js-sys", + "num-traits", + "serde", + "serde_derive", + "solana-define-syscall 2.2.1", + "solana-pubkey 2.4.0", + "wasm-bindgen", +] + +[[package]] +name = "solana-instruction" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ebb0ffd19263051bc3f683fcc086134b8ff23af894dcb63f7563c7137b42f1" +dependencies = [ + "bincode", + "borsh 1.5.7", + "serde", + "serde_derive", + "solana-define-syscall 5.1.0", + "solana-instruction-error", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-instruction-error" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0b188842592fdf6cb96f55263ae1bf11713ab5114401d1d5a881ed7cc41bef6" +dependencies = [ + "num-traits", + "solana-program-error 3.0.1", +] + +[[package]] +name = "solana-instruction-view" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60147e4d0a4620013df40bf30a86dd299203ff12fcb8b593cd51014fce0875d8" +dependencies = [ + "solana-account-view", + "solana-address 2.6.0", + "solana-define-syscall 4.0.1", + "solana-program-error 3.0.1", +] + +[[package]] +name = "solana-instructions-sysvar" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0e85a6fad5c2d0c4f5b91d34b8ca47118fc593af706e523cdbedf846a954f57" +dependencies = [ + "bitflags", + "solana-account-info 2.3.0", + "solana-instruction 2.2.1", + "solana-program-error 2.2.1", + "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", + "solana-account-info 3.1.1", + "solana-instruction 3.4.0", + "solana-instruction-error", + "solana-program-error 3.0.1", + "solana-pubkey 3.0.0", + "solana-sanitize 3.0.1", + "solana-sdk-ids 3.1.0", + "solana-serialize-utils 3.1.2", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-invoke" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58f5693c6de226b3626658377168b0184e94e8292ff16e3d31d4766e65627565" +dependencies = [ + "solana-account-info 2.3.0", + "solana-define-syscall 2.2.1", + "solana-instruction 2.2.1", + "solana-program-entrypoint 2.2.1", + "solana-stable-layout 2.2.1", +] + +[[package]] +name = "solana-keccak-hasher" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7aeb957fbd42a451b99235df4942d96db7ef678e8d5061ef34c9b34cae12f79" +dependencies = [ + "sha3", + "solana-define-syscall 2.2.1", + "solana-hash 2.2.1", + "solana-sanitize 2.2.1", +] + +[[package]] +name = "solana-keccak-hasher" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed1c0d16d6fdeba12291a1f068cdf0d479d9bff1141bf44afd7aa9d485f65ef8" +dependencies = [ + "sha3", + "solana-define-syscall 4.0.1", + "solana-hash 4.3.0", +] + +[[package]] +name = "solana-last-restart-slot" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "426711c6564b790026e45cabec3c64b971864c48b6b2d83c0ebf52a118bb4cda" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-loader-v2-interface" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8ab08006dad78ae7cd30df8eea0539e207d08d91eaefb3e1d49a446e1c49654" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction 2.2.1", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", +] + +[[package]] +name = "solana-loader-v3-interface" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4be76cfa9afd84ca2f35ebc09f0da0f0092935ccdac0595d98447f259538c2" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction 2.2.1", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", + "solana-system-interface 1.0.0", +] + +[[package]] +name = "solana-loader-v3-interface" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e0538d4dbc9022e01616f1c58f2db98ece739c5d5ed4a2ef8737a953e76a2d4" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction 3.4.0", + "solana-pubkey 4.2.0", + "solana-sdk-ids 3.1.0", +] + +[[package]] +name = "solana-loader-v4-interface" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "706a777242f1f39a83e2a96a2a6cb034cb41169c6ecbee2cf09cb873d9659e7e" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction 2.2.1", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", + "solana-system-interface 1.0.0", +] + +[[package]] +name = "solana-message" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c6bf99c4570173710107a1f233f3bee226feea5fc817308707d4f7cb100a72d" +dependencies = [ + "bincode", + "blake3", + "lazy_static", + "serde", + "serde_derive", + "solana-bincode", + "solana-hash 2.2.1", + "solana-instruction 2.2.1", + "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-message" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0448b1fd891c5f46491e5dc7d9986385ba3c852c340db2911dd29faa01d2b08d" +dependencies = [ + "lazy_static", + "serde", + "serde_derive", + "solana-address 2.6.0", + "solana-hash 4.3.0", + "solana-instruction 3.4.0", + "solana-sanitize 3.0.1", + "solana-sdk-ids 3.1.0", + "solana-short-vec 3.2.1", + "solana-transaction-error 3.2.0", +] + +[[package]] +name = "solana-msg" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36a1a14399afaabc2781a1db09cb14ee4cc4ee5c7a5a3cfcc601811379a8092" +dependencies = [ + "solana-define-syscall 2.2.1", +] + +[[package]] +name = "solana-msg" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726b7cbbc6be6f1c6f29146ac824343b9415133eee8cce156452ad1db93f8008" +dependencies = [ + "solana-define-syscall 5.1.0", +] + +[[package]] +name = "solana-native-token" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e9de00960197412e4be3902a6cd35e60817c511137aca6c34c66cd5d4017ec" + +[[package]] +name = "solana-native-token" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8dd4c280dca9d046139eb5b7a5ac9ad10403fbd64964c7d7571214950d758f" + +[[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.2.1", + "solana-pubkey 2.4.0", + "solana-sha256-hasher 2.2.1", +] + +[[package]] +name = "solana-nonce" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95dbc9f2e33b6c10e231df15cb2a3bff9ea7eab6347f9e316fe75c97fd67bbb" +dependencies = [ + "solana-fee-calculator 3.2.0", + "solana-hash 4.3.0", + "solana-pubkey 4.2.0", + "solana-sha256-hasher 3.1.0", +] + +[[package]] +name = "solana-program" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "586469467e93ceb79048f8d8e3a619bf61d05396ee7de95cb40280301a589d05" +dependencies = [ + "bincode", + "blake3", + "borsh 0.10.4", + "borsh 1.5.7", + "bs58", + "bytemuck", + "console_error_panic_hook", + "console_log", + "getrandom 0.2.16", + "lazy_static", + "log", + "memoffset", + "num-bigint", + "num-derive", + "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-bincode", + "solana-blake3-hasher 2.2.1", + "solana-borsh 2.2.1", + "solana-clock 2.2.1", + "solana-cpi 2.2.1", + "solana-decode-error", + "solana-define-syscall 2.2.1", + "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.2.1", + "solana-instruction 2.2.1", + "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 3.0.0", + "solana-loader-v4-interface", + "solana-message 2.3.0", + "solana-msg 2.2.1", + "solana-native-token 2.2.1", + "solana-nonce 2.2.1", + "solana-program-entrypoint 2.2.1", + "solana-program-error 2.2.1", + "solana-program-memory 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-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.1", + "solana-serialize-utils 2.2.1", + "solana-sha256-hasher 2.2.1", + "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.2.1", + "solana-sysvar-id 2.2.1", + "solana-vote-interface", + "thiserror 2.0.18", + "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.1.1", + "solana-big-mod-exp 3.0.0", + "solana-blake3-hasher 3.1.0", + "solana-borsh 3.0.2", + "solana-clock 3.1.0", + "solana-cpi 3.1.0", + "solana-define-syscall 3.0.0", + "solana-epoch-rewards 3.0.2", + "solana-epoch-schedule 3.1.0", + "solana-epoch-stake", + "solana-example-mocks 3.0.0", + "solana-fee-calculator 3.2.0", + "solana-hash 3.1.0", + "solana-instruction 3.4.0", + "solana-instruction-error", + "solana-instructions-sysvar 3.0.0", + "solana-keccak-hasher 3.1.0", + "solana-last-restart-slot 3.0.1", + "solana-msg 3.1.0", + "solana-native-token 3.0.0", + "solana-program-entrypoint 3.1.1", + "solana-program-error 3.0.1", + "solana-program-memory 3.1.0", + "solana-program-option 3.1.0", + "solana-program-pack 3.1.0", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids 3.1.0", + "solana-secp256k1-recover 3.1.1", + "solana-serde-varint 3.0.1", + "solana-serialize-utils 3.1.2", + "solana-sha256-hasher 3.1.0", + "solana-short-vec 3.2.1", + "solana-slot-hashes 3.0.2", + "solana-slot-history 3.0.1", + "solana-stable-layout 3.0.1", + "solana-sysvar 3.1.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-program-entrypoint" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "473ffe73c68d93e9f2aa726ad2985fe52760052709aaab188100a42c618060ec" +dependencies = [ + "solana-account-info 2.3.0", + "solana-msg 2.2.1", + "solana-program-error 2.2.1", + "solana-pubkey 2.4.0", +] + +[[package]] +name = "solana-program-entrypoint" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c9b0a1ff494e05f503a08b3d51150b73aa639544631e510279d6375f290997" +dependencies = [ + "solana-account-info 3.1.1", + "solana-define-syscall 4.0.1", + "solana-program-error 3.0.1", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-program-error" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8ae2c1a8d0d4ae865882d5770a7ebca92bab9c685e43f0461682c6c05a35bfa" +dependencies = [ + "borsh 1.5.7", + "num-traits", + "serde", + "serde_derive", + "solana-decode-error", + "solana-instruction 2.2.1", + "solana-msg 2.2.1", + "solana-pubkey 2.4.0", +] + +[[package]] +name = "solana-program-error" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f04fa578707b3612b095f0c8e19b66a1233f7c42ca8082fcb3b745afcc0add6" +dependencies = [ + "borsh 1.5.7", + "serde", + "serde_derive", +] + +[[package]] +name = "solana-program-memory" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b0268f6c89825fb634a34bd0c3b8fdaeaecfc3728be1d622a8ee6dd577b60d4" +dependencies = [ + "num-traits", + "solana-define-syscall 2.2.1", +] + +[[package]] +name = "solana-program-memory" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4068648649653c2c50546e9a7fb761791b5ab0cda054c771bb5808d3a4b9eb52" +dependencies = [ + "solana-define-syscall 4.0.1", +] + +[[package]] +name = "solana-program-option" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc677a2e9bc616eda6dbdab834d463372b92848b2bfe4a1ed4e4b4adba3397d0" + +[[package]] +name = "solana-program-option" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a88006a9b8594088cec9027ab77caaaa258a2aaa2083d3f086c44b42e50aeab" + +[[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.1", +] + +[[package]] +name = "solana-program-pack" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7701cb15b90667ae1c89ef4ac35a59c61e66ce58ddee13d729472af7f41d59" +dependencies = [ + "solana-program-error 3.0.1", +] + +[[package]] +name = "solana-pubkey" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b62adb9c3261a052ca1f999398c388f1daf558a1b492f60a6d9e64857db4ff1" +dependencies = [ + "borsh 0.10.4", + "borsh 1.5.7", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "five8 0.2.1", + "five8_const 0.1.4", + "getrandom 0.2.16", + "js-sys", + "num-traits", + "serde", + "serde_derive", + "solana-atomic-u64 2.2.1", + "solana-decode-error", + "solana-define-syscall 2.2.1", + "solana-sanitize 2.2.1", + "solana-sha256-hasher 2.2.1", + "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 1.1.0", +] + +[[package]] +name = "solana-pubkey" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7db719574990de7e8b0f55a8593ac92a5ccb42c8ce67b3e4bf05b139d5d9ee71" +dependencies = [ + "solana-address 2.6.0", +] + +[[package]] +name = "solana-rent" +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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e860d5499a705369778647e97d760f7670adfb6fc8419dd3d568deccd46d5487" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-sanitize" +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-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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def234c1956ff616d46c9dd953f251fa7096ddbaa6d52b165218de97882b7280" +dependencies = [ + "solana-address 2.6.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.117", +] + +[[package]] +name = "solana-sdk-macro" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8765316242300c48242d84a41614cb3388229ec353ba464f6fe62a733e41806f" +dependencies = [ + "bs58", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "solana-secp256k1-recover" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baa3120b6cdaa270f39444f5093a90a7b03d296d362878f7a6991d6de3bbe496" +dependencies = [ + "libsecp256k1", + "solana-define-syscall 2.2.1", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-secp256k1-recover" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c5f18893d62e6c73117dcba48f8f5e3266d90e5ec3d0a0a90f9785adac36c1" +dependencies = [ + "k256", + "solana-define-syscall 5.1.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-serde-varint" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc07d00200d82e6def2f7f7a45738e3406b17fe54a18adcf0defa16a97ccadb" +dependencies = [ + "serde", +] + +[[package]] +name = "solana-serde-varint" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950e5b83e839dc0f92c66afc124bb8f40e89bc90f0579e8ec5499296d27f54e3" +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.2.1", + "solana-pubkey 2.4.0", + "solana-sanitize 2.2.1", +] + +[[package]] +name = "solana-serialize-utils" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761357b0853c9623bf12c1d2314b3d6160a85b087b84c45224fb85766d22616b" +dependencies = [ + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-sanitize 3.0.1", +] + +[[package]] +name = "solana-sha256-hasher" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0037386961c0d633421f53560ad7c80675c0447cba4d1bb66d60974dd486c7ea" +dependencies = [ + "sha2 0.10.8", + "solana-define-syscall 2.2.1", + "solana-hash 2.2.1", +] + +[[package]] +name = "solana-sha256-hasher" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db7dc3011ea4c0334aaaa7e7128cb390ecf546b28d412e9bf2064680f57f588f" +dependencies = [ + "sha2 0.10.8", + "solana-define-syscall 4.0.1", + "solana-hash 4.3.0", +] + +[[package]] +name = "solana-short-vec" +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.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bb8cc883fc7b8ce4a7814cb1441b48c06437049ec11847005cf63bcfa85c546" +dependencies = [ + "serde_core", +] + +[[package]] +name = "solana-signature" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64c8ec8e657aecfc187522fc67495142c12f35e55ddeca8698edbb738b8dbd8c" +dependencies = [ + "five8 0.2.1", + "serde", + "serde-big-array", + "serde_derive", + "solana-sanitize 2.2.1", +] + +[[package]] +name = "solana-signature" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a73c6e97cc2108be0adf6a6ea326434f8398df9d7eed81da2a4548b69e971c" +dependencies = [ + "five8 1.0.0", + "serde", + "serde-big-array", + "serde_derive", + "solana-sanitize 3.0.1", + "wincode", +] + +[[package]] +name = "solana-slot-hashes" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8691982114513763e88d04094c9caa0376b867a29577939011331134c301ce" +dependencies = [ + "serde", + "serde_derive", + "solana-hash 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-slot-hashes" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a57c158c35629f9e302ab385f16b15813f4927a31c27dda72f3df828bb08d93" +dependencies = [ + "serde", + "serde_derive", + "solana-hash 4.3.0", + "solana-sdk-ids 3.1.0", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-slot-history" +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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0622d03a823770f7763afd866e012b296d5a3cbbbe51e110b5bd9ab3441efdca" +dependencies = [ + "bv", + "serde", + "serde_derive", + "solana-sdk-ids 3.1.0", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-stable-layout" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f14f7d02af8f2bc1b5efeeae71bc1c2b7f0f65cd75bcc7d8180f2c762a57f54" +dependencies = [ + "solana-instruction 2.2.1", + "solana-pubkey 2.4.0", +] + +[[package]] +name = "solana-stable-layout" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9f6a291ba063a37780af29e7db14bdd3dc447584d8ba5b3fc4b88e2bbc982fa" +dependencies = [ + "solana-instruction 3.4.0", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-stake-interface" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5269e89fde216b4d7e1d1739cf5303f8398a1ff372a81232abbee80e554a838c" +dependencies = [ + "borsh 0.10.4", + "borsh 1.5.7", + "num-traits", + "serde", + "serde_derive", + "solana-clock 2.2.1", + "solana-cpi 2.2.1", + "solana-decode-error", + "solana-instruction 2.2.1", + "solana-program-error 2.2.1", + "solana-pubkey 2.4.0", + "solana-system-interface 1.0.0", + "solana-sysvar-id 2.2.1", +] + +[[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.2.1", + "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", + "serde", + "serde_derive", + "solana-instruction 3.4.0", + "solana-msg 3.1.0", + "solana-program-error 3.0.1", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-sysvar" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf6b44740d7f0c9f375d045c165bc0aab4a90658f92d6835aeb0649afaeaff9a" +dependencies = [ + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info 2.3.0", + "solana-clock 2.2.1", + "solana-define-syscall 2.2.1", + "solana-epoch-rewards 2.2.1", + "solana-epoch-schedule 2.2.1", + "solana-fee-calculator 2.2.1", + "solana-hash 2.2.1", + "solana-instruction 2.2.1", + "solana-instructions-sysvar 2.2.2", + "solana-last-restart-slot 2.2.1", + "solana-program-entrypoint 2.2.1", + "solana-program-error 2.2.1", + "solana-program-memory 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-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.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6690d3dd88f15c21edff68eb391ef8800df7a1f5cec84ee3e8d1abf05affdf74" +dependencies = [ + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info 3.1.1", + "solana-clock 3.1.0", + "solana-define-syscall 4.0.1", + "solana-epoch-rewards 3.0.2", + "solana-epoch-schedule 3.1.0", + "solana-fee-calculator 3.2.0", + "solana-hash 4.3.0", + "solana-instruction 3.4.0", + "solana-last-restart-slot 3.0.1", + "solana-program-entrypoint 3.1.1", + "solana-program-error 3.0.1", + "solana-program-memory 3.1.0", + "solana-pubkey 4.2.0", + "solana-rent 3.1.0", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-slot-hashes 3.0.2", + "solana-slot-history 3.0.1", + "solana-sysvar-id 3.1.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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" +dependencies = [ + "solana-address 2.6.0", + "solana-sdk-ids 3.1.0", +] + +[[package]] +name = "solana-transaction-error" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222a9dc8fdb61c6088baab34fc3a8b8473a03a7a5fd404ed8dd502fa79b67cb1" +dependencies = [ + "solana-instruction 2.2.1", + "solana-sanitize 2.2.1", +] + +[[package]] +name = "solana-transaction-error" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a2165ad25b694c654d5395fc7a049452a192376e4c96a7fad05580f6ba5ba1c" +dependencies = [ + "solana-instruction-error", + "solana-sanitize 3.0.1", +] + +[[package]] +name = "solana-vote-interface" +version = "2.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78f039b0788337bedc6c5450d2f237718f938defb5ce0e0ad8ef507e78dcd370" +dependencies = [ + "bincode", + "num-derive", + "num-traits", + "serde", + "serde_derive", + "solana-clock 2.2.1", + "solana-decode-error", + "solana-hash 2.2.1", + "solana-instruction 2.2.1", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-serde-varint 2.2.1", + "solana-serialize-utils 2.2.1", + "solana-short-vec 2.2.1", + "solana-system-interface 1.0.0", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900f6c86a685850b1bc9f6223b20125115ee3f31e01207d81655bbcc0aea9231" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10558ed0bd2a1562e630926a2d1f0b98c827da99fabd3fe20920a59642504485" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28391a4201ba7eb1984cfeb6862c0b3ea2cfe23332298967c749dddc0d6cd976" + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "uuid" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wincode" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37095eb18dd6254c66217edc61a29d83d51f8818de8a2ffe88e4584ad73fb5f9" +dependencies = [ + "pastey", + "proc-macro2", + "quote", + "thiserror 2.0.18", + "wincode-derive", +] + +[[package]] +name = "wincode-derive" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e262d55d1261f31e2cfe49cc6385a421d14d99faa0526bbe3cc1bda0d3005c62" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +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 = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5" +dependencies = [ + "memchr", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive 0.8.25", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/01-backward-compat/roll-dice/Cargo.toml b/01-backward-compat/roll-dice/Cargo.toml new file mode 100644 index 00000000..f3977048 --- /dev/null +++ b/01-backward-compat/roll-dice/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/01-backward-compat/roll-dice/README.md b/01-backward-compat/roll-dice/README.md new file mode 100644 index 00000000..ba9d1100 --- /dev/null +++ b/01-backward-compat/roll-dice/README.md @@ -0,0 +1,71 @@ +# 🎲 Roll Dice + +Simple dice rolling application using Ephemeral Rollups to demonstrate using a verifiable random function (VRF) to generate random numbers. + +# Demo + +Screenshot 2025-03-27 at 18 48 50 + +[https://roll-dice-demo.vercel.app/](https://roll-dice-demo.vercel.app//) + +## Software Packages + +This program has utilized the following sofware packages. + +| Software | Version | Installation Guide | +| ---------- | ------- | --------------------------------------------------------------- | +| **Solana** | 2.1.6 | [Install Solana](https://docs.anza.xyz/cli/install) | +| **Rust** | 1.82 | [Install Rust](https://www.rust-lang.org/tools/install) | +| **Anchor** | 0.32.1 | [Install Anchor](https://www.anchor-lang.com/docs/installation) | +| **Node** | 22.17.0 | [Install Node](https://nodejs.org/en/download/current) | + +```sh +# Check and initialize your Solana version +agave-install list +agave-install init 2.1.6 + +# Check and initialize your Rust version +rustup show +rustup install 1.82 + +# Check and initialize your Anchor version +avm list +avm use 0.32.1 +``` + +## ✨ Build and Test + +Build the program: + +```bash +anchor build +``` + +Run the tests: + +```bash +anchor test --skip-deploy --skip-build --skip-local-validator +``` + +## 🚀 Launch the Frontend + +To start the frontend application locally: + +```bash +cd roll-dice/app +``` + +Install dependencies: + +```bash +yarn install +``` + +Start the development server: + +```bash +yarn dev +``` + +The application will be available at `http://localhost:3000` (or another port if 3000 is already in use). +The delegated dice demo will be available at `http://localhost:3000/delegated`. \ No newline at end of file diff --git a/01-backward-compat/roll-dice/app/.eslintrc.json b/01-backward-compat/roll-dice/app/.eslintrc.json new file mode 100644 index 00000000..15b1ed91 --- /dev/null +++ b/01-backward-compat/roll-dice/app/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next" +} diff --git a/01-backward-compat/roll-dice/app/.gitignore b/01-backward-compat/roll-dice/app/.gitignore new file mode 100644 index 00000000..e985853e --- /dev/null +++ b/01-backward-compat/roll-dice/app/.gitignore @@ -0,0 +1 @@ +.vercel diff --git a/01-backward-compat/roll-dice/app/app/delegated/page.tsx b/01-backward-compat/roll-dice/app/app/delegated/page.tsx new file mode 100644 index 00000000..710ba309 --- /dev/null +++ b/01-backward-compat/roll-dice/app/app/delegated/page.tsx @@ -0,0 +1,1050 @@ +"use client" + +import { useCallback, useEffect, useRef, useState } from "react" +import * as anchor from "@coral-xyz/anchor" +import { + Connection, + Keypair, + PublicKey, +} from "@solana/web3.js" +import { ConnectionMagicRouter } from "@magicblock-labs/ephemeral-rollups-sdk" +import Dice from "@/components/dice" +import SolanaAddress from "@/components/solana-address" +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table" +import { Badge } from "@/components/ui/badge" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion" +import { Copy, Check } from "lucide-react" +import { + PROGRAM_ID, + PLAYER_SEED, + ORACLE_QUEUE, + BASE_ENDPOINT, + PLAYER_STORAGE_KEY, + BLOCKHASH_REFRESH_INTERVAL_MS, + ROLL_TIMEOUT_MS, + ROLL_ANIMATION_INTERVAL_MS, +} from "@/lib/config" +import { + walletAdapterFrom, + loadOrCreateKeypair, + ensureFunds, + fetchAndCacheBlockhash, + getCachedBlockhash, + checkDelegationStatus, +} from "@/lib/solana-utils" +import type { RollEntry, CachedBlockhash } from "@/lib/types" + +const derivePlayerPda = (user: PublicKey) => + PublicKey.findProgramAddressSync([Buffer.from(PLAYER_SEED), user.toBuffer()], PROGRAM_ID)[0] + +const MiniDice = ({ value }: { value: number | null }) => { + if (value === null) return - + + const safeValue = Math.min(Math.max(1, value), 6) + const dotSize = "w-1.5 h-1.5" + + return ( +
+
+ {safeValue === 1 && ( +
+
+
+ )} + {safeValue === 2 && ( +
+
+
+
+
+
+
+
+ )} + {safeValue === 3 && ( +
+
+
+
+
+
+
+
+
+
+
+ )} + {safeValue === 4 && ( +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )} + {safeValue === 5 && ( +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )} + {safeValue === 6 && ( +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )} +
+
+ ) +} + +export default function DiceRollerDelegated() { + const [diceValue, setDiceValue] = useState(1) + const [isRolling, setIsRolling] = useState(false) + const [isInitialized, setIsInitialized] = useState(false) + const [isDelegated, setIsDelegated] = useState(false) + const [isDelegating, setIsDelegating] = useState(false) + const [isUndelegating, setIsUndelegating] = useState(false) + const [rollHistory, setRollHistory] = useState([]) + const [timerTick, setTimerTick] = useState(0) + const [playerAccountData, setPlayerAccountData] = useState<{ lastResult: number; rollnum: number } | null>(null) + const [playerPda, setPlayerPda] = useState(null) + const [copied, setCopied] = useState(false) + const [ephemeralEndpoint, setEphemeralEndpoint] = useState(null) + + const previousDiceValueRef = useRef(1) + const programRef = useRef(null) + const ephemeralProgramRef = useRef(null) + const connectionRef = useRef(null) + const ephemeralConnectionRef = useRef(null) + const routerConnectionRef = useRef(null) + const playerPdaRef = useRef(null) + const subscriptionIdRef = useRef(null) + const rollIntervalRef = useRef(null) + const timerIntervalRef = useRef(null) + const timeoutRef = useRef(null) + const blockhashIntervalRef = useRef(null) + const delegationPollIntervalRef = useRef(null) + const playerKeypairRef = useRef(null) + const cachedBaseBlockhashRef = useRef(null) + const cachedEphemeralBlockhashRef = useRef(null) + + const clearAllIntervals = useCallback(() => { + if (rollIntervalRef.current) { + clearInterval(rollIntervalRef.current) + rollIntervalRef.current = null + } + if (timerIntervalRef.current) { + clearInterval(timerIntervalRef.current) + timerIntervalRef.current = null + } + if (timeoutRef.current) { + clearTimeout(timeoutRef.current) + timeoutRef.current = null + } + // Note: blockhashIntervalRef is NOT cleared here - it should run continuously + if (delegationPollIntervalRef.current) { + clearInterval(delegationPollIntervalRef.current) + delegationPollIntervalRef.current = null + } + }, []) + + + const getBlockhashAsync = useCallback(async (connection: Connection, isEphemeral: boolean): Promise => { + const cacheRef = isEphemeral ? cachedEphemeralBlockhashRef : cachedBaseBlockhashRef + const cached = getCachedBlockhash(connection, cacheRef) + if (cached) return cached + const { blockhash } = await connection.getLatestBlockhash() + return blockhash + }, []) + + const updateEphemeralConnectionToValidator = useCallback(async (validatorFqdn: string) => { + if (!playerKeypairRef.current || !playerPdaRef.current || !programRef.current) return + + // Convert https:// to wss:// for WebSocket endpoint + const ephemeralWsEndpoint = validatorFqdn.replace(/^https:\/\//, "wss://").replace(/^http:\/\//, "ws://") + const newEphemeralConnection = new Connection(validatorFqdn, { + wsEndpoint: ephemeralWsEndpoint, + commitment: "processed", + }) + + // Clean up old subscription + if (subscriptionIdRef.current !== null && ephemeralConnectionRef.current) { + await ephemeralConnectionRef.current.removeAccountChangeListener(subscriptionIdRef.current).catch(console.error) + } + + ephemeralConnectionRef.current = newEphemeralConnection + setEphemeralEndpoint(validatorFqdn) + + // Recreate ephemeral program with new connection + const idl = await anchor.Program.fetchIdl(PROGRAM_ID, programRef.current.provider) + if (!idl) throw new Error("IDL not found") + + const ephemeralProvider = new anchor.AnchorProvider( + newEphemeralConnection, + walletAdapterFrom(playerKeypairRef.current), + anchor.AnchorProvider.defaultOptions() + ) + ephemeralProgramRef.current = new anchor.Program(idl, ephemeralProvider) + + // Recreate subscription with new connection + subscriptionIdRef.current = newEphemeralConnection.onAccountChange( + playerPdaRef.current, + (accountInfo) => { + if (!ephemeralProgramRef.current || !accountInfo?.data) return + try { + const player = ephemeralProgramRef.current.coder.accounts.decode("player", accountInfo.data) + const newValue = Number(player.lastResult) + setPlayerAccountData({ lastResult: newValue, rollnum: Number(player.rollnum) }) + if (newValue > 0) { + setDiceValue(newValue) + previousDiceValueRef.current = newValue + } + setRollHistory(prev => { + const idx = prev.findIndex(entry => entry.isPending) + if (idx === -1) return prev + const updated = [...prev] + updated[idx] = { ...updated[idx], value: newValue, endTime: Date.now(), isPending: false } + setIsRolling(false) + clearAllIntervals() + return updated + }) + } catch (error) { + console.error("[WebSocket] Failed to decode player account:", error) + } + }, + { commitment: "processed" } + ) + + // Fetch blockhash for new connection + await fetchAndCacheBlockhash(newEphemeralConnection, cachedEphemeralBlockhashRef) + }, [clearAllIntervals]) + + const refreshDelegationStatus = useCallback(async () => { + if (!routerConnectionRef.current || !playerPdaRef.current) return false + try { + const delegationStatus = await routerConnectionRef.current.getDelegationStatus(playerPdaRef.current) + setIsDelegated(delegationStatus.isDelegated) + + // Update ephemeral connection to use the FQDN from delegation status if available + const delegationStatusWithFqdn = delegationStatus as { isDelegated: boolean; fqdn?: string } + if (delegationStatusWithFqdn.isDelegated && delegationStatusWithFqdn.fqdn) { + await updateEphemeralConnectionToValidator(delegationStatusWithFqdn.fqdn) + } + + return delegationStatus.isDelegated + } catch (error) { + console.error("Failed to refresh delegation status:", error) + return false + } + }, [updateEphemeralConnectionToValidator]) + + const sendBackgroundRoll = useCallback(async () => { + if (!ephemeralProgramRef.current || !playerKeypairRef.current || !playerPdaRef.current || !ephemeralConnectionRef.current) return + + try { + const randomValue = Math.floor(Math.random() * 6) + 1 + const [tx, blockhash] = await Promise.all([ + ephemeralProgramRef.current.methods.rollDiceDelegated(randomValue).accounts({ + payer: playerKeypairRef.current.publicKey, + player: playerPdaRef.current, + oracleQueue: ORACLE_QUEUE, + }).transaction(), + getBlockhashAsync(ephemeralConnectionRef.current, true) + ]) + + tx.recentBlockhash = blockhash + tx.feePayer = playerKeypairRef.current.publicKey + tx.sign(playerKeypairRef.current) + + ephemeralConnectionRef.current.sendRawTransaction(tx.serialize(), { skipPreflight: true }) + fetchAndCacheBlockhash(ephemeralConnectionRef.current, cachedEphemeralBlockhashRef).catch(console.error) + } catch (error) { + console.error("[BackgroundRoll] Error:", error) + } + }, [getBlockhashAsync]) + + const initializeProgram = useCallback(async () => { + if (typeof window === "undefined") return + try { + const connection = new Connection(BASE_ENDPOINT, "confirmed") + connectionRef.current = connection + + if (!playerKeypairRef.current) { + playerKeypairRef.current = loadOrCreateKeypair(PLAYER_STORAGE_KEY) + } + + await ensureFunds(connection, playerKeypairRef.current) + + const provider = new anchor.AnchorProvider( + connection, + walletAdapterFrom(playerKeypairRef.current), + anchor.AnchorProvider.defaultOptions() + ) + + const idl = await anchor.Program.fetchIdl(PROGRAM_ID, provider) + if (!idl) throw new Error("IDL not found") + + const program = new anchor.Program(idl, provider) + programRef.current = program + + const playerPk = derivePlayerPda(playerKeypairRef.current.publicKey) + playerPdaRef.current = playerPk + setPlayerPda(playerPk) + + let account = await connection.getAccountInfo(playerPk) + if (!account) { + await program.methods.initialize().rpc() + account = await connection.getAccountInfo(playerPk) + } + if (account) { + try { + const player = program.coder.accounts.decode("player", account.data) + const initialValue = player.lastResult || 1 + setDiceValue(initialValue) + previousDiceValueRef.current = initialValue + setPlayerAccountData({ + lastResult: Number(player.lastResult), + rollnum: Number(player.rollnum), + }) + } catch (error) { + console.error("Failed to decode player on init:", error) + } + } + + const routerEndpoint = process.env.NEXT_PUBLIC_ROUTER_ENDPOINT || "https://devnet-router.magicblock.app" + const routerWsEndpoint = process.env.NEXT_PUBLIC_ROUTER_WS_ENDPOINT || "wss://devnet-router.magicblock.app" + const routerConnection = new ConnectionMagicRouter(routerEndpoint, { + wsEndpoint: routerWsEndpoint, + }) + routerConnectionRef.current = routerConnection + + const ephemeralEndpoint = process.env.NEXT_PUBLIC_EPHEMERAL_PROVIDER_ENDPOINT || "https://devnet.magicblock.app" + setEphemeralEndpoint(ephemeralEndpoint) + const ephemeralWsEndpoint = process.env.NEXT_PUBLIC_EPHEMERAL_WS_ENDPOINT || "wss://devnet.magicblock.app" + const ephemeralConnection = new Connection(ephemeralEndpoint, { + wsEndpoint: ephemeralWsEndpoint, + commitment: "processed", + }) + ephemeralConnectionRef.current = ephemeralConnection + const ephemeralProvider = new anchor.AnchorProvider( + ephemeralConnection, + walletAdapterFrom(playerKeypairRef.current), + anchor.AnchorProvider.defaultOptions() + ) + ephemeralProgramRef.current = new anchor.Program(idl, ephemeralProvider) + + if (subscriptionIdRef.current !== null && ephemeralConnection) { + await ephemeralConnection.removeAccountChangeListener(subscriptionIdRef.current).catch(console.error) + } + if (ephemeralConnection && playerPk) { + subscriptionIdRef.current = ephemeralConnection.onAccountChange( + playerPk, + (accountInfo) => { + if (!ephemeralProgramRef.current || !accountInfo?.data) return + try { + const player = ephemeralProgramRef.current.coder.accounts.decode("player", accountInfo.data) + const newValue = Number(player.lastResult) + setPlayerAccountData({ lastResult: newValue, rollnum: Number(player.rollnum) }) + if (newValue > 0) { + setDiceValue(newValue) + previousDiceValueRef.current = newValue + } + setRollHistory(prev => { + const idx = prev.findIndex(entry => entry.isPending) + if (idx === -1) return prev + const updated = [...prev] + updated[idx] = { ...updated[idx], value: newValue, endTime: Date.now(), isPending: false } + setIsRolling(false) + clearAllIntervals() + return updated + }) + } catch (error) { + console.error("[WebSocket] Failed to decode player account:", error) + } + }, + { commitment: "processed" } + ) + } + + const isDelegated = await refreshDelegationStatus() + + // refreshDelegationStatus already updates the ephemeral connection to the FQDN from delegation status if delegated + if (!isDelegated && routerConnectionRef.current) { + // Automatically delegate on startup if not already delegated + setIsDelegating(true) + try { + const validatorResult = await routerConnectionRef.current.getClosestValidator() + console.log("getClosestValidator result on init:", validatorResult) + + const validatorIdentity = validatorResult.identity + const validatorFqdn = validatorResult.fqdn + + if (!validatorIdentity || !validatorFqdn) { + throw new Error("Validator identity or fqdn not found in getClosestValidator response") + } + + await updateEphemeralConnectionToValidator(validatorFqdn) + + await ensureFunds(connection, playerKeypairRef.current) + const validatorPubkey = new PublicKey(validatorIdentity) + const remainingAccounts = [ + { + pubkey: validatorPubkey, + isSigner: false, + isWritable: false, + }, + ] + await program.methods + .delegate() + .accounts({ + user: playerKeypairRef.current.publicKey, + }) + .remainingAccounts(remainingAccounts) + .rpc() + + // Poll every second until delegation succeeds + if (delegationPollIntervalRef.current) { + clearInterval(delegationPollIntervalRef.current) + } + + delegationPollIntervalRef.current = setInterval(async () => { + const delegated = await refreshDelegationStatus() + if (delegated) { + if (delegationPollIntervalRef.current) { + clearInterval(delegationPollIntervalRef.current) + delegationPollIntervalRef.current = null + } + setIsDelegating(false) + // Send background roll immediately after successful delegation + sendBackgroundRoll().catch(console.error) + } + }, 1000) + } catch (error) { + console.error("Automatic delegation failed on startup:", error) + if (delegationPollIntervalRef.current) { + clearInterval(delegationPollIntervalRef.current) + delegationPollIntervalRef.current = null + } + setIsDelegating(false) + await fetchAndCacheBlockhash(connection, cachedBaseBlockhashRef) + // Use ephemeralConnectionRef.current instead of ephemeralConnection since updateEphemeralConnectionToValidator may have updated it + if (ephemeralConnectionRef.current) { + await fetchAndCacheBlockhash(ephemeralConnectionRef.current, cachedEphemeralBlockhashRef) + } + } + } else { + await fetchAndCacheBlockhash(connection, cachedBaseBlockhashRef) + // Use ephemeralConnectionRef.current instead of ephemeralConnection since refreshDelegationStatus may have updated it + if (ephemeralConnectionRef.current) { + await fetchAndCacheBlockhash(ephemeralConnectionRef.current, cachedEphemeralBlockhashRef) + } + } + + // Clear any existing interval before creating a new one + if (blockhashIntervalRef.current) { + clearInterval(blockhashIntervalRef.current) + } + + // Start continuous blockhash refresh - this runs every 20 seconds regardless of other activity + blockhashIntervalRef.current = setInterval(() => { + if (connectionRef.current) { + fetchAndCacheBlockhash(connectionRef.current, cachedBaseBlockhashRef).catch(console.error) + } + if (ephemeralConnectionRef.current) { + fetchAndCacheBlockhash(ephemeralConnectionRef.current, cachedEphemeralBlockhashRef).catch(console.error) + } + }, BLOCKHASH_REFRESH_INTERVAL_MS) + + setIsInitialized(true) + } catch (error) { + console.error("Failed to initialize delegated dice:", error) + setIsInitialized(false) + } + }, [refreshDelegationStatus, updateEphemeralConnectionToValidator, sendBackgroundRoll]) + + useEffect(() => { + initializeProgram() + + return () => { + clearAllIntervals() + // Clean up blockhash refresh interval on unmount + if (blockhashIntervalRef.current) { + clearInterval(blockhashIntervalRef.current) + blockhashIntervalRef.current = null + } + // Clean up subscription + if (subscriptionIdRef.current !== null && ephemeralConnectionRef.current) { + ephemeralConnectionRef.current.removeAccountChangeListener(subscriptionIdRef.current).catch(console.error) + subscriptionIdRef.current = null + } + } + }, [clearAllIntervals, initializeProgram]) + + const handleDelegateToValidator = useCallback(async (validatorIdentity: string, validatorFqdn: string) => { + if ( + !programRef.current || + !connectionRef.current || + !playerKeypairRef.current || + !playerPdaRef.current + ) + return + if (isDelegated) return + + setIsDelegating(true) + try { + const connection = connectionRef.current + const playerKeypair = playerKeypairRef.current + + const validatorPubkey = new PublicKey(validatorIdentity) + + // Update ephemeral connection to use the fqdn + await updateEphemeralConnectionToValidator(validatorFqdn) + + await ensureFunds(connection, playerKeypair) + const remainingAccounts = [ + { + pubkey: validatorPubkey, + isSigner: false, + isWritable: false, + }, + ] + await programRef.current.methods + .delegate() + .accounts({ + user: playerKeypair.publicKey, + }) + .remainingAccounts(remainingAccounts) + .rpc() + + // Poll every second until delegation succeeds + if (delegationPollIntervalRef.current) { + clearInterval(delegationPollIntervalRef.current) + } + + delegationPollIntervalRef.current = setInterval(async () => { + const delegated = await refreshDelegationStatus() + if (delegated) { + if (delegationPollIntervalRef.current) { + clearInterval(delegationPollIntervalRef.current) + delegationPollIntervalRef.current = null + } + setIsDelegating(false) + // Send background roll immediately after successful delegation + sendBackgroundRoll().catch(console.error) + } + }, 1000) + } catch (error) { + console.error("Delegation failed:", error) + if (delegationPollIntervalRef.current) { + clearInterval(delegationPollIntervalRef.current) + delegationPollIntervalRef.current = null + } + setIsDelegating(false) + } + }, [isDelegated, refreshDelegationStatus, clearAllIntervals, updateEphemeralConnectionToValidator, sendBackgroundRoll]) + + const handleDelegate = useCallback(async () => { + if ( + !programRef.current || + !connectionRef.current || + !playerKeypairRef.current || + !playerPdaRef.current || + !routerConnectionRef.current + ) + return + if (isDelegated) return + + setIsDelegating(true) + try { + const connection = connectionRef.current + const playerKeypair = playerKeypairRef.current + + // Get closest validator + const validatorResult = await routerConnectionRef.current.getClosestValidator() + console.log("getClosestValidator result:", validatorResult) + + const validatorIdentity = validatorResult.identity + const validatorFqdn = validatorResult.fqdn + + if (!validatorIdentity || !validatorFqdn) { + throw new Error("Validator identity or fqdn not found in getClosestValidator response") + } + + await handleDelegateToValidator(validatorIdentity, validatorFqdn) + } catch (error) { + console.error("Delegation failed:", error) + if (delegationPollIntervalRef.current) { + clearInterval(delegationPollIntervalRef.current) + delegationPollIntervalRef.current = null + } + setIsDelegating(false) + } + }, [isDelegated, handleDelegateToValidator]) + + const handleUndelegate = useCallback(async () => { + if ( + !programRef.current || + !playerKeypairRef.current || + !playerPdaRef.current || + !routerConnectionRef.current + ) + return + if (!isDelegated) return + + setIsUndelegating(true) + try { + // Store refs in local variables for TypeScript + const playerKeypair = playerKeypairRef.current + const playerPda = playerPdaRef.current + const program = programRef.current + + if (!playerKeypair || !playerPda || !program) { + throw new Error("Required refs not available") + } + + // Get the FQDN from delegation status + const delegationStatus = await routerConnectionRef.current.getDelegationStatus(playerPda) + const delegationStatusWithFqdn = delegationStatus as { isDelegated: boolean; fqdn?: string } + + if (!delegationStatusWithFqdn.fqdn) { + throw new Error("FQDN not found in delegation status") + } + + const validatorFqdn = delegationStatusWithFqdn.fqdn + const wsEndpoint = validatorFqdn.replace(/^https:\/\//, "wss://").replace(/^http:\/\//, "ws://") + + // Fetch IDL once + const idl = await anchor.Program.fetchIdl(PROGRAM_ID, program.provider) + if (!idl) throw new Error("IDL not found") + + // Create connection to the specific validator we're delegated to + const connection = new Connection(validatorFqdn, { + wsEndpoint, + commitment: "processed", + }) + + const provider = new anchor.AnchorProvider( + connection, + walletAdapterFrom(playerKeypair), + anchor.AnchorProvider.defaultOptions() + ) + + const ephemeralProgram = new anchor.Program(idl, provider) + + // Send undelegate RPC to the specific validator endpoint + await ephemeralProgram.methods + .undelegate() + .accounts({ + payer: playerKeypair.publicKey, + user: playerPda, + }) + .rpc() + + console.log(`Undelegation sent to ${validatorFqdn}`) + + // Poll every second until undelegation succeeds + if (delegationPollIntervalRef.current) { + clearInterval(delegationPollIntervalRef.current) + } + + delegationPollIntervalRef.current = setInterval(async () => { + const delegated = await refreshDelegationStatus() + if (!delegated) { + if (delegationPollIntervalRef.current) { + clearInterval(delegationPollIntervalRef.current) + delegationPollIntervalRef.current = null + } + setIsUndelegating(false) + } + }, 1000) + } catch (error) { + console.error("Undelegation failed:", error) + if (delegationPollIntervalRef.current) { + clearInterval(delegationPollIntervalRef.current) + delegationPollIntervalRef.current = null + } + setIsUndelegating(false) + } + }, [isDelegated, refreshDelegationStatus]) + + const handleRollDice = useCallback(async () => { + if (isRolling || !isInitialized || !isDelegated) return + if (!ephemeralProgramRef.current || !playerKeypairRef.current || !playerPdaRef.current) return + + console.log("[RollDice] Starting roll") + setIsRolling(true) + clearAllIntervals() + + rollIntervalRef.current = setInterval(() => { + setDiceValue(Math.floor(Math.random() * 6) + 1) + }, ROLL_ANIMATION_INTERVAL_MS) + + // Create pending roll history entry (startTime will be set when transaction is sent) + setRollHistory(prev => { + const newEntry = { + value: null, + startTime: Date.now(), // Temporary placeholder + endTime: null, + isPending: true, + } + return [newEntry, ...prev] + }) + + timerIntervalRef.current = setInterval(() => { + setRollHistory(prev => { + const hasPending = prev.some(entry => entry.isPending) + if (!hasPending) { + if (timerIntervalRef.current) { + clearInterval(timerIntervalRef.current) + timerIntervalRef.current = null + } + return prev + } + setTimerTick(t => t + 1) + return prev + }) + }, 10) + + timeoutRef.current = setTimeout(() => { + setRollHistory(prev => { + if (!prev.some(entry => entry.isPending)) return prev + clearAllIntervals() + setIsRolling(false) + return prev.map(entry => entry.isPending ? { ...entry, isPending: false } : entry) + }) + }, ROLL_TIMEOUT_MS) + + try { + const randomValue = Math.floor(Math.random() * 6) + 1 + const connection = ephemeralConnectionRef.current! + const [tx, blockhash] = await Promise.all([ + ephemeralProgramRef.current.methods.rollDiceDelegated(randomValue).accounts({ + payer: playerKeypairRef.current.publicKey, + player: playerPdaRef.current, + oracleQueue: ORACLE_QUEUE, + }).transaction(), + getBlockhashAsync(connection, true) + ]) + + tx.recentBlockhash = blockhash + tx.feePayer = playerKeypairRef.current.publicKey + tx.sign(playerKeypairRef.current) + + const transactionStartTime = Date.now() + const sendPromise = connection.sendRawTransaction(tx.serialize(), { skipPreflight: true }) + + sendPromise.then((signature) => { + setRollHistory(prev => { + const updated = [...prev] + // First try to find a pending entry without a value (normal case) + let targetIndex = updated.findIndex(entry => entry.isPending && entry.value === null) + // If not found, try to find a pending entry without a signature (account updated first) + if (targetIndex === -1) { + targetIndex = updated.findIndex(entry => entry.isPending && !entry.signature) + } + // If still not found, find the most recent entry without a signature (account updated and no longer pending) + // Since entries are added to the front, the first match is the most recent + if (targetIndex === -1) { + targetIndex = updated.findIndex(entry => !entry.signature) + } + if (targetIndex !== -1) { + updated[targetIndex].startTime = transactionStartTime + updated[targetIndex].signature = signature + } + return updated + }) + }).catch((error) => { + console.error("[RollDice] Transaction send error:", error) + clearAllIntervals() + setIsRolling(false) + setRollHistory(prev => prev.filter(entry => !entry.isPending)) + }) + + fetchAndCacheBlockhash(connection, cachedEphemeralBlockhashRef).catch(console.error) + } catch (error) { + clearAllIntervals() + console.error("Error rolling dice:", error) + setIsRolling(false) + setRollHistory(prev => prev.filter(entry => !entry.isPending)) + } + }, [clearAllIntervals, isDelegated, isInitialized, isRolling, getBlockhashAsync]) + + const copyToClipboard = async (text: string) => { + try { + await navigator.clipboard.writeText(text) + setCopied(true) + setTimeout(() => setCopied(false), 2000) + } catch (error) { + console.error("Failed to copy:", error) + } + } + + const handleGetClosestValidator = useCallback(async () => { + if (!routerConnectionRef.current) { + console.error("Router connection not initialized") + return + } + try { + const result = await routerConnectionRef.current.getClosestValidator() + console.log("getClosestValidator result:", result) + } catch (error) { + console.error("Failed to get closest validator:", error) + } + }, []) + + const formatAddress = (addr: string) => { + if (!addr) return "" + return `${addr.substring(0, 8)}...${addr.substring(addr.length - 8)}` + } + + const shortenSignature = (signature: string) => { + if (!signature) return "" + return `${signature.substring(0, 4)}...${signature.substring(signature.length - 4)}` + } + + const getExplorerUrl = (signature: string) => { + if (ephemeralEndpoint) { + const encodedUrl = encodeURIComponent(ephemeralEndpoint) + return `https://explorer.solana.com/tx/${signature}?cluster=custom&customUrl=${encodedUrl}` + } + return `https://explorer.solana.com/tx/${signature}?cluster=devnet` + } + + return ( +
+
+ + {playerPda && ( + + + + + Debug + + + +
+
PDA Address
+
copyToClipboard(playerPda.toBase58())} + > + {formatAddress(playerPda.toBase58())} + {copied ? : } +
+
+ {ephemeralEndpoint && ( +
+
Ephemeral Connection
+
{ephemeralEndpoint}
+
+ )} +
+ +
+ + + +
+ +
+ {playerAccountData && ( +
+
+
Last Result
+
{playerAccountData.lastResult}
+
+
+
Roll Count
+
{playerAccountData.rollnum}
+
+
+ )} +
+
+
+
+
+ )} +
+ +
+
+
+
+ + {isDelegated ? "Delegated" : "Undelegated"} + + {!isDelegated && ( + + )} +
+ +
+ +
+ + +
+ +
+
+
+ + + + Value + Time + + + + {rollHistory.length === 0 ? ( + + + No rolls yet + + + ) : ( + rollHistory.slice(0, 10).map((entry, index) => { + const elapsed = entry.isPending + ? Date.now() - entry.startTime + : entry.endTime + ? entry.endTime - entry.startTime + : 0 + const formattedTime = `${elapsed.toString().padStart(6, '\u00A0')}ms${entry.isPending ? '...' : ''}` + return ( + + +
+ + {entry.signature && ( + + {shortenSignature(entry.signature)} + + )} +
+
+ + {formattedTime} + +
+ ) + }) + )} +
+
+
+
+
+
+
+
+ ) +} diff --git a/01-backward-compat/roll-dice/app/app/globals.css b/01-backward-compat/roll-dice/app/app/globals.css new file mode 100644 index 00000000..ac684423 --- /dev/null +++ b/01-backward-compat/roll-dice/app/app/globals.css @@ -0,0 +1,94 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +body { + font-family: Arial, Helvetica, sans-serif; +} + +@layer utilities { + .text-balance { + text-wrap: balance; + } +} + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --radius: 0.5rem; + --sidebar-background: 0 0% 98%; + --sidebar-foreground: 240 5.3% 26.1%; + --sidebar-primary: 240 5.9% 10%; + --sidebar-primary-foreground: 0 0% 98%; + --sidebar-accent: 240 4.8% 95.9%; + --sidebar-accent-foreground: 240 5.9% 10%; + --sidebar-border: 220 13% 91%; + --sidebar-ring: 217.2 91.2% 59.8%; + } + .dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55%; + --sidebar-background: 240 5.9% 10%; + --sidebar-foreground: 240 4.8% 95.9%; + --sidebar-primary: 224.3 76.3% 48%; + --sidebar-primary-foreground: 0 0% 100%; + --sidebar-accent: 240 3.7% 15.9%; + --sidebar-accent-foreground: 240 4.8% 95.9%; + --sidebar-border: 240 3.7% 15.9%; + --sidebar-ring: 217.2 91.2% 59.8%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/01-backward-compat/roll-dice/app/app/layout.tsx b/01-backward-compat/roll-dice/app/app/layout.tsx new file mode 100644 index 00000000..98f1c060 --- /dev/null +++ b/01-backward-compat/roll-dice/app/app/layout.tsx @@ -0,0 +1,20 @@ +import type { Metadata } from 'next' +import './globals.css' + +export const metadata: Metadata = { + title: 'Roll Dice', + description: 'Roll a Dice on Solana', + generator: 'v0.dev', +} + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode +}>) { + return ( + + {children} + + ) +} diff --git a/01-backward-compat/roll-dice/app/app/page.tsx b/01-backward-compat/roll-dice/app/app/page.tsx new file mode 100644 index 00000000..4b74f887 --- /dev/null +++ b/01-backward-compat/roll-dice/app/app/page.tsx @@ -0,0 +1,243 @@ +"use client" + +import { useState, useCallback, useEffect, useRef } from "react" +import Dice from "@/components/dice" +import SolanaAddress from "@/components/solana-address" +// @ts-ignore +import * as anchor from "@coral-xyz/anchor" +// @ts-ignore +import {Connection, Keypair, PublicKey, Transaction, VersionedTransaction} from "@solana/web3.js" +import { useToast } from "@/hooks/use-toast" + +// Program ID for the dice game +const PROGRAM_ID = new anchor.web3.PublicKey("8xgZ1hY7TnVZ4Bbh7v552Rs3BZMSq3LisyWckkBsNLP") + +export default function DiceRoller() { + const [diceValue, setDiceValue] = useState(1) + const [isRolling, setIsRolling] = useState(false) + const [isInitialized, setIsInitialized] = useState(false) + const [key, setKey] = useState(0) // Used to force re-render the component + const programRef = useRef(null) + const subscriptionIdRef = useRef(null) + const rollIntervalRef = useRef(null) + const { toast } = useToast() + + // Clear the rolling animation interval + const clearRollInterval = () => { + if (rollIntervalRef.current) { + clearInterval(rollIntervalRef.current) + rollIntervalRef.current = null + } + } + + const initializeProgram = async () => { + try { + // Get or create keypair + let storedKeypair = localStorage.getItem("solanaKeypair") + let keypair: Keypair + + const connection = new Connection("https://rpc.magicblock.app/devnet", "confirmed") + + if (storedKeypair) { + const secretKey = Uint8Array.from(JSON.parse(storedKeypair)) + keypair = Keypair.fromSecretKey(secretKey) + } else { + keypair = Keypair.generate() + localStorage.setItem("solanaKeypair", JSON.stringify(Array.from(keypair.secretKey))) + } + + // Create the provider + const provider = new anchor.AnchorProvider( + connection, + { + publicKey: keypair.publicKey, + signTransaction: async (transaction: T): Promise => { + // @ts-ignore + transaction.sign(keypair) + return transaction + }, + signAllTransactions: async (transactions: T[]): Promise => { + for (const tx of transactions) { + // @ts-ignore + tx.sign(keypair) + } + return transactions + }, + }, + anchor.AnchorProvider.defaultOptions() + ) + + // User + console.log("User: ", keypair.publicKey.toBase58()) + + // Fetch the IDL + const idl = await anchor.Program.fetchIdl(PROGRAM_ID, provider) + if (!idl) throw new Error("IDL not found") + + // Create the program instance + const program = new anchor.Program(idl, provider) + programRef.current = program + + console.log("Program instance created successfully: ", program.programId.toBase58()) + + // Initialize the program + const playerPk = PublicKey.findProgramAddressSync([Buffer.from("playerd"), provider.publicKey.toBytes()], program.programId)[0]; + let account = await connection.getAccountInfo(playerPk); + // @ts-ignore + if(!account || !account.data || account.data.length === 0) { + console.log("Player account not found, creating new one...") + const tx = await program.methods.initialize().rpc() + console.log("User initialized with tx:", tx) + }else{ + const ply = program.coder.accounts.decode("player", account.data) + console.log("Player account:", playerPk.toBase58(), "lastResult:", ply.lastResult) + setDiceValue(ply.lastResult) + } + + // Subscribe to account changes + if (subscriptionIdRef.current !== null) { + await connection.removeAccountChangeListener(subscriptionIdRef.current); + } + + subscriptionIdRef.current = connection.onAccountChange( + playerPk, + // @ts-ignore + (accountInfo) => { + const player = program.coder.accounts.decode("player", accountInfo.data) + console.log("Player account changed:", player) + setDiceValue(player.lastResult) + setIsRolling(false) + clearRollInterval() + }, + {commitment: "processed"} + ); + + // Set initialization as successful + setIsInitialized(true) + + } catch (error) { + console.error("Failed to initialize program:", error) + setIsInitialized(false) + toast({ + title: "Error", + description: "Failed to initialize dice program", + variant: "destructive", + }) + } + } + + useEffect(() => { + initializeProgram() + + // Cleanup function + return () => { + clearRollInterval() + // Clean up subscription + if (subscriptionIdRef.current !== null) { + const connection = new Connection("https://rpc.magicblock.app/devnet", "confirmed") + connection.removeAccountChangeListener(subscriptionIdRef.current).catch(console.error) + } + } + }, [toast, key]) // Add key as dependency to re-run when key changes + + const handleBalanceChange = useCallback((newBalance: number) => { + console.log("Balance changed:", newBalance) + + // If not initialized, try to initialize again or force component reload + if (!isInitialized) { + console.log("Not initialized, attempting to reinitialize...") + + // Option 1: Call initializeProgram again + initializeProgram() + + // Option 2: Force component reload by changing the key + setKey(prevKey => prevKey + 1) + + toast({ + title: "Reinitializing", + description: "Balance changed, attempting to reinitialize the program", + }) + } + }, [isInitialized, toast]) + + const handleRollDice = useCallback(async () => { + if (isRolling || !isInitialized) return; + + setIsRolling(true) + + // Clear any existing interval + clearRollInterval() + + if (programRef.current) { + try { + const tx = await programRef.current.methods.rollDice(Math.floor(Math.random() * 6) + 1).rpc() + console.log("Dice rolled on-chain with tx:", tx) + + toast({ + title: "Dice Rolled", + description: `Result: TX: ${tx.slice(0, 8)}...`, + }) + + // Simulate rolling animation by changing values rapidly + rollIntervalRef.current = setInterval(() => { + setDiceValue(Math.floor(Math.random() * 6) + 1) + }, 100) + + // Add a timeout to stop rolling after 10 seconds if still rolling + setTimeout(() => { + if (isRolling) { + console.log("Rolling timeout reached (10s), stopping animation") + setIsRolling(false) + clearRollInterval() + toast({ + title: "Notice", + description: "Dice roll is taking longer than expected. Check transaction status in explorer.", + variant: "destructive", + }) + } + }, 10000) + + + } catch (error) { + console.error("Error rolling dice:", error) + toast({ + title: "Error", + description: "Failed to roll dice", + variant: "destructive", + }) + setIsRolling(false) + clearRollInterval() + } + } else { + console.error("Program not initialized") + toast({ + title: "Error", + description: "Program not initialized", + variant: "destructive", + }) + setIsRolling(false) + } + }, [isRolling, isInitialized, toast]) + + return ( +
+
+ +
+ +
+

Dice Roller

+
+ +
+ +
+
+ ) +} diff --git a/01-backward-compat/roll-dice/app/components.json b/01-backward-compat/roll-dice/app/components.json new file mode 100644 index 00000000..d9ef0ae5 --- /dev/null +++ b/01-backward-compat/roll-dice/app/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/01-backward-compat/roll-dice/app/components/dice.tsx b/01-backward-compat/roll-dice/app/components/dice.tsx new file mode 100644 index 00000000..61eb10da --- /dev/null +++ b/01-backward-compat/roll-dice/app/components/dice.tsx @@ -0,0 +1,117 @@ +"use client" +import { cn } from "@/lib/utils" + +interface DiceProps { + value: number + isRolling: boolean + onClick: () => void +} + +export default function Dice({ value, isRolling, onClick }: DiceProps) { + // Ensure value is between 1 and 6 + const safeValue = Math.min(Math.max(1, value), 6) + + return ( +
+
+ {safeValue === 1 && ( +
+
+
+ )} + + {safeValue === 2 && ( +
+
+
+
+
+
+
+
+ )} + + {safeValue === 3 && ( +
+
+
+
+
+
+
+
+
+
+
+ )} + + {safeValue === 4 && ( +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )} + + {safeValue === 5 && ( +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )} + + {safeValue === 6 && ( +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )} +
+
+ ) +} + diff --git a/01-backward-compat/roll-dice/app/components/solana-address.tsx b/01-backward-compat/roll-dice/app/components/solana-address.tsx new file mode 100644 index 00000000..f82bb92a --- /dev/null +++ b/01-backward-compat/roll-dice/app/components/solana-address.tsx @@ -0,0 +1,116 @@ +"use client" + +import { useState, useEffect } from "react" +import { Connection, PublicKey, LAMPORTS_PER_SOL, Keypair } from "@solana/web3.js" +import { Copy, Check } from "lucide-react" +import { cn } from "@/lib/utils" + +export default function SolanaAddress({ onBalanceChange }: { onBalanceChange?: (balance: number) => void }) { + const [address, setAddress] = useState("") + const [balance, setBalance] = useState(null) + const [copied, setCopied] = useState(false) + const [isLoading, setIsLoading] = useState(true) + const [lastUpdated, setLastUpdated] = useState(null) + + useEffect(() => { + const getOrCreateAddress = async () => { + try { + let storedKeypair = localStorage.getItem("solanaKeypair") + let keypair: Keypair + + if (storedKeypair) { + const secretKey = Uint8Array.from(JSON.parse(storedKeypair)) + keypair = Keypair.fromSecretKey(secretKey) + } else { + keypair = Keypair.generate() + localStorage.setItem("solanaKeypair", JSON.stringify(Array.from(keypair.secretKey))) + } + + const publicKeyString = keypair.publicKey.toString() + setAddress(publicKeyString) + await fetchBalance(publicKeyString) + setIsLoading(false) + + const intervalId = setInterval(() => { + fetchBalance(publicKeyString) + }, 10000) + + return () => clearInterval(intervalId) + } catch (error) { + console.error("Error getting/creating Solana address:", error) + setIsLoading(false) + } + } + + const cleanup = getOrCreateAddress() + return () => { + if (cleanup && typeof cleanup === 'function') { + // @ts-ignore + cleanup() + } + } + }, []) + + const fetchBalance = async (pubkeyString: string) => { + try { + const connection = new Connection("https://rpc.magicblock.app/devnet", "processed") + const pubkey = new PublicKey(pubkeyString) + const balanceInLamports = await connection.getBalance(pubkey) + const balanceInSOL = balanceInLamports / LAMPORTS_PER_SOL + if (balanceInSOL < 0.1){ + // Request airdrop of 0.1 SOL + await connection.requestAirdrop(pubkey, 100000000 ) + } + + // Notify parent component about balance change + if (onBalanceChange && (balance !== balanceInSOL)) { + onBalanceChange(balanceInSOL) + } + + setBalance(balanceInSOL) + setLastUpdated(new Date()) + } catch (error) { + console.error("Error fetching balance:", error) + setBalance(null) + } + } + + const copyToClipboard = async () => { + try { + await navigator.clipboard.writeText(address) + setCopied(true) + setTimeout(() => setCopied(false), 2000) + } catch (error) { + console.error("Failed to copy:", error) + } + } + + const formatAddress = (addr: string) => { + if (!addr) return "" + return `${addr.substring(0, 4)}...${addr.substring(addr.length - 4)}` + } + + if (isLoading) { + return
Loading address...
+ } + + return ( +
+
+ {formatAddress(address)} + {copied ? : } +
+
+ {balance === null ? "Balance: --" : `${balance.toFixed(4)} SOL`} +
+
+ ) +} diff --git a/01-backward-compat/roll-dice/app/components/theme-provider.tsx b/01-backward-compat/roll-dice/app/components/theme-provider.tsx new file mode 100644 index 00000000..55c2f6eb --- /dev/null +++ b/01-backward-compat/roll-dice/app/components/theme-provider.tsx @@ -0,0 +1,11 @@ +'use client' + +import * as React from 'react' +import { + ThemeProvider as NextThemesProvider, + type ThemeProviderProps, +} from 'next-themes' + +export function ThemeProvider({ children, ...props }: ThemeProviderProps) { + return {children} +} diff --git a/01-backward-compat/roll-dice/app/components/ui/accordion.tsx b/01-backward-compat/roll-dice/app/components/ui/accordion.tsx new file mode 100644 index 00000000..24c788c2 --- /dev/null +++ b/01-backward-compat/roll-dice/app/components/ui/accordion.tsx @@ -0,0 +1,58 @@ +"use client" + +import * as React from "react" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import { ChevronDown } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Accordion = AccordionPrimitive.Root + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AccordionItem.displayName = "AccordionItem" + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + svg]:rotate-180", + className + )} + {...props} + > + {children} + + + +)) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +
{children}
+
+)) + +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/01-backward-compat/roll-dice/app/components/ui/alert-dialog.tsx b/01-backward-compat/roll-dice/app/components/ui/alert-dialog.tsx new file mode 100644 index 00000000..25e7b474 --- /dev/null +++ b/01-backward-compat/roll-dice/app/components/ui/alert-dialog.tsx @@ -0,0 +1,141 @@ +"use client" + +import * as React from "react" +import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog" + +import { cn } from "@/lib/utils" +import { buttonVariants } from "@/components/ui/button" + +const AlertDialog = AlertDialogPrimitive.Root + +const AlertDialogTrigger = AlertDialogPrimitive.Trigger + +const AlertDialogPortal = AlertDialogPrimitive.Portal + +const AlertDialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName + +const AlertDialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + +)) +AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName + +const AlertDialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +AlertDialogHeader.displayName = "AlertDialogHeader" + +const AlertDialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +AlertDialogFooter.displayName = "AlertDialogFooter" + +const AlertDialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName + +const AlertDialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogDescription.displayName = + AlertDialogPrimitive.Description.displayName + +const AlertDialogAction = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName + +const AlertDialogCancel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel, +} diff --git a/01-backward-compat/roll-dice/app/components/ui/alert.tsx b/01-backward-compat/roll-dice/app/components/ui/alert.tsx new file mode 100644 index 00000000..41fa7e05 --- /dev/null +++ b/01-backward-compat/roll-dice/app/components/ui/alert.tsx @@ -0,0 +1,59 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const alertVariants = cva( + "relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground", + { + variants: { + variant: { + default: "bg-background text-foreground", + destructive: + "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +const Alert = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes & VariantProps +>(({ className, variant, ...props }, ref) => ( +
+)) +Alert.displayName = "Alert" + +const AlertTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +AlertTitle.displayName = "AlertTitle" + +const AlertDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +AlertDescription.displayName = "AlertDescription" + +export { Alert, AlertTitle, AlertDescription } diff --git a/01-backward-compat/roll-dice/app/components/ui/aspect-ratio.tsx b/01-backward-compat/roll-dice/app/components/ui/aspect-ratio.tsx new file mode 100644 index 00000000..d6a5226f --- /dev/null +++ b/01-backward-compat/roll-dice/app/components/ui/aspect-ratio.tsx @@ -0,0 +1,7 @@ +"use client" + +import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" + +const AspectRatio = AspectRatioPrimitive.Root + +export { AspectRatio } diff --git a/01-backward-compat/roll-dice/app/components/ui/avatar.tsx b/01-backward-compat/roll-dice/app/components/ui/avatar.tsx new file mode 100644 index 00000000..51e507ba --- /dev/null +++ b/01-backward-compat/roll-dice/app/components/ui/avatar.tsx @@ -0,0 +1,50 @@ +"use client" + +import * as React from "react" +import * as AvatarPrimitive from "@radix-ui/react-avatar" + +import { cn } from "@/lib/utils" + +const Avatar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Avatar.displayName = AvatarPrimitive.Root.displayName + +const AvatarImage = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AvatarImage.displayName = AvatarPrimitive.Image.displayName + +const AvatarFallback = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName + +export { Avatar, AvatarImage, AvatarFallback } diff --git a/01-backward-compat/roll-dice/app/components/ui/badge.tsx b/01-backward-compat/roll-dice/app/components/ui/badge.tsx new file mode 100644 index 00000000..f000e3ef --- /dev/null +++ b/01-backward-compat/roll-dice/app/components/ui/badge.tsx @@ -0,0 +1,36 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", + secondary: + "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: + "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", + outline: "text-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( +
+ ) +} + +export { Badge, badgeVariants } diff --git a/01-backward-compat/roll-dice/app/components/ui/breadcrumb.tsx b/01-backward-compat/roll-dice/app/components/ui/breadcrumb.tsx new file mode 100644 index 00000000..60e6c96f --- /dev/null +++ b/01-backward-compat/roll-dice/app/components/ui/breadcrumb.tsx @@ -0,0 +1,115 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { ChevronRight, MoreHorizontal } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Breadcrumb = React.forwardRef< + HTMLElement, + React.ComponentPropsWithoutRef<"nav"> & { + separator?: React.ReactNode + } +>(({ ...props }, ref) =>